2

我正在尝试为现有的页面内容零售网站设计一个 MySQL 数据库。我们有不同制造商的多种产品,每种产品都有不同的配件选择,尽管有些配件共享相同的配件。我一直在设计配件表

产品 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 不同。

每个型号都需要单独的附件表吗?提前感谢您的帮助,如果我犯了任何失礼,我的错。这是我的第一个问题,请放轻松!:)

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

更新的答案

我最初的答案错过了关于需要“共享”配件的要点,问题是关于为每个型号配备一个单独的表。这是我的误解。

如果您需要与两个或多个模型“共享”配件,这意味着多对多关系。那是,

  • 一个模型可以有零个或多个附件。

  • 一个配件可以与零个或多个模型相关联。

为了解决这样的多对多关系,我们添加另一个表,并model_id从表中删除该列accessories

表中的一行将表示accessorya 和 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一张表。(这就是我在示例中选择使用modelaccessories作为表名的原因。)

如果我们认为 bothmodelsaccessoriesto 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_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

所有选项都在一张表中。但这些行where model_id=101与产品型号相关联id=101。这些行where model_id=102与带有 的产品型号行相关联id=102

外键约束可以强制列中允许的唯一值是在accessories.model_id列中找到的值model.id

于 2013-07-19T18:46:01.893 回答