0

バンドとメンバーの関係「MemberOf」には、演奏されたメンバーID(Mid)、バンドID(Bid)、「StartYear」、「EndYear」、「Instrument」が含まれます。MidとBidは、それぞれメンバーとバンドの関係の外部キーですが、この状況で「MemberOf」関係の主キーを特定するのに苦労しています。

注:メンバーが開始からバンドに参加していた場合、開始年はnullになる可能性があり、メンバーがまだバンドに参加している場合、終了年もnullになる可能性があります。

この状況では、開始年と終了年はnull値を含む可能性があるため、PKとして使用できませんが、メンバーIDとバンドIDは一意にするのに十分な情報ではありません。たとえば、同じメンバーが後日同じバンドに戻ります。

これは、主キーが存在しないことを意味しますか?ありがとう。

4

5 に答える 5

3
于 2011-01-22T15:41:45.607 に答える
1

注: メンバーが最初からバンドに所属していた場合、開始年は null になる可能性があります

まあ、そのばかげた要件は、あなたの問題の最大の部分です. 年を格納します。

{BandId, MemberId, StartYear} を主キーとして。

ただし、2 月に入社し、3 月に退職し、7 月に再入社するメンバーには対応していません。

于 2011-01-22T15:16:25.943 に答える
0

考えられる解決策の 1 つは、バンドが開始された年として StartYear 値を格納することです。そうすれば、(設計で提案されているように)メンバーが 1 年に 1 回しか加入および脱退できないと仮定して、(MId、BId、StartYear) を主キーとして使用できます。

「元のメンバー」をテストするには、MemberOf.StartYear と Band.StartYear が等しいかどうかを比較します。

そうでなければいいえ、有効な主キーがなく、ある種のあいまいさを解消する列 (JoinNumber など) を追加する必要があります。これは望ましくない余分な労力のようです。

于 2011-01-22T15:14:37.757 に答える
0

日付は時間の経過とともに変化するデータであるため、PK の一部と見なすことはできません。次の 2 つのオプションがあると思います。

1) MemberOf レコードを、Mid、Bid、および Year を含む MemberOfYears と呼ばれる子テーブルとの親子ペアに分割し、親の MemberOf は Mid & Bid になります。そのため、メンバーがその特定のバンドのメンバーであった各年に 1 つの MemberOfYears レコードが含まれます。

2) MemberOf リレーションシップ テーブルに人工キーを追加し、それをプライマリとして使用します。

于 2011-01-22T14:22:36.647 に答える
0

代替テキスト

  • 人類の歴史のすべてはある時点で起こったので、NULLにすることはStartYearできません。

IsCurrent代わりにを導入するとEndYear、NULL はまったくありません。を保持することを選択した場合はEndYear3000-01-01. 最後に、NULL を保持してそのままにしておくと、EndYear悲惨なことではありません。唯一の問題は、欠落しているデータと現在のメンバーシップを区別するのが難しい場合があることです。

注:StartDateよりも適切な場合がありStartYearます。

于 2011-01-22T16:22:50.287 に答える