3

最初のデータベースを設計しようとしていますが、データベースに保持したいさまざまな「フラグ」がかなりあることがわかりました。

Active      # Shows whether the item submission has been completed
Indexed     # Shows whether the item has been indexed
Reminded        # Shows whether the “expiring email” has been sent to the user
Error       # Shows whether there is an error with the submission
Confirmation    # Shows whether the confirmation email has been sent

これらのブールフィールドを持つ以外に、これらの詳細を保存する賢い方法はありますか? データベースのステータスグループの下にこれらがあり、すべての意味合いのID(32)があり、それにリンクするだけかどうか疑問に思っていました。

4

5 に答える 5

2

特に理由がない限り、これら 5 つのブール (またはビット) 列を項目テーブルに追加することをお勧めします。

于 2013-01-31T14:18:40.440 に答える
0

私の経験では、ステータス列は2つ以上の状態に進化することがよくあります。したがってsmallint、利便性と単純さのために、ステータスごとにaを使用します。

ただし、スペースを節約することが目的の場合は、smallintキャストを使用してすべてのステータスを1つに保存し、bitステータスを個別にまたは全体として操作できます。

create table t (status smallint);

保存10010してからsmallintにキャストするには:

insert into t (status) values (b'10010'::int::smallint);

すべてのステータスを一覧表示します。

select status::int::bit(5) from t;
 status 
--------
 10010

3番目のステータスを設定するには、:を使用しますbitwise or

update t set status = (status::integer::bit(5) | b'00100')::integer::smallint;
select status::int::bit(5) from t;
 status 
--------
 10110

そのステータスの設定を解除するには、:を使用しbitwise andます

update t set status = (status::integer::bit(5) & b'11011')::integer::smallint;
select status::int::bit(5) from t;
 status 
--------
 10010

3番目のステータスが設定されている行を取得するには:

select status
from t
where substring(status::integer::bit(5) from 3 for 1) = '1'

変換を単純化する関数を書くことができます。

于 2013-01-31T15:36:45.010 に答える
0

それは、含意のリストがどれほど不変であるかに依存します。

あなたが言及した5つだけがある場合は、5つのフラグ列を追加するだけです. 考えられる意味のリストが将来変更される可能性がある場合は、メイン テーブルの各行に現在適用されている意味のリストを含む別のテーブルを、1 対多の関係で作成する方が安全かもしれません。

于 2013-01-31T14:21:48.233 に答える
0

それらが「単なる」フラグである場合は、ブール型の列としてテーブルに格納します。

スペースが本当にタイトでない限り、Clodoaldoのソリューションに反対することをお勧めします-この質問を参照してください。

あなたが言及した列には「ビジネス上の重要性」があるようです。つまり、「インデックス付け」を保存するのに十分ではないかもしれませんが、アイテムがインデックス付けされた日付も含まれています。状態の組み合わせを制限したり、シーケンスに規則を課したりする必要がある場合があります (エラー状態の間は完了できません)。その場合、履歴などを保存するために「item_status」テーブルを実装することをお勧めします。

この場合、スキーマは次のようになります。

ITEM
---------
item_id
....

STATUS
---------
status_id
description

ITEM_STATUS
--------------
item_id
status_id
date

アイテムのステータスが変わるたびに、新しい行を ITEM_STATUS テーブルに挿入します。現在のステータスは、そのアイテムの最新の日付を含む行です。

于 2013-01-31T15:55:57.723 に答える