2012-02-04 4 views
1

私は、賞やノミネートに関する情報を保存するためのシンプルなデータベースをまとめました。私はできるだけ多くのデータ冗長性を取り除こうとしました。ここでは、それが現在探している方法は次のとおりです。私のデータ構造はどうですか?

enter image description here

ノミネート表の理由は、私は1つの推薦は多くの候補者を持っているだろうことに気づいていることです。たとえば、Best ScreenplayKen Levine and David IsaacsまたはWoody AllenまたはJoss Whedon, Andrew Stanton, Joel Cohen and Alec Sokolowになります。

注:Award.nameは賞の名前です。 Best Actor

可能性のある改善点を教えていただきありがとうございます。

+0

賞を受賞している場合、なぜそれが別のテーブルにあります候補者(結局、それは候補者の1人でなければならない) –

+0

@RowlandShaw 'Award.name'は賞の名前です。 'ベスト俳優'。 –

+0

映画に関連していない "生涯達成"のような賞を考えたいですか? – Digbyswift

答えて

1

マイナーノート

  1. 私はテーブルとカラム名の単数形好む

    のでNominees等、AwardsAwardなり、Nomineeなり

  2. コメントで。


主要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つのカラムだけを属性として持つということです。

私はEventCeremonyテーブルがストアに意図されている正確に何のわからないんだけど、Ceremonyテーブルが別の儀式(例えば'Oscar Awards''Strawberry Awards')に関する情報を格納するためのものであることを前提としますとEventテーブルを格納することです1年間の式典に関する情報(例:('Oscar', 2011), ('Oscar', 2012), ('Starwberry Awards', 2012))。そこでYearEventテーブルに移動し、(CeremonyId, EventYear)のPriamry Key of Eventを作成します。 (私は非常に間違っている可能性があります、あなたはあなたのデータをよく知っています。)。

ので、Nomination.EventIdはさらに長くなるNominatedCeremonyIdEventYearとの両方Nominationの主キーによって置き換えられています! (それは主キーとしてナチュラルキーを使用することの1つの欠点です)。

Database Design 1 http://img594.imageshack.us/img594/9592/oscarw.png

あなたが簡単に指名が(CeremonyId, EventYear, AwardCategoryId)にユニーク制約が施行思われるカテゴリ(優勝ストアに(Nomination1:1関係を持つテーブルとして)NominationWinnerを追加することができます。私たちはこれまで持っているものを見ることができますそれ)。その複合主キーが不器用に見えるかもしれませんが、テーブルを結合するときに役立ちます持っ

Database Design 1 http://img845.imageshack.us/img845/2108/oscar3x.png

:デザインはこのようになります。 50歳代と60歳代の「ストロベリー賞」のすべての受賞者を見つけ、「女優」のカテゴリーのみを検索し、賞がどの映画のものであるかを見たいとします。すべての中間テーブルに参加する必要はありません。代わりに、あなただけのNominationWinnerNomineeCeremonyFilmAwardCategoryテーブルを使用して(とのみ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%' 
+0

うわー。私は離れて、これをより完全に吸収しなければなりません。本当にありがとう。一つのこと: "同じイベントの同じ賞カテゴリに2つの映画がノミネートされないようにする"。これは起こる。映画には、2つの異なる役者が支持的な役割を果たすことができるので、そのカテゴリには2つの異なるノミネートがあります。 (今年のオスカーのThe Helpで出てきたように) –

+0

それで、私は主キーを拡張し、整数に設定できる「ノミネーションノー」を追加しました。(また、常に5つのノミネートがある場合は1から5に制限しますカテゴリー)。残念ながら、MySQLにはタイプの制約がありません: 'CHECK(NominationNo BETWEEN 1 AND 5)' –

+0

ごめんなさい。私が言うように、私は離れて、すべてを読んで、適切にそれを吸収する必要があります。これをありがとう、私は徹底的に私のデータ構造を改善することを楽しみにしています! –

2

NOMINATEDテーブルは、NOMINEESNOMINATIONSの間にm:n関係を作成します。 NominatedID列を削除し、2つの列NomineeIDNominationIDを主キーとして使用します。これにより、同じ人物を同じ指名のために2回指名することができなくなります。提案@wildplasserとしてAwardCategoryとしてAwardテーブルの名前を変更する

NOMINEES    NOMINATED 
+---------------+  +---------------------+  NOMINATIONS 
| PK NomineeID |<----o| PK FK NomineeID |  +------------------+ 
+---------------+  | PK FK NominationID |o--->| PK NominationID | 
|  Name  |  +---------------------+  +------------------+ 
+---------------+         | FK FilmID  | 
                | FK AwardID  | 
                | FK EventID  | 
                +------------------+ 
+2

コンポジットプライマリキーは、1つではなく2つのIDを処理する必要があるため、実装するのが少し難しい傾向があります。これらの2つのフィールドに複合制約を設定するのではなく、複合制約を表すPKを使用して行を参照することはできます。それは私が考えるこのように少しきれいです。 –

+0

@JoePhilllips、あなたは 'NomineID'を保持しながら、' NomineeID'と 'NominationID'にUnique制約を追加できると言っていますか? –

+0

@DjangoReinhardtはい、まさに –