更新的答案
我最初的答案错过了关于需要“共享”配件的要点,问题是关于为每个型号配备一个单独的表。这是我的误解。
如果您需要与两个或多个模型“共享”配件,这意味着多对多关系。那是,
一个模型可以有零个或多个附件。
一个配件可以与零个或多个模型相关联。
为了解决这样的多对多关系,我们添加另一个表,并model_id
从表中删除该列accessories
。
表中的一行将表示accessory
a 和 a之间的关系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 是对models表中id列的引用,accessory_id是对accessories表中id列的引用。
102 型可以共享一些相同的配件,也可以有不同的配件:
102 1
102 2
102 3
102 4
102 11
通常,对 的组合有一个 UNIQUE 约束(model_id, accessory_id)
,因此同一个附件不会关联两次(或多次)。
有时,关系上有属性。例如,不同型号的配件标价可能不同。list_price
为了支持这一点,可以在model_accessories
关系表上添加一个属性列 ( 。
外键的目标不一定是单独的表;这些都可以引用同products
一张表。(这就是我在示例中选择使用model
和accessories
作为表名的原因。)
如果我们认为 bothmodels
和accessories
to both be 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
。
原始答案(被否决,没有给出理由,但可能是因为它错过了关于“共享”配件的要点。下面答案中的方法假设每个配件都与一个模型相关联。我认为 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
。