2011-11-10 48 views
0

如果我有以下表(括號PKS)...如何在數據庫中正確創建一對多的關係?

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

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

現在我的想法是每家商店不會有相同的時間&他們不會每天都在同一時間,而不是在Store表中創建多個列,例如「OpenTimeA,OpenTimeB,OpenTimeC,CloseTimeA,CloseTimeB ......」,那麼我可以創建一個關係表。不過,我不習慣這樣做,並希望繼續前進,並在第一時間做好準備。這就是我的想法添加到上表的...

​​

我的問題是,如果我做這種方式...

  1. 有沒有更好的方式來命名錶格比Has_a還是可以將其命名並將其用於商店的多種不同類型的關係。例如,添加另一個表Managers,並向Has_a表中添加一列用於管理員ID。

    像...

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

回答

2

對於第一個問題,一個可能的解決方案是(標準1對多的關係):

Store 
    StoreCode 
    PhoneNumber 
    Address 
    ... 
    PRIMARY KEY (StoreCode) 

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

如果您發現您有許多商店在同一時間打開和關閉,在一週的所有日子裏,您可以添加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

由於'PRIMARY KEY'約束條件也是一個UNIQUE約束條件,所以不能有多個相同的記錄。 –

+0

Doh!沒有注意到,謝謝!並且爲了合併結束日期,我想我可以創建另一個表'StoreClosed {[SchoolCode,Closed(Date)]}'... – daveomcd

2

與跟蹤這些類型的關係創建一個通用的Has_a表中的最大的問題是事實,你不能使用你的表之間的外鍵關係,因爲你可以只涉及一個源表到單個目標表。除此之外,除非您使用您的密鑰的GUID,否則無法知道某個特定密鑰屬於哪個表,因此您可能會得到虛假結果。

此外,對於一對多關係,這種中間表不是必需的。您可以使用適當的外鍵將StoreCode列添加到StoreHours表中。唯一需要中間表的情況是多對多關係,在這種情況下可能不需要這種關係(除非您希望多個商店共享相同的StoreHours記錄)。

+0

感謝您的回答! – daveomcd

相關問題