Entity-Attribute-Value を実装しています アンチパターン。これはリレーショナルではないため、正規化されたデータベース設計にはなりません。
代わりに私が提案するのは、クラス テーブルの継承 です。 設計パターン:
- すべての種に共通する特性を含む、生物のテーブルを 1 つ作成する <リ>
その種に固有のプロパティを含む、種ごとに 1 つのテーブルを作成します。これらの各テーブルは、Organisms と 1 対 1 の関係にありますが、各プロパティは独自の列に属しています。
<プレ> ____________________ ____________________
| Organisms | | Species |
|--------------------| |--------------------|
|OrganismId (int, PK)| |SpeciesId (int, PK) |
|SpeciesId (int, FK) |∞---------1|Name (varchar) |
|Name (varchar) | |____________________|
|____________________|
1
|
|
1
______________________
| HumanOrganism |
|----------------------|
|OrganismId (int, FK) |
|Sex (enum) |
|Race (int, FK) |
|EyeColor (int, FK) |
|.... |
|______________________|
プレ>
これは、多くのテーブルを作成することを意味しますが、これは、関係的に正しい方法でプロパティを格納することの多くの実際的な利点とのトレードオフと考えてください。
- すべてを自由形式の varchar として扱うのではなく、SQL データ型を適切に使用できます。
- 制約またはルックアップ テーブルを使用して、定義済みの一連の値によって特定のプロパティを制限できます。
- プロパティを必須 (つまり、NOT NULL) にしたり、他の制約を使用したりできます。
- データとインデックスがより効率的に保存されます。
- クエリの作成と RDBMS の実行が容易になります。
この設計の詳細については、Martin Fowler の著書 エンタープライズ アプリケーション アーキテクチャのパターン を参照してください。 、または私のプレゼンテーション SQL における実用的なオブジェクト指向モデル> 、または私の著書 SQL アンチパターン:データベース プログラミングの落とし穴の回避 .