我是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
....
设计表格以有效保存这些属性和产品的最佳方法是什么?
我知道可以将多个表连接在一起,但是我需要建议如何单独使用差异表并在人们进入相应页面时获取信息,并向他们显示特定的剩余库存数量大小
提前致谢。
答案 0 :(得分:4)
这是你的桌子。
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 Shirt”改为“Nike Skirt”,你会怎么想?
所以,让我们normalize你的桌子。
我们将从Product表开始。
Product
id product
------ ------------
0 Nike Shirt
通常,数据库ID号从零开始,而不是一个。
接下来,让我们创建一个Color表。
Color
id color
------ -------
0 black
1 white
2 blue
接下来,让我们创建一个Size表。
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
产品,颜色和尺寸编号是返回“产品”,“颜色”和“尺寸”表的外键。我们这样做的原因是为了消除信息的重复。您可以看到任何信息都存储在一个地方和一个地方。
Stock表格中不需要id。产品,颜色和大小应该是唯一的,因此这3个字段可以成为Stock表的复合键。
在实际的零售商店中,产品可能具有许多不同的属性。属性可能存储在key/value table中。对于您的简单表,我们可以将表分解为规范化的关系表。
我希望这对你有所帮助。
答案 1 :(得分:0)
用代理键代替文本标识符不是规范化的。原始功能依赖性(产品、颜色、尺寸)-> 库存在您的最终版本中保持不变,实际上已完全标准化。 – reaanb 2015 年 7 月 31 日 21:33
答案 2 :(得分:-1)
这是一个极其复杂的业务领域。您建议的单表布局有一些挑战。首先,大量重复条目是数据库设计中的一种味道。其次,它假设所有实体都具有相同的属性 - 正如@gilbertleblanc 所写,现实世界的应用程序可能需要存储许多其他属性(制造商、材料、过敏信息等)。< /p>
所以,我将把它分成两个问题:
表示样本数据的最小方法是:
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