2

既存のコンテンツ オン ページ小売 Web サイト用に MySQL データベースを設計しようとしています。さまざまなメーカーの複数の製品があり、同じアクセサリを共有するものもありますが、製品ごとに異なるアクセサリ オプションがあります。アクセサリーのTABLE(s)のデザインに行き詰まっています

製品 1 には 23 のアクセサリがあります - 9 つのカラー オプション、4 つのドア オプション、4 つの脚オプション、4 つの鍋敷きオプション、1 つの可変速ブロワー オプション、1 つの防火スクリーン オプション。

製品 2 には、4 つのドア オプション、4 つの脚オプション、1 つの可変速送風機オプション、1 つの防火スクリーン オプションがあります (これらのオプションは製品 1 と共有されます)。製品 2 には、脚アダプター オプション、台座オプション、および 2 つの灰皿オプションもあります。

製品 3 には 27 のアクセサリがあります - 9 つのカラー オプション、8 つのドア オプション、4 つの脚オプション、4 つのトリベット オプション、1 つの可変速ブロワー オプション、および 1 つの防火スクリーン オプション。色のオプションは同じ接尾辞を共有しますが、接頭辞が異なります (prod1.BLUE / prod3.BLUE)。脚のオプションはすべての製品で同じです。送風機と防火スクリーンは製品 1 とは異なります。

モデルごとに別のアクセサリ テーブルが必要ですか? 事前に支援に感謝します。もし私が間違いを犯した場合は、悪いことです。これは私の最初の質問です。簡単にお願いします。:)

4

2 に答える 2

6

製品ごとに個別のテーブルは必要ありません。多対多結合について説明します。これは通常、アクセサリを製品/モデルに結合できるテーブルを使用して実装されます。各製品とアクセサリの ID があると仮定します。

| product | accessory |
| 5       | 4         |
| 5       | 5         |
| 5       | 6         |
| 5       | 7         |
| 6       | 4         |
| 6       | 5         |
| 6       | 6         |
| 6       | 7         |
| 6       | 8         |
| 6       | 9         |

この表では、製品 5 (iPad 2 など) にアクセサリ 4、5、6、および 7 (カバー) を含めることができます。これらのカバーの設計方法により、製品 6 (iPad 3) でも機能します。アクセサリ 8 と 9 は製品 6 専用に設計されており、製品 5 では動作しません。

于 2013-07-19T18:42:26.517 に答える
2

更新された回答

私の最初の回答は、アクセサリを「共有」する必要があるという点を見逃していました。問題は、モデルごとに個別のテーブルを用意することでした。私の誤解でした。

アクセサリを 2 つ以上のモデルと「共有」する必要がある場合、それは多対多の関係を意味します。あれは、

  • モデルには、1 つまたは複数のアクセサリを含めることができません。

  • アクセサリは、ゼロ 1 つまたは複数のモデルに関連付けることができます。

このような多対多の関係を解決するには、別のテーブルを追加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テーブルを参照できます。(これが、例でテーブル名としてmodelandを使用することにした理由です。)accessories

両方modelsとも であると見なす場合、これらは同じテーブルに格納できます。accessoriesproductsproducts

したがって、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_idaccessoriesどのアクセサリがどのモデルに適合するかがわかるようにします。

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ます。

于 2013-07-19T18:46:01.893 に答える