4

ブール属性 (「フラグ付き」属性など) に基づいてフィルター処理するデータベース テーブルがあるとします。テーブルに「フラグ付き」属性を追加するだけのほうがよいですか、それともベーステーブルへの外部キーを持つ新しいテーブルを作成する方がよいですか? 長所と短所は何ですか?

4

4 に答える 4

2

1だけで十分場合は、単純なフィールドを追加するだけです。

ただし、インデックスの付け方には注意が必要です。値が深刻に歪んでいない限り2、インデックスの選択性とクラスタリング ファクターひどいものになってしまいます3

他のフィールドと組み合わせてフラグでフィルタリングする場合は、複合インデックスを作成します。これにより、適切に選択される可能性がはるかに高くなります。


1つまり、可能な 2 つのブール値のそれぞれを何らかの形で「説明」または「補強」する追加のデータは必要ありません。

2 1 つの値が非常に少数派 ( を含む行の数が を含むfalse行の数よりもはるかに少ないtrue、またはその逆) であり、たまたまその値だけをフィルター処理する場合。

3リンクは Oracle 用ですが、一般原則はすべての DBMS に適用されます。

4インデックスが存在する場合でも、適切な DBMS が自動的に行うことはどれですか。仮想的な「ばかげた」DBMS は、やみくもにインデックスを使用するだけで、完全なテーブル スキャンよりもさらにパフォーマンスが低下します。

于 2013-02-25T10:59:14.263 に答える
0

このフラグ自体に属性がある場合、または再利用可能な場合は、別のテーブルとして作成することをお勧めします。ただし、行を真/偽としてマークするだけの場合は、ブール列を作成するだけです(時間と労力を節約できます)

于 2013-02-25T08:03:54.447 に答える
0

テーブルに列を追加するだけで、より良く簡単になります..ビットマップインデックスを作成して、WHEREでこの列を使用するとクエリを高速化します

于 2013-02-25T13:49:57.107 に答える
0

場合によります。私自身は、値が実際にはテーブル/リレーションに関連していない場合に、新しいテーブルを追加することを好みます。

この良い例は、注文を表すテーブルがあり、どの注文が印刷されたかを追跡したい場合です。注文に外部キーを持つprinted_ordersという新しいテーブルを追加します。

create table printed_orders (
  order_id int primary key references order(order_id)
);

印刷されているかどうかは、実際には注文の一部ではなく、システム/ビジネス ルールの一部です。

于 2013-11-07T15:04:47.350 に答える