在我的应用程序中,我有两个实体员工和工作组之间的关联。 这种关联通常会随着时间而变化,所以在我的数据库中我有类似的东西:
就业者
| EMPLOYEE_ID | NAME |
| ... | ... |
工作组
| GROUP_ID | NAME |
| ... | ... |
emplyees_workgroups
| EMPLOYEE_ID | GROUP_ID | DATE |
| ... | ... | ... |
假设我在员工1和组1之间有关联,从2014-01-01
开始有效。
当创建新关联时,例如从2014-02-01
开启,旧关联不再有效。
关联表的这种结构对于查询来说有点问题,但我实际上会避免向表中添加END_DATE
字段,因为它将是一个reduntant值,并且还需要执行insert + update或每次在关联中发生更改时更新两行。
那么你有没有想过创建一个更实用的架构来解决我的问题?这是更好的方法吗?
答案 0 :(得分:0)
你拥有所谓的缓慢变化的维度。这意味着您需要在employees_workgroup
表中包含日期,以便在适当的时间为一组员工找到合适的工作组。
处理此问题的最佳方法是使用日期,我经常在每一行调用effdate
和enddate
。这大大简化了查询,您尝试在特定时间点找到工作组。这样的查询可能看起来像这样的结构:
select ew.*
from employees_workgroup ew
where MYDATE between effdate and enddate;
现在考虑使用每个字段只有一个日期的相同结果。它可能是这样的:
select ew.*,
from employees_workgroup ew join
(select employee_id, max(date) as maxdate
from employees_workgroup ew2
where ew2.employee_id = ew.employee_id and
ew2.date <= MYDATE
) as rec
on ew.employee_id = rec.employee_id and ew.adte = ew.maxdate;
与查询中引入的复杂性相比,与update
一起执行insert
的费用最低。