マイナーノート
- 私はテーブルとカラム名の単数形好む
のでNominees
等、Awards
がAward
なり、Nominee
なり
コメントで。
主要notees
@Olivierが指摘するように、m::n
関係が中間テーブルは、Nominated
1と同様に、化合物(NomineeId, NominationId)
にUNIQUE
制約を有することになります。したがって、自動生成された(サロゲート)キーを削除し、複合キーをPRIMARY KEY
にする方が良いでしょう。これは関係のnatural keyであり、主キーとして使用することにはいくつかの利点があります。 surrogate keyは、より広い行ともう1つの無駄なインデックスを持つことを除けば、この場合はまったく役に立たない。自然キーの2つの部分は、とにかく結合するために使用されます。
Nomination
テーブルについても同じことが適用されます。化合物(FilmId, AwardCategoryId, EventId)
はUNIQUE
キーになります。同じイベントで同じ賞カテゴリの映画が2つもノミネートされないようにするため、代理キーを削除して、この化合物を主キーにすることをおすすめします。同じ映画の同じAwardCategoryに対して2つのノミネートを持っているかもしれません.2つの'Best Supporting Actor'
のように、NominatioNo
をプライマリキーに追加してください(これは後で、特定のカテゴリのノミネートを制限したい場合に便利です。定数5と言う)。
ここで、Nominated
テーブルを再検査して、化合物(NomineedId, FilmId, AwardCategoryId, EventId)
プライマリキーを持ち、これら4つのカラムだけを属性として持つということです。
私はEvent
とCeremony
テーブルがストアに意図されている正確に何のわからないんだけど、Ceremony
テーブルが別の儀式(例えば'Oscar Awards'
、'Strawberry Awards'
)に関する情報を格納するためのものであることを前提としますとEvent
テーブルを格納することです1年間の式典に関する情報(例:('Oscar', 2011), ('Oscar', 2012), ('Starwberry Awards', 2012)
)。そこでYear
をEvent
テーブルに移動し、(CeremonyId, EventYear)
のPriamry Key of Eventを作成します。 (私は非常に間違っている可能性があります、あなたはあなたのデータをよく知っています。)。
ので、Nomination.EventId
はさらに長くなるNominated
CeremonyId
とEventYear
との両方Nomination
の主キーによって置き換えられています! (それは主キーとしてナチュラルキーを使用することの1つの欠点です)。
Database Design 1 http://img594.imageshack.us/img594/9592/oscarw.png
あなたが簡単に指名が(CeremonyId, EventYear, AwardCategoryId)
にユニーク制約が施行思われるカテゴリ(優勝ストアに(Nomination
へ1:1
関係を持つテーブルとして)NominationWinner
を追加することができます。私たちはこれまで持っているものを見ることができますそれ)。その複合主キーが不器用に見えるかもしれませんが、テーブルを結合するときに役立ちます持っ
Database Design 1 http://img845.imageshack.us/img845/2108/oscar3x.png
:デザインはこのようになります。 50歳代と60歳代の「ストロベリー賞」のすべての受賞者を見つけ、「女優」のカテゴリーのみを検索し、賞がどの映画のものであるかを見たいとします。すべての中間テーブルに参加する必要はありません。代わりに、あなただけのNominationWinner
、Nominee
、Ceremony
、Film
とAwardCategory
テーブルを使用して(とのみNominated
中間テーブルを使用して)データをretriveことができます。
SELECT ne.Name AS Winner
, wi.EventYear AS Year
, aw.AwardCategoryTitle AS Category
, fm.Title AS FilmTitle
FROM
NominationWinner AS wi
JOIN
Ceremony AS ce
ON ce.CeremonyId = wi.CeremonyId
JOIN
AwardCategory AS aw
ON aw.AwardCategoryId = wi.AwardCategoryId
JOIN
Film AS fm
ON fm.FilmId = wi.FilmId
JOIN
Nominated nd
ON nd.CeremonyId = wi.CeremonyId
AND nd.EventYear = wi.EventYear
AND nd.AwardCategory = wi.AwardCategory
AND nd.NominationNo = wi.NominationNo
AND nd.FilmId = wi.FilmId
JOIN
Nominee AS ne
ON ne.NomineeId = nd.NomineeId
WHERE
ce.CeremonyTitle = 'Strawberry Awards'
AND wi.EventYear BETWEEN 1950 AND 1969
AND aw.AwardCategoryTitle LIKE '%Actress%'
賞を受賞している場合、なぜそれが別のテーブルにあります候補者(結局、それは候補者の1人でなければならない) –
@RowlandShaw 'Award.name'は賞の名前です。 'ベスト俳優'。 –
映画に関連していない "生涯達成"のような賞を考えたいですか? – Digbyswift