【问题标题】:Retail Database Design - Multiple Products with different accessories零售数据库设计 - 具有不同配件的多种产品
【发布时间】:2023-04-06 23:45:02
【问题描述】:

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

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

【问题讨论】:

  • 我会后悔这样说,但在配件字段中,您可以使用 csv 分隔值链接到使用它的每个产品并爆炸 on ,然后对每个语句使用 a
  • 我不认为我的答案是迄今为止最好的选择,但我当然认为你不应该为了有另一张桌子而使用另一张桌子
  • @LiamSorsby :您破坏了实施参照完整性的任何机会,因此当配件在没有大量逻辑的情况下更改时,您的设计的配件列表中会出现陈旧的 id。
  • @PaulProgrammer:对于大多数应用程序,您是正确的。在零售业中,一个实体/价值表比几十个配件表更有意义。
  • 我不是在提倡几十个附件表。我提倡单品配件连接表。

标签: mysql database


【解决方案1】:

您不需要为每个产品单独设置一个表格——这太疯狂了。您描述了一个多对多连接,通常使用可以将附件连接到产品/模型的表来实现。假设您有每个产品和配件的 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。

【讨论】:

  • 谢谢大家! Paul - 这正是我想要做的,但由于某种原因我无法理解,尽管这正是我制作制造商 TABLE 的方式。谢谢!
  • @wibblywobblyjoe:您可能希望将这些列中的每一个定义为其父表的外键。 (所选答案省略了通常实施的外键约束的任何提及。)
  • +1 @PaulProgrammer:这是一个很好的答案。 (解决与中间表的多对多关系是规范模式。)
  • 我会添加一个“类别”列,其中将包括产品和配件之间关系的性质(来自受控词汇表):例如适合行业和产品类型的“ReplacementPart”、“Enhancement”、“Carrier”等。
  • @Curt 我同意,您可以添加很多东西作为连接元数据,但 OP 没有指定任何进一步的需求。您可以添加开始/停止日期以确定何时提供或停止提供配件,您可以添加价格以更改一起购买的价格......等等。
【解决方案2】:

更新答案

我最初的回答错过了关于需要“共享”配件的要点,问题是关于为每个模型设置一个单独的表。这是我的误会。

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

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

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

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

表中的一行将表示accessorymodel 之间的关系。此表将有一个指向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 表。 (这就是我在示例中选择使用modelaccessories 作为表名的原因。)

如果我们认为modelsaccessories 都是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 列中找到的值。

【讨论】:

  • 你没有抓住重点。模型可以共享配件,因此如果door option 1 的描述更改为super duper door option 1,则不必多次更新。
  • @PaulProgrammer:我确实错过了需要共享的配件这一点。我错过了。我以为 OP 正在谈论为每个模型创建一个单独的附件表。 (这可能是答案被否决的原因。)我已经更新了答案,但留下了被否决的原始答案。为了解决多对多表关系,我们添加了第三个表,其中每个父表都有外键。我已经更新了我的答案。
  • 感谢斯宾塞的详细解释! StackOverflow 背后的人非常乐于助人,我喜欢它! :)
  • 一个配件可以与许多产品相关联,反之亦然。模型-->附件连接表是要走的路。
猜你喜欢
  • 2017-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
  • 2017-08-09
相关资源
最近更新 更多