gpt4 book ai didi

sql - 代理键作为复合键的外键

转载 作者:行者123 更新时间:2023-12-03 07:49:42 26 4
gpt4 key购买 nike

我意识到可能存在类似的问题,但我找不到足够接近的问题来提供指导。

鉴于此规范,

Site
---------------------------
SiteID int identity
Name varchar(50)

Series
---------------------
SiteID int
SeriesCode varchar(6)
...
--SeriesCode will be unique for every unique SiteID

Episode
----------------------
SiteID int
SeriesCode varchar(6)
EpisodeCode varchar(10)
...

我建议的设计/实现是

Site
----------------------------
SiteID int identity
Name varchar(50)


Series
-------------------------------------------
SeriesID int identity, surrogate key
SiteID int natural key
SeriesCode varchar(6) natural key
UNIQUE(SiteID, SeriesCode)
...

Episode
-------------------------------------------
EpisodeID int identity, surrogate key
SeriesID int foreign key
EpisodeCode varchar(6) natural key
...

这有什么问题吗?可以在这里将 SeriesID 代理作为外键吗?我不确定我是否遗漏了任何可能出现的明显问题。或者使用复合自然键(SiteID+SeriesCode/SiteID+EpisodeCode)会更好吗?从本质上讲,这会将剧集表与系列表分离,但这不适合我。

值得补充的是,在填充这些表的原始输入数据中,SeriesCode 看起来像“ABCD-1”,EpisodeCode 看起来像“ABCD-1NMO9”,所以我认为这是另一件事可以更改。

*:“虚拟”外键,因为之前是上级决定的,所以我们不应该使用实际外键

最佳答案

是的,一切看起来都很好。我可能提出的唯一(次要)观点是,除非您有另一个第四个子表卡在 Episode 上,否则您可能不需要 EpisodeId,因为 Episode.EpisodeCode 是足以识别和定位 Episode 中的行的单个属性自然键。当然,把它留在那里并没有什么坏处,但作为一般规则,我添加代理键作为子表中 FK 的目标,并尝试向每个表添加一个自然键来识别和控制冗余数据行......因此,如果一个表没有其他表有 FK 引用它,(而且永远不会)我有时不会费心在其中包含代理键。

关于sql - 代理键作为复合键的外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1631071/

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