2011-11-10 15 views
0

私は(括弧内のPKで)次の表を使用している場合...データベースに1対多の関係を正しく作成するにはどうすればよいですか?

Store { [StoreCode], PhoneNumber, Address, ...}

StoreHours { [id], DayofWeek, Open, Close, ClosedDate }

は今、私の考えは文句を言わない、すべての店である、彼らは日常の同じ時間を持っている習慣&同じ時間を持っています「OpenTimeA」、「OpenTimeB」、「OpenTimeC」、「CloseTimeA」、「CloseTimeB、...」のような複数の列を作成する代わりに、リレーションシップテーブルを作成することができます。しかし、私はそれらをやることに慣れておらず、最初に正しいことをしたいと思っています。ここで私の質問は、私はそれを行う場合は、この方法で...

  1. は、名前には良い方法があります...私は上の表に追加することを考えていたものを

    ​​

    ですテーブルをHas_aより大きくするか、名前を付けてストアの複数の異なるタイプの関係に使用することができます。たとえば、別のテーブルManagersを追加し、マネージャIDのテーブルHas_aにカラムを追加します。

    Store 
        StoreCode 
        PhoneNumber 
        Address 
        ... 
        PRIMARY KEY (StoreCode) 
    
    StoreHours 
        StoreCode 
        DayOfWeek 
        OpenTime 
        CloseTime 
        PRIMARY KEY (StoreCode, DayOfWeek) 
        FOREIGN KEY (StoreCode) 
        REFERENCES Store(StoreCode) 
    

    あなたがいることに気付いた場合:

    のような...最初の質問については

StoreInformation { [StoreCode], TimeId, ManagerId, ...}

答えて

2

は、一つの可能​​な解決策は、(標準の1対多の関係)であります同じ時刻に開いたり閉じたりする多数の店舗があり、1週間中、Scheduleテーブルを追加できるので、複数の店舗で同じスケジュールを共有できます。

Store 
    StoreCode 
    ScheduleId 
    PhoneNumber 
    Address 
    ... 
    PRIMARY KEY (StoreCode) 
    FOREIGN KEY (ScheduleId) 
    REFERENCES Schedule(ScheduleId) 

Schedule 
    ScheduleId 
    ScheduleTitle 
    PRIMARY KEY (ScheduleId) 

ScheduleHours 
    ScheduleId 
    DayOfWeek 
    OpenTime 
    CloseTime 
    PRIMARY KEY (ScheduleId, DayOfWeek) 
    FOREIGN KEY (ScheduleId) 
    REFERENCES Schedule(ScheduleId) 
+0

私はこれをしても、店舗コードのほかに正確に同じ複数のレコードを持つ可能性はありますか? – daveomcd

+1

UNIQUE制約でもある 'PRIMARY KEY'制約のため、複数の同一レコードを持つことはできません。 –

+0

Doh!感謝しなかった!そして、閉鎖された日付を組み込むために、私は別のテーブル 'StoreClosed {[SchoolCode、Closed(Date)]}'を作成することができると思います... – daveomcd

2

あなたは、単一のソース・テーブルを関連付けることができますので、関係のこれらの種類を追跡するための汎用的なHas_aテーブルを作成して最大の問題は、あなたがあなたのテーブル間の外部キー関係を使用することはできないという事実であります単一の宛先テーブルに転送する。それに加えて、あなたのキーのGUIDを使用しない限り、特定のキーがどのテーブルに属しているかを知る方法がないので、偽の結果を得る可能性があります。

また、1対多の関係の場合、この種の中間テーブルは必要ありません。適切な外部キーを使用してStoreHoursテーブルにStoreCode列を追加できます。中間テーブルが必要な唯一のケースは多対多リレーションシップで、この場合はおそらく必要ありません(複数のストアで同じStoreHoursレコードを共有しない場合を除きます)。

+0

答えをありがとう! – daveomcd