如何在关系数据库中建模动态关系

时间:2018-11-02 14:19:53

标签: database relational-database entity-relationship data-modeling

我有一个数据建模问题,这种问题肯定经常发生,但是不幸的是我找不到合适的资源。希望您能帮到我

我有两个桌子

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

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

EmployeesAtDepartment = [EmplID,DepID]

在这里,表 EmployeesAtDepartment 将在每个雇员与她所在的部门之间建立关系(大多数情况下只有一个部门,但是可能属于多个部门)。

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

现在我的问题是:在关系数据库中可以使用哪些概念来建模这些“时变关系”?

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:1)

值得仔细考虑各种用例。

您的第一个模型本能地正确-它不重复数据。这也使回答“ X人从部门y移到哪个日期?”,“多少人在日期a和b之间改变部门”,“ y y处在x部门中有多少人”这样的问题变得容易回答。 ,“部门中任何人最长的逗留时间”。

它还允许您在部门变更中附加更多详细信息-原因码,注释等。

最后,感觉起来要容易得多-您不需要计划的工作来复制数据的每日版本。

您的第二个选项的好处是,您可以从其中一个查询(谁在日期y属于x部门)中忘记一个where子句。我认为这不值得进行取舍-尤其是因为弄清楚上面的一些问题变得相当困难

答案 1 :(得分:-1)

通过philipxy'c评论,我发现了“尺寸缓慢变化”的概念 https://en.wikipedia.org/wiki/Slowly_changing_dimension, 描述了关系模型中问题的几种解决方案。

此外,还有“时间数据库” https://en.wikipedia.org/wiki/Temporal_database,可以保留所有更改的历史记录。