数据库设计 - 单独 table 与常见 table 中的单个子类型

Database design - single subtype in a separate table vs common table

在一个送餐应用程序中,我有一个 USERS table,其中包含有关用户数据的信息,例如名字、姓氏、电子邮件、密码等。

一小部分用户(约占所有用户的 1%)将分配派送员角色。这意味着会有一些特定于送货人的数据,例如驾照 ID、average_rating 等等。

我不确定哪个更好:有一个 USERS table 来保存所有数据(这意味着对于大多数用户而言,特定于送货员的列将为空) 或者有一个子类型 table (DELIVERY_PERSON) 将保存这些列和 USERS table?

的外键

选项 #1

用户:

选项 #2

用户:

DELIVERY_PERSON:

我在 SO 上看到过几个类似的问题,但在所有这些问题中都有多个子类型,例如 Vehicle -> Car/Airplane/Boat 等

在我的场景中,只有一种基本类型(用户)和一种可能的扩展子类型(送货员)。我想知道只有一种可能的子类型是否会以某种方式影响选择的选项。

在我看来,子类型的“干净”实现是为每个子类型创建一个单独的 table 并为超类型创建一个通用的。 这避免了复杂的完整性条件并减少了空值的数量。

为了说明复杂的完整性条件是如何产生的,假设您有一个超类型和一个子类型以及 10 个额外的 强制性 属性(“列”)和几个可选属性。 现在,如果单个可选 属性 是非空的,那么 10 个额外的强制属性也必须是非空的。 如果你想象你有 12 种亚型而不是只有一种,情况会变得更糟。

另一方面,如果您将所有内容都存储在一个 table 中,则不必执行联接。如果您经常需要额外的列,这是一个性能优势,可以累加起来。 自然这只是部分正确。如果您有很多子类型,则行会很长。这会降低数据缓存的有效性。

如果您的应用程序不经常需要附加信息,最好为附加列保留一个单独的 table。如果它一直需要所有信息,您最好使用包含所有内容的单个 table。

简而言之:您的问题没有通用的答案。 最好的方法是根据您的应用程序和我的考虑进行猜测。然后您实施它并测试您的实施性能是否满足您的要求。如果是这样,你有一个有效的实施。如果没有,请尝试其他策略。