与日期的关联表

时间:2014-01-27 12:00:42

标签: mysql database

在我的应用程序中,我有两个实体员工和工作组之间的关联。 这种关联通常会随着时间而变化,所以在我的数据库中我有类似的东西:

就业者

| 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或每次在关联中发生更改时更新两行。

那么你有没有想过创建一个更实用的架构来解决我的问题?这是更好的方法吗?

1 个答案:

答案 0 :(得分:0)

你拥有所谓的缓慢变化的维度。这意味着您需要在employees_workgroup表中包含日期,以便在适当的时间为一组员工找到合适的工作组。

处理此问题的最佳方法是使用日期,我经常在每一行调用effdateenddate。这大大简化了查询,您尝试在特定时间点找到工作组。这样的查询可能看起来像这样的结构:

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的费用最低。