具有所需外键与主键之间的区别是什么?

时间:2017-09-08 05:06:28

标签: database database-design foreign-keys visio erd

我承认这可能是一个非常愚蠢的问题,但因为我还没有在其他任何地方找到它,我想让它脱离我的脑海:

拥有主键所需的外键之间的区别是什么?

我正在研究赛车游戏的数据库。在此图表中,比赛必须在赛道上进行(因此必须在表Race上引用TrackID),并且我可能有一条赛道,其中很多场比赛都没有出现:

enter image description here

因此,Race to Track的最小基数应为1,将关系设置为识别。但这也会使得赛道上的TrackID成为PK。而且我不明白为什么我需要那个。所以我认为我宁愿把它作为一个必要的' FK;什么会改变除了没有它作为PK?使用TrackID作为Race上的FK,Microsoft Visio自动将最小基数设置为0,这让我头疼......

我是数据库建模的新手,这个问题可能很明显,但请帮助我更好地理解这一点。

3 个答案:

答案 0 :(得分:1)

有两种方法可以识别种族。您可以为每个种族分配一个唯一的RaceId,在这种情况下,RaceID会识别种族。这是几乎所有设计师都会采用的常见方式。这是我的方式,没有任何理由不这样做。

也可以指定仅在单个轨道中唯一的RaceID。也就是说,Id 123可能会有两场比赛,但是一场比赛在第一场比赛,另一场在第二场比赛。我想不出有任何理由这样做,但是可以做到。还有其他用例,这种上下文依赖是有意义的,但不是这个用例。

在第一种情况下,即你所绘制的图表,TrackID将是一个FK,但不是PK的一个组成部分。它可以被约束为非空,但这不会使其成为PK的一部分。

在第二种情况下,Race表中的TrackId将像以前一样是FK。但PK现在包括RaceId和TrackId。这可能是你通过识别关系的意思。

我不会传递Lap表似乎以我描述的第二种情况使用LapId。很多比赛都有第5圈,但你必须知道Lap Id和Race Id,才能知道你在谈论哪一圈。

答案 1 :(得分:1)

这是一个相当复杂的主题,已在SO before上讨论过。

让我们抛开Visio所做的一切 - 许多ERD工具太聪明或有缺陷。

识别关系是指孩子(种族)在没有父母(轨道)的情况下根本不存在的关系,以及孩子的主键包括父母的主键。一个常见的例子是带有订单行(子)的订单(父) - 订单行的主键可能是订单的主键和序列号的组合。删除订单时,将删除所有订单行。子项上的外键是不可变的,也是必需的。

非识别关系是指孩子在没有父母的情况下可以存在的关系,或父关键字可能发生变化的关系。

非识别关系可以是强制性的,也可以是可选的。说明强制性外键需要识别关系是错误的。

我相信在你的情况下,你有一个不识别的关系 - 比赛可以安排,但然后改变轨道。我不相信" track_id"应该是不变的;甚至可能是在赛道达成协议之前安排比赛的情况,因此的关系可以是可选的。

答案 2 :(得分:1)

从赛道到比赛的关系是{1}:{0,n},即每场比赛只在一个赛道中进行,每个赛道都有零到多场比赛。

  • 曲目ID唯一地标识曲目,因此生成此表的主键。
  • 种族的主键是种族ID,原因相同。
  • 此外,竞赛表中有一个跟踪ID,以便建立{0,1}:{0,n}关系。使此曲目ID不可为空,您将得到{1}:{0,n},这就是您想要的。

这不会使曲目ID成为比赛的主要或唯一键。离得很远。它在表格中并不是唯一的(因为许多比赛可以在同一轨道中进行)。

但是,我不知道Microsoft Visio如何通过{0,1}:{0,n}关系来告诉{1}:{0,n}的可空性/非空性。