Hello人员和其他SQL程序员。
我一直在尝试制定一个位于工业界的现实模型。 客户端,数据库按以下状态排序: 他的员工有多个不同的工作地点/办公室。每个工作场所/办公室都有一定数量的人可以在这里工作 - 最小和最大。每个工作场所都有一群人,至少有2人,最多4人。一次只能在一个工作场所驻扎一个小组。该小组还有一些规范,例如 - 其中没有领导者 - 每个人都是平等的。某个工作人员一次只能分配给一个组。历史上有证据表明谁在哪里工作以及工作多久。
我一直在尝试使用它的属性工作表设计很长一段时间,但在我看来,到目前为止我所做的一切都有一些严重漏洞而且非常混乱。我非常感谢你们的任何反馈和建议。提前谢谢。
答案 0 :(得分:0)
如果我理解正确,您有两个实体:employee
和office
。这些将需要两个表:
employee: id, name, whatever_else
office: id, desc, min_employees, max_employees, whatever_else
从理论上讲,这两个实体之间的关系是one-to-many
,因为您说每个员工一次只能分配到一个办公室,因此您可以向{{office_id
外键添加employee
个外键。 1}}表。
然而,必须跟踪历史记录意味着每个员工可能与办事处有多个关联,从而建立关系many-to-many
。然后,您将需要另一个表来对其进行建模:
employeeOffice: employee_id, office_id, start_date, end_date
使用这个模型,我想你需要执行的查询会非常简单;例如,找到当前分配给每个办公室的员工数量
select t1.id, t1.desc, count(distinct t2.employee_id)
from office t1
join employeeOffice t2
on t1.id = t2.office_id
where t2.end_date is null
group by t1.id, t1.desc
修改强>
以此样本数据为例
employee
id | name
1 | name1
2 | name2
3 | name3
4 | name4
5 | name5
6 | name6
7 | name7
office
id | desc
1 | office1
2 | office2
employeeOffice
employee_id | office_id | start_date | end_date
1 | 2 | '01-01-2107' | '31-01-29107'
1 | 1 | '01-02-2107' |
2 | 1 | '01-01-2107' |
3 | 1 | '01-01-2107' |
4 | 1 | '01-01-2107' |
5 | 2 | '01-01-2107' | '01-03-2107'
6 | 2 | '01-01-2107' |
7 | 2 | '01-01-2107' |
这意味着员工1在办公室2中度过了一个月,然后被分配到办公室1.员工5在两个月后辞职(或被解雇),因为他没有空end_date
的记录。 / p>
上面的示例查询将为您提供
id | desc | count
1 | office1 | 4
2 | office2 | 2