我有以下表格:
+---+---------+
|id | name | foreign_key1 = this table's id
+---+---------+
|1 | White |
|2 | Black |
+---+---------+
+----+------+-------------+
|id | name | foreign_key1|
+----+------+-------------+
|1 | Grey | 1 |
|2 | Grey | 2 |
+----+------+-------------+有没有一种方法可以只用一行保存最后一个表的信息?所以这个表可以表示灰色在一行中既是白色又是黑色?
发布于 2016-03-08 19:46:06
您可以使用array-like column type (字符串)并将其设置为一行记录,但我不建议这样做,最好将它们作为单独的行。您的方法很好,但我会建议(如果我理解您的想法)一点不同的模式:您可以创建两个表:Colors和Related_Colors,如下所示:
Colors
+---+---------+
|id | name |
+---+---------+
|1 | White |
|2 | Black |
|3 | Gray |
+---+---------+
Related_Colors
+---+---------+---------+
|id |color1_id|color2_id|
+---+---------+---------|
|1 |3 |1 |
|2 |3 |2 |
+---+---------+---------+发布于 2016-03-08 19:50:25
你可以这样做,这叫做反规范化(https://en.wikipedia.org/wiki/Denormalization)。实际上,您需要(在第二个表中)为第一个表中的每个可能的ID创建一列。因此,第二个表的模式为:
ID
Name
White
Black这也解释了为什么你可能不应该这样做;当你想在第一个表中添加另一个ID (例如紫色)时会发生什么?根据实际情况,您只需要在表1中添加另一行,并从相关行中引用它。如果以这种方式进行反规范化,则需要更改模式以适应新的可能值。当然,对于大多数行,新列都是空的。
另一种可能是以连接字符串的形式维护这些值;因此,模式将是
ID
Name
List Of IDs From Table1在本例中,最后一个字段将包含“白”和“黑”。这种方法的缺点是您不能再根据table1中的值高效地进行查询。(您无法正确地为该字段建立索引)
最终的问题是--你的需求是什么。如果您需要快速读取行,并让它们以“报告友好”的格式显示,反规范化可能对您有效。但在大多数数据库设计案例中,这并不是必需的。
https://stackoverflow.com/questions/35866308
复制相似问题