ブール属性 (「フラグ付き」属性など) に基づいてフィルター処理するデータベース テーブルがあるとします。テーブルに「フラグ付き」属性を追加するだけのほうがよいですか、それともベーステーブルへの外部キーを持つ新しいテーブルを作成する方がよいですか? 長所と短所は何ですか?
4 に答える
1だけで十分な場合は、単純なフィールドを追加するだけです。
ただし、インデックスの付け方には注意が必要です。値が深刻に歪んでいない限り2、インデックスの選択性とクラスタリング ファクターがひどいものになってしまいます3。
他のフィールドと組み合わせてフラグでフィルタリングする場合は、複合インデックスを作成します。これにより、適切に選択される可能性がはるかに高くなります。
1つまり、可能な 2 つのブール値のそれぞれを何らかの形で「説明」または「補強」する追加のデータは必要ありません。
2 1 つの値が非常に少数派 ( を含む行の数が を含むfalse
行の数よりもはるかに少ないtrue
、またはその逆) であり、たまたまその値だけをフィルター処理する場合。
3リンクは Oracle 用ですが、一般原則はすべての DBMS に適用されます。
4インデックスが存在する場合でも、適切な DBMS が自動的に行うことはどれですか。仮想的な「ばかげた」DBMS は、やみくもにインデックスを使用するだけで、完全なテーブル スキャンよりもさらにパフォーマンスが低下します。
このフラグ自体に属性がある場合、または再利用可能な場合は、別のテーブルとして作成することをお勧めします。ただし、行を真/偽としてマークするだけの場合は、ブール列を作成するだけです(時間と労力を節約できます)
テーブルに列を追加するだけで、より良く簡単になります..ビットマップインデックスを作成して、WHEREでこの列を使用するとクエリを高速化します
場合によります。私自身は、値が実際にはテーブル/リレーションに関連していない場合に、新しいテーブルを追加することを好みます。
この良い例は、注文を表すテーブルがあり、どの注文が印刷されたかを追跡したい場合です。注文に外部キーを持つprinted_ordersという新しいテーブルを追加します。
create table printed_orders (
order_id int primary key references order(order_id)
);
印刷されているかどうかは、実際には注文の一部ではなく、システム/ビジネス ルールの一部です。