零售数据库设计 - 具有不同附件的多种产品

时间:2013-07-19 18:38:28

标签: mysql database

我正在尝试为现有的页面内容零售网站设计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不同。

每个型号是否需要单独的附件表?在此先感谢您的帮助,如果我犯了任何失礼,我的不好。这是我的第一个问题,请放心! :)

2 个答案:

答案 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列。

表格中的一行代表accessorymodel之间的关系。此表格的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表。 (这就是为什么我选择在我的示例中使用productsmodel作为表名。)

如果我们同时将accessoriesmodels都视为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列中的值。