2014-01-27 41 views
0

在我的应用程序中,我有两个实体雇员和工作组之间的关联。 该协会通常随时间变化,所以在我的数据库我有类似:关联表与日期

就业者

| EMPLOYEE_ID | NAME | 
| ...   | ... | 

工作组

| GROUP_ID | NAME | 
| ...   | ... | 

emplyees_workgroups

| EMPLOYEE_ID | GROUP_ID | DATE | 
| ...   | ...  | ... | 

假设我有员工1和组1之间的关联,从2014-01-01有效。 创建新关联时,例如从2014-02-01开始,旧关联不再有效。

关联表的这种结构对于查询有点问题,但我实际上会避免在表中添加一个END_DATE字段,因为它将成为还原剂值,并且还需要执行insert + update或update每次在关联中发生更改时都有两行。

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

+0

我怀疑你现有的结构是否正常。不过,我认为更彻底的例子会更容易考虑。考虑提供适当的DDL(和/或一个sqlfiddle)与期望的结果集合在一起。大概一个员工每次只能与一个团队关联? – Strawberry

+0

_“关联表的这种结构对于查询有点问题”_ - 有点......也许 - 但它不应该在常见用例中遇到问题。或者,您是否已经想到在哪些地方会遇到无法解决的问题? – CBroe

回答

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; 

insert一起做一个update的费用进行比较复杂,这将在查询引入最小。

相关问题