繁体   English   中英

如何在数据库中正确创建一对多关系?

[英]How do I properly created a 1 to many relationship in my database?

如果我有下表(括号中有PK)...

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

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

现在,我的想法是每个商店都不会有相同的时间,而且每天也不会有相同的时间,而不是在Store表中创建多个列,例如“ OpenTimeAOpenTimeBOpenTimeCCloseTimeACloseTimeB ,...”,然后我可以创建一个关系表。 但是,我不习惯做这些事情,而是想继续进行,并在第一时间解决问题。 这就是我想添加到上表中的内容...

Has_a { [StoreCode, id ] }

我的问题是我是否以此方式做...

  1. 有没有比Has_a更好的命名表的方法,或者我可以为它命名并将其用于商店的多种不同类型的关系。 例如,添加另一个表Managers并在Has_a表中添加一列作为Manager ID。

    喜欢...

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

对于第一个问题,一个可能的解决方案是(标准的一对多关系):

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

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

如果您发现有很多商店在一周中的所有时间都同时打开和关闭,则可以添加一个Schedule表,以便多个Store可以共享相同的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) 

创建通用的Has_a表以跟踪这些类型的关系的最大问题是,由于只能将单个源表与单个目标表相关联,因此您将无法使用表之间的外键关系。 除此之外,除非您对密钥使用GUID,否则无法知道特定密钥属于哪个表,因此您可能会得到假结果。

同样,对于一对多关系,不需要这种中间表。 您可以使用适当的外键将StoreCode列添加到StoreHours表中。 您唯一需要中间表的情况是多对多关系,在这种情况下可能不需要(除非您希望多个商店共享同一StoreHours记录)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM