我有一个数据建模问题,这种问题肯定经常发生,但是不幸的是我找不到合适的资源。希望您能帮到我
我有两个桌子
部门 = [DepID,部门名称...]
员工 = [EmplID,姓名,地址...]
EmployeesAtDepartment = [EmplID,DepID]
在这里,表 EmployeesAtDepartment 将在每个雇员与她所在的部门之间建立关系(大多数情况下只有一个部门,但是可能属于多个部门)。
随着时间的推移,员工可能会更改部门。我不仅需要了解Employee-Department关系的当前状态,还需要确定过去任何时候的状态。
现在我的问题是:在关系数据库中可以使用哪些概念来建模这些“时变关系”?
我的第一个猜测是向 EmployeesAtDepartment 添加另外两个日期列,例如[StartedAtDate,QuitAtDate],如果该雇员当前在部门工作,则后者为NULL。在这种情况下,只有更改会保存在数据库中。
另一种方法是为每个日期保存 EmployeesAtDepartment 的整个状态,即添加一列[Date]。在这种情况下,数据将被高度冗余地存储,但是它使得确定给定日期的员工与部门的关系变得非常容易。
您能否推荐任何有关上述方法利弊的资源,或者有更好的方法吗?
谢谢!
答案 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,可以保留所有更改的历史记录。