首页 > 解决方案 > 如何在关系数据库中建模动态关系

问题描述

我有一个经常出现的数据建模问题,但不幸的是我找不到合适的资源。我希望你能帮帮我:

我有两张桌子

部门= [DepID,部门名称,...]

员工= [EmplID,姓名,地址,...]

EmployeesAtDepartment = [EmplID,DepID]

在这里,EmployeesAtDepartment表应该在每个员工和她工作的部门之间建立关系(通常只有一个,但也可能属于多个部门)。

随着时间的推移,员工可能会更换部门。我不仅需要知道 Employee-Department 关系的当前状态,还需要确定过去任何给定时间点的状态。

现在我的问题来了:有哪些概念可用于在关系数据库中对这些“时变关系”进行建模?

我的第一个猜测是向EmployeesAtDepartment添加额外的两个日期列,例如[StartedAtDate, QuitAtDate],如果员工当前在部门工作,则后者为NULL。在这种情况下,只有更改保存在数据库中。

另一种方法是为每个日期保存EmployeesAtDepartment的整个状态,即添加一个列[Date]。在这种情况下,数据被高度冗余地存储,但它可以很容易地确定给定日期的员工-部门关系。

您能否推荐任何有关上述方法优缺点的资源,或者有更好的方法吗?

谢谢!

标签: databaserelational-databaseentity-relationshipdata-modeling

解决方案


值得考虑各种用例。

您的第一个模型本能地是正确的 - 它不会重复数据。它还可以很容易地回答诸如“X 人在哪一天从 y 部门搬走?”、“有多少人在日期 a 和 b 之间更换部门”、“有多少人在日期 y 在 x 部门”之类的问题。 , “任何人在一个部门呆的最长时间是多少”。

它还允许您将更多详细信息附加到部门更改 - 原因代码、评论等。

最后,它感觉更容易管理 - 您不需要计划作业来复制每日版本的数据。

您的第二个选项的好处是您可以从一个查询中忘记一个 where 子句(谁在日期 y 时在部门 x)。我认为这不值得权衡 - 特别是因为弄清楚上面的一些问题变得相当困难


推荐阅读