MySQL数据库,用于存储产品、颜色、大小和库存

MySQL数据库,用于存储产品、颜色、大小和库存,mysql,database-design,Mysql,Database Design,我对php和mysql非常陌生,我有一个任务是处理衬衫商店的购物车,在存储衬衫属性(如颜色、大小和每件商品的库存)时,我与数据库设计相混淆 假设将以下衬衫存储到db: Product name: Nike shirt Available colors: black, white, blue Size: M, L, XL Stock: Black - M - 5 pc White - L - 10 pc Blue - M - 2 pc Blue

我对php和mysql非常陌生,我有一个任务是处理衬衫商店的购物车,在存储衬衫属性(如颜色、大小和每件商品的库存)时,我与数据库设计相混淆

假设将以下衬衫存储到db:

Product name: Nike shirt  
Available colors: black, white, blue 
Size: M, L, XL 
Stock: Black - M - 5 pc
       White - L - 10 pc
       Blue  - M - 2 pc
       Blue  - XL - 3 pc
       (and so on...)
而不是像这样在表中迭代存储上述信息:

table shirt
  id    product       color    size   stock
---------------------------------------------
   1    Nike Shirt    black     M       5
   2    Nike Shirt    white     L       10
   3    Nike Shirt    blue      M       2
   4    Nike Shirt    blue      XL      3
  ....
设计表格以有效保持这些属性和产品的最佳方法是什么

我知道可以将多个表连接在一起,但我需要关于这些属性的建议,关于如何使用差异表单独放置,以及在人们转到相应页面时获取信息,并向他们显示特定大小的剩余库存量

提前谢谢。

这是您的桌子

Shirt

  id    product       color    size   stock
---------------------------------------------
   1    Nike Shirt    black     M       5
   2    Nike Shirt    white     L       10
   3    Nike Shirt    blue      M       2
   4    Nike Shirt    blue      XL      3
  ....
您可以看到您是如何复制产品名称“Nike Shirt”和颜色“blue”的。在规范化关系数据库中,我们不希望复制任何信息。如果有人不小心将第4排的“Nike衬衫”改为“Nike裙子”,您认为会发生什么

那么,让我们来看看你的桌子

Shirt

  id    product       color    size   stock
---------------------------------------------
   1    Nike Shirt    black     M       5
   2    Nike Shirt    white     L       10
   3    Nike Shirt    blue      M       2
   4    Nike Shirt    blue      XL      3
  ....
我们将从产品表开始

Product

  id    product    
------ ------------
   0    Nike Shirt
通常,数据库id号以零开始,而不是以一开始

接下来,让我们创建一个颜色表

Color

  id    color   
------  -------
   0    black    
   1    white    
   2    blue 
接下来,让我们创建一个大小表

Size

  id   size 
------ -----
   0    XS
   1    S
   2    M
   3    L
   4    XL
   5    XXL 
好的,现在我们有3个独立的对象表。我们如何把它们放在一起,这样我们就可以看到库存了

您对原始表格的想法是正确的

Stock

  id    product       color    size   stock
---------------------------------------------
   0        0           0        2       5
   1        0           1        3      10
   2        0           2        2       2
   3        0           2        4       3
产品、颜色和尺寸编号是返回产品、颜色和尺寸表的外键。我们这样做的原因是为了消除信息的重复。您可以看到,任何信息都存储在一个位置,并且仅存储在一个位置

库存表上不需要id。产品、颜色和大小应该是唯一的,因此这三个字段可以构成Stock表的复合键

在实际的零售商店中,产品可能具有许多不同的属性。这些属性可能存储在一个数据库中。对于简单表,我们可以将表分解为规范化的关系表


我希望这对您有所帮助。

用代理键替换文本标识符不是正常化。原始功能依赖项(产品、颜色、大小)->库存在最终版本中保持不变,事实上已完全规范化reaanb 2015年7月31日21:33

这是一个极其复杂的商业领域。您建议的单表布局有几个挑战。首先,大量重复条目是数据库设计中的一种气味。其次,它假设所有实体都具有相同的属性——正如@gilbertleblanc所写的,现实世界中的应用程序可能需要存储许多其他属性(制造商、材料、过敏信息等)

因此,我将把它分为两个问题:

  • 存在哪些产品和变体
  • 每种商品我们有多少存货
表示示例数据的最低方式是:

products
----------
id
name
color
size


product_stock
------------
product_id
stock_quantity
在现实生活中,库存表通常是一个交易分类账——移动的总和为您提供当前库存金额

product_id    date     movement
---------------------------------
1            1 Jan 2021      10
1            2 Jan 2021.     -1
1            3 Jam 2021.     -4

这取决于你想要什么级别,你可以有一张桌子,你可以有2,3,4,5,10。。这一切都取决于你的解决方案有多大。这是家庭作业还是企业业务。可以是一张桌子,里面有产品,T恤。。。一个是供应商。。耐克。。。一个有属性的。。。比如颜色,大小,性别。。。处理您的存储库(库存)的人。。。。你明白我的意思了。我建议您阅读关于@MrSimpleMind的内容,如果您能粗略地给我画一张表,特别是关于股票的,我将不胜感激。用代理键代替文本标识符不是正常化。原始的功能依赖项
(产品、颜色、大小)->库存
在最终版本中保持不变,实际上已完全规范化。这是一个“过度规范化”的示例。这与规范化无关。@gilbert le blanc您如何查询此表?如果您希望在一个页面上向用户显示具有不同颜色的同一产品,用户可以在其中更改颜色(从而更改产品),您将如何将所有这些产品链接在一起?