人
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的好朋友.我会选择他的解决方案,因为它并不重要,你以后肯定需要他.