database - 如何在关系数据库中建模动态关系
问题描述
我有一个经常出现的数据建模问题,但不幸的是我找不到合适的资源。我希望你能帮帮我:
我有两张桌子
部门= [DepID,部门名称,...]
员工= [EmplID,姓名,地址,...]
EmployeesAtDepartment = [EmplID,DepID]
在这里,EmployeesAtDepartment表应该在每个员工和她工作的部门之间建立关系(通常只有一个,但也可能属于多个部门)。
随着时间的推移,员工可能会更换部门。我不仅需要知道 Employee-Department 关系的当前状态,还需要确定过去任何给定时间点的状态。
现在我的问题来了:有哪些概念可用于在关系数据库中对这些“时变关系”进行建模?
我的第一个猜测是向EmployeesAtDepartment添加额外的两个日期列,例如[StartedAtDate, QuitAtDate],如果员工当前在部门工作,则后者为NULL。在这种情况下,只有更改保存在数据库中。
另一种方法是为每个日期保存EmployeesAtDepartment的整个状态,即添加一个列[Date]。在这种情况下,数据被高度冗余地存储,但它可以很容易地确定给定日期的员工-部门关系。
您能否推荐任何有关上述方法优缺点的资源,或者有更好的方法吗?
谢谢!
解决方案
值得考虑各种用例。
您的第一个模型本能地是正确的 - 它不会重复数据。它还可以很容易地回答诸如“X 人在哪一天从 y 部门搬走?”、“有多少人在日期 a 和 b 之间更换部门”、“有多少人在日期 y 在 x 部门”之类的问题。 , “任何人在一个部门呆的最长时间是多少”。
它还允许您将更多详细信息附加到部门更改 - 原因代码、评论等。
最后,它感觉更容易管理 - 您不需要计划作业来复制每日版本的数据。
您的第二个选项的好处是您可以从一个查询中忘记一个 where 子句(谁在日期 y 时在部门 x)。我认为这不值得权衡 - 特别是因为弄清楚上面的一些问题变得相当困难
推荐阅读
- python - 如果在新标签 selenium 中打开链接,如何进一步处理?
- c# - 尝试将 S3 的响应序列化到 Stream 时获取 ReadTimeout (System.InvalidOperationException)
- java - 停止堆栈跟踪中显示的异常“工厂”方法
- shortest-path - Java 获取复杂网络的所有顶点之间的最短路径
- swift - Dismiss modal automatically after 1 sec of being shown - swiftui
- html - 如何使用css创建带有状态圈的圈子头像?
- javascript - 我想使用 JavaScript 制作一个 Discord meme 机器人
- python - 在 python 和类型提示中更改字典值类型
- java - 您可以从 websocket 读取整个帧还是应该逐字节读取
- python - 扩展矩阵的通用算法