两个表之间的多个外键

时间:2013-04-26 03:09:11

标签: sql database

我有一个名为Tbl_Event的表,它存储即将发生的事件的基本信息。

Tbl_Event

EventID  Description  Location

我有另一个名为staff的表来存储员工信息

  Tbl_Staff

 StaffID  Name

现在每个事件都可以有多个工作人员,为实现这一点,我创建了一个新表

   tbl_Event_Staff

   RecordID  StaffID   EventID

StaffID和EventID对它们有一个COMBINED唯一约束。 还有一个附加条件,其中一名工作人员需要成为该活动的主管。实现这一目标的最佳解决方案是什么,我应该在tbl_event中添加一个额外的列 - SupervisorID

Tbl_Event

EventID  Description  Location  SupervisorID

并将其链接到StaffID上的tbl_Event_Staff(在这种情况下,这两个表之间将存在外键 - EventID和StaffID)

或 *我不认为这是冗余数据的最佳解决方案。

我应该向tbl_Event_Staff添加一个额外的列 - isSupervisor(bool),并且每行都有一个布尔变量,表示该EVENT的工作人员是否是主管。

 tbl_Event_Staff

   RecordID  StaffID   EventID   IsSupervisor
      1        10        3         true
      2        20        3         false
      3        30        3         false

有替代解决方案吗?

2 个答案:

答案 0 :(得分:1)

第一种解决方案更好,因为它会自动防止您创建零主管和/或具有多个主管的事件的事件:当事件的supervisor_id列不可为空时,您的RDBMS确保只有一个每个活动的主管。

如果您需要以带有true/false指示标记主管的表格的形式获得结果,您可以通过加入Tbl_Event并比较Tbl_Event.supervisor来获得结果到tbl_Event_Staff.StaffID

答案 1 :(得分:1)

我会使用第二种方法,但是,尽管可能,会对此表设置一个约束,以便每个EventID只有一个行可以作为主管。

如何执行此操作的详细信息因数据库而异 - 在某些系统中,可能必须使用触发器强制执行。在SQL Server中,可以使用过滤索引来完成:

CREATE UNIQUE INDEX ON EventStaff (EventID) WHERE IsSupervisor = 1

我还建议废除tbl_前缀 - 没有合理的理由使用前缀来区分SQL中的对象类型 - 语言的语法意味着您可以完全通过语言来判断对象的类型它在查询中的位置 - 除了一种情况。

我所指的情况是视图和表格可能出现在查询中的相同位置,并且无法区分。但是,这是一个好的事物 - 通常,您不应该关心您正在处理的对象是表还是视图 - 数据库开发人员应该可以自由地创建不同的表结构并使用视图代替原始表重新创建旧结构 - 现有查询不应受到影响。