如何在一行中创建多个外键工作实例

时间:2017-04-24 09:43:22

标签: sql database database-design foreign-keys foreign-key-relationship

Hello人员和其他SQL程序员。

我一直在尝试制定一个位于工业界的现实模型。 客户端,数据库按以下状态排序: 他的员工有多个不同的工作地点/办公室。每个工作场所/办公室都有一定数量的人可以在这里工作 - 最小和最大。每个工作场所都有一群人,至少有2人,最多4人。一次只能在一个工作场所驻扎一个小组。该小组还有一些规范,例如 - 其中没有领导者 - 每个人都是平等的。某个工作人员一次只能分配给一个组。历史上有证据表明谁在哪里工作以及工作多久。

我一直在尝试使用它的属性工作表设计很长一段时间,但在我看来,到目前为止我所做的一切都有一些严重漏洞而且非常混乱。我非常感谢你们的任何反馈和建议。提前谢谢。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,您有两个实体:employeeoffice。这些将需要两个表:

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