我正在尝试为现有的页面内容零售网站设计MySQL数据库。我们有不同制造商的多种产品,我们为每种产品提供不同的配件选项,尽管有些配件使用相同的配件。我一直坚持设计配件TABLE(s)
产品1有23个配件 - 9种颜色选择,4种门选项,4种腿选项,4种三脚架选项,1种变速鼓风机选项,1种防火屏选项。
产品2有 - 4门选项,4个腿选项,1个变速鼓风机选项,1个防火屏选项(与产品1共享这些选项)。产品2还有一个腿部适配器选项,一个底座选项和两个灰烬抽屉选项。
产品3有27个配件 - 9种颜色选项,8种门选项,4种腿选项,4种三脚架选项,1种变速鼓风机选项和1种防火屏选项。颜色选项共享相同的后缀,但具有不同的前缀(prod1.BLUE / prod3.BLUE)。所有产品的腿部选项都相同。鼓风机和防火屏与产品1不同。
每个型号是否需要单独的附件表?在此先感谢您的帮助,如果我犯了任何失礼,我的不好。这是我的第一个问题,请放心! :)
答案 0 :(得分: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。
答案 1 :(得分:2)
更新的答案
我的原始答案忽略了需要“共享”配件的问题,问题是每个型号都有一个SEPARATE表。这是我的误解。
如果您需要与两个或更多型号“共享”配件,则意味着多对多关系。也就是说,
模型可以没有一个或多个配件。
附件可以与零个或多个模型相关。
要解决此类的多对多关系,我们会添加另一个表,并从model_id
表中删除accessories
列。
表格中的一行代表accessory
和model
之间的关系。此表格的model_id
表格为外键(models
),{{strong>外键(accessory_id
)为{ {1}}表。
因此,accessories
表将是所有可用选项的列表:
accessories
如果型号101有附件:黑色和烧焦的棕色的颜色选项,以及花式腿,model_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
model_id 101是对models表的id列的引用,而accessory_id是对附件表中id列的引用。
102型可以分享一些相同的配件,也有不同的配件:
model_accessories
model_id accessory_id
-------- ------------
101 1
101 3
101 10
通常, 102 1
102 2
102 3
102 4
102 11
的组合上有一个UNIQUE约束,因此相同的附件不会关联两次(或更多次)。
有时,关系存在属性。例如,附件的定价可能在不同型号上不同。为了支持这一点,可以在(model_id, accessory_id)
关系表上添加属性列list_price
。
外键的目标不一定需要是单独的表;这些都可以引用相同的model_accessories
表。 (这就是为什么我选择在我的示例中使用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
列的外键。
原始答案(downvoted,没有给出理由,但可能是因为它错过了关于“共享”配件的观点。下面答案中的方法假设每个配件都与一个模型相关联.I认为OP意味着创建一个model_101_accessories表,一个model_102_accessories表,没有任何共享。
<击> 不,如果您将附件存储在表格中而不是列中,则不需要单独的表格。
在products.id
表格中加入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
列中的值。
击>