首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL架构设计

SQL架构设计
EN

Stack Overflow用户
提问于 2016-03-08 19:36:42
回答 2查看 38关注 0票数 0

我有以下表格:

代码语言:javascript
复制
+---+---------+ 
|id |   name  |    foreign_key1 = this table's id
+---+---------+  
|1  |   White |
|2  |   Black |
+---+---------+

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

有没有一种方法可以只用一行保存最后一个表的信息?所以这个表可以表示灰色在一行中既是白色又是黑色?

EN

回答 2

Stack Overflow用户

发布于 2016-03-08 19:46:06

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

代码语言:javascript
复制
    Colors
+---+---------+
|id |   name  |
+---+---------+
|1  |   White |
|2  |   Black |
|3  |   Gray  |
+---+---------+

      Related_Colors
+---+---------+---------+
|id |color1_id|color2_id|
+---+---------+---------|
|1  |3        |1        |
|2  |3        |2        |
+---+---------+---------+
票数 0
EN

Stack Overflow用户

发布于 2016-03-08 19:50:25

你可以这样做,这叫做反规范化(https://en.wikipedia.org/wiki/Denormalization)。实际上,您需要(在第二个表中)为第一个表中的每个可能的ID创建一列。因此,第二个表的模式为:

代码语言:javascript
复制
ID
Name
White
Black

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

另一种可能是以连接字符串的形式维护这些值;因此,模式将是

代码语言:javascript
复制
ID
Name
List Of IDs From Table1

在本例中,最后一个字段将包含“白”和“黑”。这种方法的缺点是您不能再根据table1中的值高效地进行查询。(您无法正确地为该字段建立索引)

最终的问题是--你的需求是什么。如果您需要快速读取行,并让它们以“报告友好”的格式显示,反规范化可能对您有效。但在大多数数据库设计案例中,这并不是必需的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35866308

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档