更新答案
我最初的回答错过了关于需要“共享”配件的要点,问题是关于为每个模型设置一个单独的表。这是我的误会。
如果您需要与两个或多个模型“共享”配件,这意味着多对多关系。也就是说,
一个模型可以有零个或多个附件。
配件可以与零个或多个模型相关。
为了解决这样的多对多关系,我们添加另一个表,并从accessories 表中删除model_id 列。
表中的一行将表示accessory 和model 之间的关系。此表将有一个指向models 表的外键 (model_id) 和一个指向accessories 表的外键 (accessory_id)。
因此,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是对models表id列的引用,accessory_id是对accessories表id列的引用。
102 型可以共享一些相同的配件,也可以有不同的配件:
102 1
102 2
102 3
102 4
102 11
通常,(model_id, accessory_id) 的组合有一个 UNIQUE 约束,因此同一个附件不会关联两次(或多次)。
有时,关系上有属性。例如,不同型号的配件标价可能不同。为了支持这一点,可以在model_accessories 关系表中添加一个属性列(list_price。
外键的目标不一定是单独的表;这些都可以引用相同的products 表。 (这就是我在示例中选择使用model 和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 列的外键。
ORIGINAL ANSWER(投反对票,没有给出任何理由,但可能是因为它错过了“共享”配件的要点。下面答案中的方法假设每个配件都与一个模型相关联。我认为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
所有选项都在一个表中。但是行where model_id=101 与产品型号id=101 相关联。 where model_id=102 行与id=102 的产品型号行相关联。
外键约束可以强制在accessories.model_id 列中允许的唯一值是在model.id 列中找到的值。