sql – 合法?两个外键引用相同的主键

前端之家收集整理的这篇文章主要介绍了sql – 合法?两个外键引用相同的主键前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
就像Cliffs的更新一样,感谢ChaosPandion的模板.


PersonID Int PK

网络
PersonID Int PK FK
OtherPersonID Int PK FK

要么


PersonID Int PK

网络
PersonID Int PK FK
FriendID Int PK FK

朋友
FriendID Int PK
OtherPersonID Int FK


原帖在下面

大家好,

我是一名网络开发人员,最近与一家公司合作开展了一个项目.目前,我正在与他们的DBA合作获取网站的架构,我们对几个表的设计产生了分歧,我想就此事提出一些意见.

基本上,我们正在开发一个实现“朋友”网络的网站.该站点的所有用户都将包含在具有(PersonID int identity PK等)的表tblUsers中.

我想要做的是创建第二个表,tblNetwork,它将保存用户之间的所有关系,具有(NetworkID int identity PK,Owners_PersonID int FK,Friends_PersonID int FK等).或者相反,删除NetworkID,并将Owners_PersonID和Friends_PersonID共享为主键.

这就是DBA遇到问题的地方.他说“他只会在数据仓库架构中实现这种架构,而不是网站,这只是网络开发人员试图采取简单方法的另一个例子.”

显然,他的评论有点煽动性,这有助于激励我找到合适的答案,但更重要的是,我只想知道如何做对.我已经开发了数十年的数据库和编程,与一些顶尖的人一起工作,从未听过这种论点.

DBA想要做的不是将Owners_PersonId和Friends_PersonId存储在同一个表中,而是创建第三个表tblFriends来存储Friends_PersonId,并让tblNetwork有(NetworkID int identity PK,Owner_PersonID int FK,FriendsID int FK(来自TBLFriends)).所有那些tblFriends将会是(FriendsID int identity PK,Friends_PersonID(与人相关)).

对我来说,创建第三个表本质上是过分的,除了为Friends_PersonID创建别名之外什么都没做,并且导致我必须添加(我认为不需要的)加入我的所有查询,更不用说额外的周期在每个查询上执行连接所必需的.

我从技术上理解,他想要的是可能的,但它是否符合最佳实践?什么是最佳做法?

感谢阅读,感谢评论.

瑞安

解决方法

如果我理解你,你提议:
Person              PersonID PK
FriendList          FriendListID,OwnerID,PersonID

DBA建议:

Person              PersonID PK
FriendList          FriendListID,OwnerID
FriendListEntry     FriendListID,PersonID

您的方法将需要列表中每个朋友的多行.这将多次重复OwnerID,违反正常形式. DBA的解决方案更加规范化,只有依赖于FriendList表中的FriendListID的值.

这里最好的做法是成为DBA的好朋友.我会选择他的解决方案,因为它并不重要,你以后肯定需要他.

原文链接:https://www.f2er.com/mssql/76244.html

猜你在找的MsSQL相关文章