gpt4 book ai didi

sql - 合法的?引用同一个主键的两个外键

转载 作者:行者123 更新时间:2023-12-04 15:59:11 25 4
gpt4 key购买 nike

就像 Cliffs 的更新一样,感谢 ChaosPandion 提供模板。


PersonID Int PK

网络
PersonID Int PK FK
OtherPersonID Int PK FK

或者


PersonID Int PK

网络
PersonID Int PK FK
FriendID Int PK FK

friend
FriendID 内部PK
OtherPersonID Int FK

++++++
下面的原帖
++++++

大家好,

我是一名网络开发人员,最近在一家公司开始了一个项目。目前,我正在与他们的 DBA 合作为站点布局架构,我们在几个表的设计方面存在分歧,我想就此事发表一些意见。

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

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

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

现在显然,他的话有点煽动性,这有助于激励我找到合适的答案,但更重要的是,我只想知道如何正确地做。我已经开发数据库和编程超过 10 年,与一些顶尖人才共事过,从未听过这种争论。

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(related back to Persons))。

对我来说,创建第三个表本质上是多余的,除了为 Friends_PersonID 创建一个别名之外什么都不做,并导致我必须添加(我认为不需要的)连接到我的所有查询中,更不用说额外的周期了这是对每个查询执行连接所必需的。

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

感谢阅读,感谢评论。

瑞安

最佳答案

如果我理解正确,你提议:

Person              PersonID PK
FriendList FriendListID, OwnerID, PersonID

DBA 建议:
Person              PersonID PK
FriendList FriendListID, OwnerID
FriendListEntry FriendListID, PersonID

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

这里的最佳实践是与 DBA 成为好 friend 。我会采用他的解决方案,因为它无关紧要,而且您以后肯定会需要他。

关于sql - 合法的?引用同一个主键的两个外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2671724/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com