複数の交差テーブルと複数の結合
私はテーブル間に階層関係があり、子は親IDを参照する外部キーを持っています(id
各テーブルの主キーであると想定しています)。
Department
多くいるCategory Group
のは
Category Group
、多くの持っているCategory
(-ies)を
Category
多く持っているSub-Category
(-ies)を
Sub-Category
多く持っているAttribute
のを。
これで、Attribute
sを除くこれらすべてのエンティティはオプションです。階層カスケードドロップダウンベースのUIで何も選択しない場合Attribute
は、すべてDepartment
のsに属するDepartment
を表示する必要があります。を選択するだけの場合はAttribute
、それに属するすべてCategory Group
のに属しDepartment
ます。
明らかに、それを実装する1つのオプションは、に到達するためにすべてのテーブル間で内部結合を行うことですAttribute
。たとえば、何も選択されていない場合は、次のようになります。
Department
内部結合Category Group
内部結合Category
内部結合Sub-Category
内部結合Attribute
は、すべての部門に属するすべての属性を表示します。
私の頭の中の他の考えは、交差/関係マッピングテーブル
DepartmentAttributeRelation
を持っていることです-これには、への外部キーがDepartment
ありAttribute
、
CategoryGroupAttributeRelation
への外部キーがCategoryGroup
ありますAttribute
。
これにより、Attribute
任意のエンティティを指定してに直接検索を行うことができます。
私の質問は-上記の2番目のアプローチに欠点はありますか、それともこれを解決するためのより良いアプローチはありますか?
回答
内部結合の問題は何ですか?ビューを作成して、醜いマルチ結合クエリを再度表示または作成する必要がないようにします。
代替案の最初のそしてより重要な欠点は、矛盾が生じる可能性があることです。つまり、それらの「結合テーブル」に、潜在的に矛盾する可能性のあるデータがある可能性があります。つまり、挿入の異常が発生する可能性があります。これらの異常が発生しないようにコードを作成する必要があります。
ただし、階層が永遠に、たとえば4レベルの深さになると思われる場合は、サブサブカテゴリが必要になり、固定レベルの階層設計が機能しなくなったときに要件が発生することがあります。階層のレベルの深さが不明であり、「リーフ」要素のみが属性を持つことができる将来性のあるソリューションは、別の質問と別の回答の問題です。