更新された回答
私の最初の回答は、アクセサリを「共有」する必要があるという点を見逃していました。問題は、モデルごとに個別のテーブルを用意することでした。私の誤解でした。
アクセサリを 2 つ以上のモデルと「共有」する必要がある場合、それは多対多の関係を意味します。あれは、
このような多対多の関係を解決するには、別のテーブルを追加model_id
し、テーブルから列を削除しaccessories
ます。
accessory
表の行は、と の間の関係を表しますmodel
。このテーブルには、テーブルへの外部キー( model_id
) とmodels
テーブルへの外部キー( accessory_id
) がありaccessories
ます。
したがって、accessories
テーブルは利用可能なすべてのオプションのリストになります。
accessories
id description
-- --------------------
1 color option black
2 color option blazing red
3 color option burnt umber
4 color option chocolate
5 color option deep red
6 door option 1
7 door option 2
8 good blower
9 quieter blower
10 fancy legs
11 fancy dancy legs
モデル 101 にアクセサリー (黒とバーント アンバーのカラー オプション、ファンシー レッグ) がある場合、model_accessories テーブルの行は次のようになります。
model_accessories
model_id accessory_id
-------- ------------
101 1
101 3
101 10
model_id 101 はモデル テーブルの id 列への参照であり、accessory_id は accessories テーブルの id 列への参照です。
モデル 102 は、これらの同じアクセサリの一部を共有できますが、別のアクセサリを使用することもできます。
102 1
102 2
102 3
102 4
102 11
通常、 の組み合わせには UNIQUE 制約が設定されている(model_id, accessory_id)
ため、同じアクセサリが 2 回 (またはそれ以上) 関連付けられることはありません。
場合によっては、関係に属性があります。たとえば、アクセサリの定価はモデルによって異なる場合があります。これをサポートするために、関係テーブルに属性列 (list_price
を追加できます。model_accessories
外部キーのターゲットは必ずしも別のテーブルである必要はありません。これらは両方とも同じproducts
テーブルを参照できます。(これが、例でテーブル名としてmodel
andを使用することにした理由です。)accessories
両方models
とも であると見なす場合、これらは同じテーブルに格納できます。accessories
products
products
したがって、products
テーブルは次のようになります。
products
id description
--- --------------------
101 trail blazer
102 cabin inferno
103 cottage conflagration
1 color option black
2 color option blazing red
3 color option burnt umber
4 color option chocolate
5 color option deep red
6 door option 1
7 door option 2
8 good blower
9 quieter blower
10 fancy legs
11 fancy dancy legs
model_accessories
テーブルは同じままですが、そのテーブルの両方の列が列への外部キーになりますproducts.id
。
元の回答(反対票、理由はありませんが、おそらく「共有」アクセサリに関するポイントを逃したためです。以下の回答のアプローチは、各アクセサリが正確に1つのモデルに関連付けられていることを前提としています。OPはmodel_101_accessoriesテーブルを作成することを意味していると思いました、何も共有されていない model_102_accessories テーブル。
いいえ、アクセサリをテーブルの列ではなく行として格納する場合は、別のテーブルは必要ありません。
を表に含めてmodel_id
、accessories
どのアクセサリがどのモデルに適合するかがわかるようにします。
model_accessories
id model_id description
-- -------- --------------------
1 101 color option black
2 101 door option 1
3 101 good blower
4 101 quieter blower
5 102 color option 1
6 102 color option 2
7 102 color option 3
8 102 color option 4
9 102 door option 1
10 102 door option 2
11 102 fancy legs
12 102 fancy dancy legs
すべてのオプションが 1 つの表にまとめられています。ただし、行where model_id=101
は製品モデルに関連付けられていますid=101
。行where model_id=102
は、 の製品モデル行に関連付けられていますid=102
。
外部キー制約は、accessories.model_id
列で許可される唯一の値が列で見つかった値であることを強制できmodel.id
ます。