【发布时间】:2017-02-02 23:37:21
【问题描述】:
在我们的数据库设计中,我们有几个表来描述不同的对象,但它们具有相同的基本类型。由于描述实际表和每列正在做什么需要很长时间,我将尝试通过使用基于作业数据库的类似结构化示例来简化它。
假设我们有以下表格:
这些表彼此之间没有连接,但共享相同的列。所以第一步就是统一相同的列,引入唯一的personId:
现在我们有了 person 中的“标题”列,然后使用 personId PK 作为 FK,使用 1 对 1 关系将它们链接到更具体的作业表。在我们的用例中,一个人只能拥有一份工作,因此 personId 在 Taxi driver、Programmer 和 Construction worker 表中也是唯一的。
虽然这种结构有效,但我们现在有这样一个用例,在我们的应用程序中,我们获取 personId 并希望获取相应工作表的数据。这给我们带来了一个问题,即我们无法立即知道拥有此 personId 的人在做什么。
我们想出了几个解决这个问题的方法:
在后台处理
这意味着保持架构不变并在后端代码中查找正确的表。这可能意味着查看存在的每个表和/或构建一个半复杂的连接选择,我们必须在其中筛选所有列以找到已填充的列。
总而言之:可能但意味着很多不必要的选择。我们还希望在实际数据库中保留这种面向数据库的逻辑。
使用类型字段
这意味着在 Person 表中添加一个字段列,例如用数字填充以确定正确的子表,例如:
因此,如果是出租车司机,则可以在 Type 中添加 0,如果是程序员,则可以添加 1,依此类推...
虽然这大大减少了后端逻辑的数量,但我们必须确保我们在 Type 字段中使用的数字在后端是已知的并且永远不会改变。
为每个表使用单独的 ID
这意味着每个工作在 Person 中都有自己的 ID(必须可以为空),例如:
现在,由于其他人的 ID 为空,因此很容易找出每个人从事的工作。
所以我的问题是:这些设计中哪一种是最佳实践?我在这里错过了一个明显的解决方案吗?
【问题讨论】:
-
我想我会选择类型字段选项。但是,您为什么要放弃您开始使用的简单 3 表模型?
-
鉴于您已有的内容,添加一个 PersonTypeId,并将其作为 PersonTypes 表的 FK。第一个解决方案需要大量开销来记住您已经知道的东西,最后一个解决方案很快变得非常复杂,并且还引入了一个人与两个或多个工作类型相关联的可能性(这可能是可以的),但令人困惑。
-
@BobC 由于名称和年龄列在所有表中都是相同的,这仅意味着在进行大量维护时,例如,所有工作类型的名称列需要稍长一些。此外,我们希望有一个唯一的 ID 来识别一个人。在多个展开的桌子上设置它会很麻烦。此外,它不会真正帮助我们解决问题,因为我们仍然会遇到问题,试图找出 ID 为“3”或名称为“Dave”的人从事什么工作。
-
我通常选择#2,即有一个类型字段,但使用枚举而不是 ID 字段,例如'TAXI-DRIVER'、'PROGRAMMER'、'CONSTRUCTION-WORKER' 带有检查约束。
标签: database oracle database-design