0

乐队和成员之间的关系,'MemberOf',包括成员id(Mid)、乐队id(Bid)、'StartYear'、'EndYear'和'Instrument'。Mid 和 Bid 分别是 Member 和 Band 关系的外键,但在这种情况下,我很难确定“MemberOf”关系的主键。

注意:如果成员从开始就在乐队中,则开始年份可以为空,如果成员仍在乐队中,则结束年份也可以为空。

在这种情况下,开始和结束年份不能用作 PK,因为它们可能包含空值,但成员 id 和乐队 id 的信息不足以成为唯一的 - 例如,同一成员在以后返回同一乐队。

这是否意味着不存在主键?谢谢。

4

5 回答 5

3
于 2011-01-22T15:41:45.607 回答
1

注意:如果成员从一开始就在乐队中,则开始年份可以为空

好吧,这个荒谬的要求是您问题的最大部分。存储年份。

{BandId, MemberId, StartYear} 作为主键。

不过,这不适用于 2 月开始、3 月退出并在 7 月重新开始的成员。

于 2011-01-22T15:16:25.943 回答
0

一种可能的解决方案是将 StartYear 值存储为波段开始的年份。这样,您可以使用 (MId, BId, StartYear) 作为主键,假设成员每年只能加入和退出一次(如您的设计所建议的那样)。

要测试“原始成员”,您将 MemberOf.StartYear 与 Band.StartYear 进行比较以获得相等性。

否则不,您没有有效的主键,需要添加某种消除歧义的列(JoinNumber 或其他东西),这似乎是不受欢迎的额外工作。

于 2011-01-22T15:14:37.757 回答
0

替代文字

  • 人类历史上的一切都发生在某个时间点,所以不能StartYear为NULL——真的。

如果您IsCurrent改为引入,EndYear则根本没有 NULL。如果您确实选择保留EndYear,通常的做法是在很远的将来加载某个日期,例如3000-01-01. 最后,如果您确实保留并保留EndYearNULL——这并不悲惨,唯一的问题是可能很难区分丢失的数据和当前的成员资格。

注意:StartDate可能比StartYear.

于 2011-01-22T16:22:50.287 回答
0

您是对的,不能将日期视为 PK 的一部分,因为它们是会随时间变化的数据。我认为你有两个选择:

1) 将 MemberOf 记录拆分为带有子表的父子对,可能称为 MemberOfYears,包含 Mid、Bid 和 Year,而父 MemberOf 只是变成 Mid & Bid。因此,成员是该特定乐队成员的每一年都会包含一个 MemberOfYears 记录。

2) 向 MemberOf 关系表添加人工键,并将其用作主键。

于 2011-01-22T14:22:36.647 回答