如何使多个外键实例在一行中工作
How to make multiple instances of foreign key work in one row
各位 SQL 程序员大家好。
我一直在尝试建立一个位于工业界的实景模型。
订购数据库的客户端声明:
他的员工有多种不同的工作 locations/offices。每个 workplace/office 都有一定数量的人可以在这里工作 - 最小和最大。每个工作场所都有一组人,最少 2 人,最多 4 人。一次只能有一个小组驻扎在一个工作地点。该小组也有一些规范,例如 - 他们之间没有领导者 - 每个人都是平等的。某个工人一次只能分配给一个组。谁、在哪里工作以及工作了多长时间,历史上应该有证据。
我尝试 table 设计及其属性已经有一段时间了,但在我看来,到目前为止我所做的一切都存在一些严重的漏洞并且非常混乱。我非常感谢你们的任何反馈和建议。提前致谢。
如果我理解正确的话,你有两个实体:employee
和 office
。这些将需要两个 tables:
employee: id, name, whatever_else
office: id, desc, min_employees, max_employees, whatever_else
理论上这两个实体之间的关系是 one-to-many
,因为你说每个员工一次只能分配到一个办公室,所以你可以添加一个 office_id
外键到employee
table.
然而,必须跟踪历史记录意味着每个员工可能与办公室有多个关联,从而使关系 many-to-many
。然后您将需要另一个 table 来建模它:
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
.
上面的示例查询会给你
id | desc | count
1 | office1 | 4
2 | office2 | 2
各位 SQL 程序员大家好。
我一直在尝试建立一个位于工业界的实景模型。 订购数据库的客户端声明: 他的员工有多种不同的工作 locations/offices。每个 workplace/office 都有一定数量的人可以在这里工作 - 最小和最大。每个工作场所都有一组人,最少 2 人,最多 4 人。一次只能有一个小组驻扎在一个工作地点。该小组也有一些规范,例如 - 他们之间没有领导者 - 每个人都是平等的。某个工人一次只能分配给一个组。谁、在哪里工作以及工作了多长时间,历史上应该有证据。
我尝试 table 设计及其属性已经有一段时间了,但在我看来,到目前为止我所做的一切都存在一些严重的漏洞并且非常混乱。我非常感谢你们的任何反馈和建议。提前致谢。
如果我理解正确的话,你有两个实体:employee
和 office
。这些将需要两个 tables:
employee: id, name, whatever_else
office: id, desc, min_employees, max_employees, whatever_else
理论上这两个实体之间的关系是 one-to-many
,因为你说每个员工一次只能分配到一个办公室,所以你可以添加一个 office_id
外键到employee
table.
然而,必须跟踪历史记录意味着每个员工可能与办公室有多个关联,从而使关系 many-to-many
。然后您将需要另一个 table 来建模它:
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
.
上面的示例查询会给你
id | desc | count
1 | office1 | 4
2 | office2 | 2