多对多关系简化

时间:2014-08-10 17:03:18

标签: sql sql-server many-to-many data-modeling

考虑以下两个表:

Messages
MessageId (PK)
Text  

Languages
LanguageId (PK)
Language

消息和语言表之间存在多对多关系(即每个消息可以有多种语言,每种语言可以由多个消息共享)。为此,我添加了以下联结表:

Messages_Languages
MessageId (PK)(FK)
LanguageId (PK)(FK)

然而,似乎有点不必要,因为语言基本上是消息的属性。使用上面的Messages_Languages表而不是仅仅将LanguageId作为外键添加到Messages表中有什么好处? (见下文)

Messages  
MessageId (PK)
LanguageId (PK)(FK)
Text  

似乎用少一张桌来完成同样的事情。

3 个答案:

答案 0 :(得分:1)

  

似乎完成同样的事情......

没有。联结表模拟多对多,而FK模型为一对多。

所以问题不是哪个更好,而是你需要哪个

答案 1 :(得分:0)

这是一个非常好的简单例子。基于您的简单示例,最好将LanguageID作为属性添加到表中,因为您是正确的:它实际上只是一个属性。据推测,语言数量固定,应用程序的用户在使用您的应用程序时不会添加新语言。

当您进一步开发应用程序时,这是否成立是另一个问题。如果添加消息版本或其他一些附加列的概念,也许有一个单独的表是有意义的。

答案 2 :(得分:0)

无论做什么都没关系,但这是不是正确的事情。 问问自己:

  

是单个消息将与多种语言连接   语言可以连接到很多消息吗?

这是多对多关系,你应该有它的联结表。

如果您只需要为单个消息提供一种语言,则使用语言ID作为消息的属性。这称为一对多关系。

在某些数字上显示这两者之间的差异:

在表格Messages_Languages中,您可以拥有行:

1,1
1,2
1,3
2,1
2,2
2,3

在最后一张桌子上:

Messages  
MessageId (PK)
LanguageId (PK)(FK)
Text  

你能够放下:

1,1
2,3
3,2