我有一个问题,在普通数据库中可能无法在不必水平扩展的情况下实现。
我有一个商店,商店包含Product
。例如一家服装店。您可以在Color
和Size
之间选择多个商店。我现在称这些为Types
。
表格如下所示:
Product
Product name
ProductTypes
ProductId
TypeId1
TypeId2
Price
Weight
Stock
Etc...
Types
TypeId
Type name
未真正规范化,因为TypeId1
和TypeId2
仍然在同一个表中。也许客户希望将10种类型分配给一个产品,该产品可以有效地创建一个10D矩阵,其中包含类型之间的所有相关性,但是我必须再创建8个TypeId
到ProductTypes
表
这是否可以正常化而无需水平缩放?
例如,我有以下类型:Color
,Size
,Gender
和Shape
。
我需要能够说主要产品Blue
的{{1}} XL
Male
Turtleneck
没有库存,而且价格有改变。但我需要能够为产品动态添加更多类型。
基本上我要问的是,如何在理性数据库中存储5d数组查找。
答案 0 :(得分:3)
你很亲密。
你的桌子应该是这样的。
Product
-------
Product ID
Product Name
Weight
Stock Number
...
产品ID是一个自动递增的整数,定义为主(聚类)键。我假设,根据您的设计,重量和库存号属于产品。属于该项和类型的任何属性都可以移动到稍后描述的ItemType表中。
Type
----
Type ID
Type Name
Type Value
...
类型ID是递增整数。类型ID和类型值组合成主要(群集)密钥。
换句话说,(0,大小,S),(0,大小,M)等。如果需要,可以将其分成两个单独的表格以进一步标准化。使用这个表格可以直观地验证您的类型行。
Item
----
Item ID
Product ID
SKU
Quantity On Hand
Price
...
项ID是一个自动递增的整数,定义为主(聚类)键。产品ID是Product表的外键。清单中的每种类型组合(每个唯一项目)都在此表中定义。例如,商品ID 16是男士礼服衬衫(产品),蓝色(类型),XL(类型),SKU MD-14850639。这些类型属性在ItemType表中汇总在一起。
ItemType
--------
Item ID
Type ID
...
项目ID和类型ID组合成主要(群集)密钥。您可以根据需要为项目设置多种类型。
答案 1 :(得分:1)
您的问题不清楚Product
与ProductType
的对比情况。听起来像Product
是像“Levi's 501 Jeans”这样的叶子类别项目,Type
是像“Inseam Length”,“Waist”或“Color”这样的轴,ProductType
是一个特殊的SKU,可让您跟踪“34Wx36L蓝色”与“30Wx36L黑色”相比。
您只需创建一个新表TypesToProductTypes
,其中包含ProductTypeId
列,TypeId
列和Value
列。然后,您可以根据需要为每个产品提供尽可能多的TypeId。
所以让我们说我们想在“34Wx36L Blue”和“30Wx36L Black”中代表“Levi's 501 Original”:
ProductId Name --------- ------------------- 1 Levi's 501 Original
TypeId Name ------ ------------- 1 Color 2 Waist 3 Inseam Length
ProductTypeId ProductId Name SKU# ------------- --------- --------------------------------- --------- 1 1 Levi's 501 Original 34Wx36L Blue 005011627 2 1 Levi's 501 Original 30Wx36L Black 005011660
ProductTypeId TypeId Value ------------- ------ ---------- 1 1 Blue 1 2 34 1 3 36 2 1 Black 2 2 30 2 3 36
我使用您给定的表名来使示例更易于理解,但您调用的内容Product
我会调用CatalogItem, what you call
ProductType I would call
SKU , and what you call
类型{{1 }} Attribute`。