使用多列作为位置或超类型/子类型?

tca*_*vin 6 database-design sql-server

给定一个设备实体,它有一个位置,通常称为行踪。这可以参考:

  • 用户实体(将在下周使用并负责设备的员工)。

  • 供应商实体(如果设备正在维修)。

  • 一个 StorageLocation 实体(如果设备已放好)。

一件设备一次只能在一个地方,即使那个地方不是物理位置。

这个会比较好吗:

  • 拥有具有三列(UserId、VendorId、StorageLocationId)的设备,以便其中一列必须不为空,而另外两列必须为空(由约束强制执行)?

  • 或者让 Equipment 的 WhereaboutsId 引用某种类型的超类型表,然后作为子类型表链接到 User、Vendor 和 StorageLocation,即使它们不共享其他公共属性?

  • 或者是其他东西?

Jon*_*gel 5

我的设计方法是考虑假设:

  • 设计需要如何更改以添加第 4 种类型?
  • 它需要如何更改以存储公共属性?
  • 只为其中一种类型存储属性需要如何更改?

我认为在为所提出的设计回答上述问题的过程之后,很明显,使用超类型/子类型结构绝对是可行的方法(我敢说这是针对这种情况的最佳实践)。

当然,有些事情需要关注——例如,确保对于给定的超类型,匹配的记录必须恰好存在于 1 个子类型表中。使用编写良好的存储过程在类型之间进行“传输”(我认为您需要这样做),这应该很容易实现。