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

Sql server 如何在数据库中正确创建1对多关系?,sql-server,database-design,object,Sql Server,Database Design,Object,如果我有以下表格(括号内为PKs) Store{[StoreCode],电话号码,地址,…} StoreHours{[id],DayofWeek,Open,Close,ClosedDate} 现在我的想法是,每个商店不会有相同的时间&他们不会每天有相同的时间,而不是在商店表中创建多个列,例如,“OpenTimeA,OpenTimeB,OpenTimeC,CloseTimeA,CloseTimeB,…”,然后我可以创建一个关系表。然而,我不习惯这样做,我想继续下去,第一次就把事情做好。下面是我想添

如果我有以下表格(括号内为PKs)

Store{[StoreCode],电话号码,地址,…}

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

现在我的想法是,每个商店不会有相同的时间&他们不会每天有相同的时间,而不是在商店表中创建多个列,例如,“
OpenTimeA
OpenTimeB
OpenTimeC
CloseTimeA
CloseTimeB
,…”,然后我可以创建一个关系表。然而,我不习惯这样做,我想继续下去,第一次就把事情做好。下面是我想添加到上述表格中的内容

有{[StoreCode,id]}

我的问题是如果我这样做

  • 有没有比
    有_a
    更好的表命名方法,或者我可以将其命名并用于商店的多种不同类型的关系。例如,添加另一个表
    Managers
    ,并向
    Has\u a
    表中添加一列,用于管理器ID


  • StoreInformation{[StoreCode],TimeId,ManagerId,…}

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

    如果您注意到一周中的所有日子都有许多商店在同一时间打开和关闭,您可以添加一个
    时间表
    表,以便多个商店可以共享同一时间表

    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) 
    

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

    如果您注意到一周中的所有日子都有许多商店在同一时间打开和关闭,您可以添加一个
    时间表
    表,以便多个商店可以共享同一时间表

    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) 
    

    创建一个泛型
    有一个
    表来跟踪这些类型的关系的最大问题是,您不能在表之间使用外键关系,因为您只能将单个源表与单个目标表关联。除此之外,除非对键使用guid,否则无法知道特定键属于哪个表,因此很可能会得到虚假的结果


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

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


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

    如果我这样做,除了storecode之外,我是否有可能拥有多个完全相同的记录?您不能拥有多个相同的记录,因为
    主键
    约束也是唯一的约束。Doh!我没注意到,谢谢!为了计算截止日期,我想我可以创建另一个表
    StoreClosed{[SchoolCode,closed(Date)]}
    。如果您打算在那里存储,那么存储根本不打开的日期(例如节假日),是的。一个与
    Store
    具有1对多关系的表是一个很好的解决方案。如果我这样做,除了storecode之外,我还可能有多个完全相同的记录?由于
    主键
    约束也是唯一的约束,因此不能有多个相同的记录。Doh!我没注意到,谢谢!为了计算截止日期,我想我可以创建另一个表
    StoreClosed{[SchoolCode,closed(Date)]}
    。如果您打算在那里存储,那么存储根本不打开的日期(例如节假日),是的。另外一个与
    Store
    具有1对多关系的表是一个很好的解决方案。