P粉4764755512023-08-30 12:45:43
3 番目のオプションは、「Policy」テーブルを作成し、次に「SectionsMain」テーブルを作成して、さまざまな種類のセクションに共通するすべてのフィールドを保存することです。次に、セクションのタイプごとに、一般的ではないフィールドのみを含む追加のテーブルを作成します。
どれが最適かを決定するのは、主にフィールドの数と SQL の記述方法によって決まります。それらはすべて機能します。フィールドが数個しかない場合は、おそらく #1 を使用するでしょう。 「多くの」分野については、私は 2 位か 3 位を好みます。
P粉7225212042023-08-30 11:57:12
@Bill Karwin 著書 SQL アンチパターン の中で、SQL Entity Attribute Value アンチパターンを提案しました。簡単な概要は次のとおりです:
最初のオプションのように 1 つのテーブルを使用するのが、おそらく最も単純な設計です。前述したように、多くのサブタイプ固有のプロパティには、これらのプロパティが適用されない行に NULL 値を与える必要があります。このモデルを使用すると、次のようなポリシー テーブルが作成されます:
リーリー設計をシンプルに保つことは利点ですが、このアプローチの主な問題は次のとおりです。
新しいサブタイプを追加するときは、これらの新しいオブジェクトを説明するプロパティに対応するようにテーブルを変更する必要があります。サブタイプが多数ある場合、またはサブタイプを定期的に追加する予定がある場合、これはすぐに問題になる可能性があります。
どのプロパティがどのサブタイプに属するかを定義するメタデータがないため、データベースはどのプロパティが適用され、どのプロパティが適用されないかを強制することができません。
強制する必要があるサブタイプ属性に NOT NULL
を強制することもできません。これはアプリケーションで処理する必要がありますが、これは通常理想的ではありません。
継承の問題を解決するもう 1 つの方法は、サブタイプごとに新しいテーブルを作成し、各テーブル内のすべての共通プロパティを繰り返すことです。例えば:### リーリー
この設計は、単一テーブルのアプローチで特定された問題を基本的に解決します:
NOT NULL 経由で強制できるようになりました。
vehicle_reg_no フィールドなど、特定のサブタイプに不適切な属性を設定するリスクもありません。
type 属性は必要ありません。タイプはメタデータ: テーブル名によって定義されるようになりました。
干 ではありません。
UNION が必要になります。
リーリー
新しいサブタイプを追加するには、サブタイプごとにUNION ALL を追加して上記のクエリを変更する必要があることに注意してください。これを忘れると、アプリケーションで簡単にエラーが発生する可能性があります。
で言及した解決策です。すべてのパブリック プロパティを含む基本クラスのテーブルを作成します。次に、サブタイプごとに特定のテーブルを作成し、その主キーがベース テーブルとしても機能します。例: ### リーリー このソリューションは、他の 2 つの設計で見つかった問題を解決します:
によって強制できます。
type
属性は必要ありません。
現在、パブリック プロパティはサブタイプ固有のプロパティと混合されなくなりました。
ようやくドライな状態を維持できるようになりました。テーブルの作成では、各サブタイプ テーブルの共通プロパティを複製する必要はありません。
id
の自動インクリメント ポリシーの管理は、各サブタイプ テーブルが個別に生成するのではなく、ベース テーブルによって処理できるため、より簡単になります。
すべてのストラテジ (サブタイプに関係なく) の検索が非常に簡単になりました。UNION
は必要ありません。SELECT * FROM Strategy
だけです。
ほとんどの場合、クラス テーブル方式が最も適切だと思います。
これら 3 つのモデルの名前は、Martin Fowler という書籍 Enterprise Application Architecture Patterns に由来しています。