0

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

Tbl_Event

EventID  Description  Location

我有另一个表叫员工,它存储员工信息

  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) 并且每一行都有一个布尔变量,表示该事件的员工是否是主管。

 tbl_Event_Staff

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

或者

有替代解决方案吗?

4

2 回答 2

1

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

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

于 2013-04-26T03:17:06.000 回答
1

我会使用第二种方法,并且,尽管可能,会在这个表上设置一个约束,这样每个表只有一行可以EventID是主管。

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

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

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

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

于 2013-04-26T06:34:22.327 回答