2016-03-08 90 views
0

我有以下表格:SQL架构设计

+---+---------+ 
|id | name | foreign_key1 = this table's id 
+---+---------+ 
|1 | White | 
|2 | Black | 
+---+---------+ 

+----+------+-------------+ 
|id | name | foreign_key1|  
+----+------+-------------+ 
|1 | Grey | 1   | 
|2 | Grey | 2   |  
+----+------+-------------+ 

有,我可以只用一行坚持最后一个表格的信息的方法吗?那么这张桌子可以表示灰色在一行中都是白色和黑色?

回答

0

您可以使用array-like column type(字符串)并将其设置为单行记录,但我不会建议,最好将它们作为单独的行。你的做法是好的,但我会建议(如果我理解你的想法)有一点不同的模式: 你可以让两个表:颜色和Related_Colors,像这样:

Colors 
+---+---------+ 
|id | name | 
+---+---------+ 
|1 | White | 
|2 | Black | 
|3 | Gray | 
+---+---------+ 

     Related_Colors 
+---+---------+---------+ 
|id |color1_id|color2_id| 
+---+---------+---------| 
|1 |3  |1  | 
|2 |3  |2  | 
+---+---------+---------+ 
0

你能;它被称为非规范化(https://en.wikipedia.org/wiki/Denormalization)。基本上,您需要为第一个表中的每个可能ID创建(在第二个表中)一列。因此,第二个表的模式将是:

ID 
Name 
White 
Black 

这也解释了为什么你可能不应该这样做;当你想在第一个表中添加另一个ID(例如紫色)时会发生什么?因为你只需要在表1中添加另一行,并从相关行中引用它。如果以这种方式反规范化,则需要更改模式以适应新的可能值。对于大多数行,新列当然是空的。

另一种可能性是将值保持为连接字符串;所以架构将是

ID 
Name 
List Of IDs From Table1 

而在这种情况下,最后一个字段将包含白色,黑色。这种方法的缺点是,您无法再通过table1的值有效查询。 (您不能正确索引该字段)

最终问题是 - 您的需求是什么。如果您需要快速读取行,并将其以“报告友好”格式表示,则非规范化可能适用于您。但在大多数数据库设计案例中,这不是必需的。