考虑以下两个表:
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
似乎用少一张桌来完成同样的事情。
答案 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