データベーステーブルに多数のブール値を格納する最良の方法は何ですか?
ブール値ごとに列を作成する必要がありますか、それともより最適な方法がありますか?
従業員テーブル
IsHardWorking
IsEfficient
IsCrazy
IsOverworked
IsUnderpaid
...etc.
データベーステーブルに多数のブール値を格納する最良の方法は何ですか?
ブール値ごとに列を作成する必要がありますか、それともより最適な方法がありますか?
従業員テーブル
IsHardWorking
IsEfficient
IsCrazy
IsOverworked
IsUnderpaid
...etc.
各ブール値の列を持つことに問題はありません。ただし、将来の拡張を予測し、テーブルをブール値のみに使用する場合は、VARIABLE 列と VALUE 列を含む 2 列のテーブルを使用し、ブールごとに行を作成します。
大多数の従業員が大規模なサンプル サイズで同じ値を持つ場合は、階層を定義して、標準を表す既定値を確立し、必要に応じて従業員ごとに上書きできるようにする方が効率的です。
従業員テーブルには、これらの属性が格納されなくなりました。代わりに、属性の定義テーブルを作成します。
| ATTRIBUTE_ID | DESCRIPTION | DEFAULT |
| 1 | Is Hard Working | 1 |
| 2 | Is Overpaid | 0 |
次に、属性を従業員に結合する 2 番目のテーブル:
| EMPLOYEE_ID | ATTRIBUTE_ID | OVERRIDE |
| 2 | 2 | 1 |
従業員が 2 人の場合、ID 1 の従業員にはオーバーライド エントリがないため、デフォルトの属性値を継承します (勤勉であり、過払いではありません)。ただし、従業員 2 は属性 2 のオーバーライドを持っています - 過払いであり、したがって両方です。働き者で過払い。
整合性のために、上書きテーブルの EMPLOYEE_ID 列と ATTRIBUTE_ID 列に一意の制約を設定して、従業員ごとに 1 回だけ属性を上書きできるようにすることができます。
考慮すべきこと: これらのブール値をどのくらいの頻度で追加/変更/削除しますか? それらが変更される可能性が低い場合は、おそらくそれらを個別の列として使用することをお勧めします。多くのデータベースでは、特に行内で隣接している場合は、おそらくそれらが圧縮されるため、効率的に格納されます。
一方、これらのブール値を時々追加/変更/削除したい場合は、次のようなものを使用することをお勧めします (PostgreSQL 主義と見掛け倒しの名前を許してください)。
CREATE TABLE employee_qualities (
id SERIAL8 PRIMARY KEY,
label TEXT UNIQUE
);
CREATE TABLE employee_employee_qualities (
employee_id INT8 REFERENCES employee (id),
quality_id INT8 REFERENCES employee_qualities (id),
UNIQUE (employee_id, quality_id)
);
それぞれの列は、ビジネス要件を最もよく表しています。bool の束を 1 つの int 列に結合し、ビット マスクを使用して値を読み取ることもできますが、これは不必要に複雑に思えます。これは、ハイエンドのパフォーマンスが必要な場合にのみ検討します。
また、SQLサーバーを使用している場合、最大8ビットのフィールドが内部的に単一のintに結合されるため、パフォーマンスの問題はすでに完了しています。(他のデータベースがこれを行うかどうかはわかりません。)