将一个表中的多行分配给第二个表中的单元格(MySQL)

时间:2013-01-16 18:03:53

标签: mysql normalization multiple-value

好的,我们有Table 1(T1)和Table 2(T2)

结构:

T1 (main table):
ID (Auto-Increment)
Name
Properties

T2 (properties table):
ID
Property Name

假设table 1有两个条目。 Table 2有4个属性。 我想要做的是在table 1中设置条目1的属性,以映射到table 2中的属性1,2和3。对于表1中的条目2,我想将其映射到表2中的属性2,3和4。

例如,假设我们有两个产品,一个是BALL和一个CUBE。这些将列在table 1中。现在让我们说table 2包含所有可用的颜色。

Table 2:
ID COLOR
1  RED
2  BLUE
3  GREEN
4  YELLOW

Table 1:
ID NAME AVAILABLE_COLORS
1  BALL (TABLE 2 ENTRY 1, TABLE 2 ENTRY 2, TABLE 2 ENTRY 3, in other words RED BLUE GREEN)
2  CUBE (TABLE 2 ENTRY 2, TABLE 2 ENTRY 3, TABLE 2 ENTRY 4, in other words BLUE GREEN YELLOW)

我如何获得指向颜色表的可用颜色?基本上我想确保如果我更改属性(比如颜色红色 - >黑色),它会自动更改所有表1条目。

通常如果我只需要为一个项目分配一种颜色,并且该颜色不能在另一个项目中使用,我只需在table 2中添加一个“属于”的列或类似的东西,并且这样我可以设置多种颜色来匹配table 1中的相同条目,但是,我只能将颜色指定给一个条目...我不能将每个说明的红色分配给球和立方体。

任何人都有任何想法?

1 个答案:

答案 0 :(得分:0)

我通常会创建第三个表来跟踪哪些产品可用哪种颜色。让我们说一个目录表。它存储的全部是主要ID,产品ID和颜色ID。

Table 3:  Catalog
ID ColorsID ProductsID
1 1 1  // row one connects with colors and products and this is a red ball 
2 2 1  // blue ball
3 1 2  // red cube
4 4 2  // yellow cube

这样做可以根据需要为产品连接任意数量的属性。它需要更多的工作来跟踪您的目录,但从长远来看使事情变得更容易。从产品中删除可用的颜色,仅将产品ID和产品名称存储在该表中。任何其他标准的描述,不一定会随着颜色而改变。这样,如果您将可用颜色从3更改为10,则无需添加新字段进行跟踪。您还可以获取目录并添加额外的字段,如活动或库存,以跟踪产品当前是否以该颜色可用。在目录中,您还可以存储库存编号。如果你的价格根据颜色不同怎么办?白球更便宜?正常数据的所有正当理由。

规范化是为了确保每个表都有唯一的最小字段并摆脱依赖关系。 查看这个已接受的答案,以便对理论层面的规范化做出很好的解释。 Normalization in MYSQL

然后,您可以使用JOINS将它们连接起来以遍历目录表。

SELECT Colors.ColorID as Color, Products.ProductID as Product
FROM Catalog
    INNER JOIN Colors
        ON Catalog.ColorsID = Colors.ColorID
    INNER JOIN Products 
        ON Catalog.ProductsID = Products.ProductID

有关JOINS的更多信息,请访问此处 - http://en.wikipedia.org/wiki/Join_%28SQL%29

相关问题