许多与多对多的关系

时间:2013-11-03 01:07:56

标签: database-design

我有一个问题,在普通数据库中可能无法在不必水平扩展的情况下实现。

我有一个商店,商店包含Product。例如一家服装店。您可以在ColorSize之间选择多个商店。我现在称这些为Types

表格如下所示:

Product

  • Product name

ProductTypes

  • ProductId
  • TypeId1
  • TypeId2
  • Price
  • Weight
  • Stock
  • Etc...

Types

  • TypeId
  • Type name

未真正规范化,因为TypeId1TypeId2仍然在同一个表中。也许客户希望将10种类型分配给一个产品,该产品可以有效地创建一个10D矩阵,其中包含类型之间的所有相关性,但是我必须再创建8个TypeIdProductTypes

这是否可以正常化而无需水平缩放?

例如,我有以下类型:ColorSizeGenderShape

我需要能够说主要产品Blue的{​​{1}} XL Male Turtleneck没有库存,而且价格有改变。但我需要能够为产品动态添加更多类型。

基本上我要问的是,如何在理性数据库中存储5d数组查找。

2 个答案:

答案 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)

您的问题不清楚ProductProductType的对比情况。听起来像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

ProductType

ProductTypeId     ProductId     Name                                  SKU#
-------------     ---------     ---------------------------------     ---------
            1             1     Levi's 501 Original 34Wx36L Blue      005011627
            2             1     Levi's 501 Original 30Wx36L Black     005011660

TypesToProductTypes

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`。