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

How to make multiple instances of foreign key work in one row

各位 SQL 程序员大家好。

我一直在尝试建立一个位于工业界的实景模型。 订购数据库的客户端声明: 他的员工有多种不同的工作 locations/offices。每个 workplace/office 都有一定数量的人可以在这里工作 - 最小和最大。每个工作场所都有一组人,最少 2 人,最多 4 人。一次只能有一个小组驻扎在一个工作地点。该小组也有一些规范,例如 - 他们之间没有领导者 - 每个人都是平等的。某个工人一次只能分配给一个组。谁、在哪里工作以及工作了多长时间,历史上应该有证据。

我尝试 table 设计及其属性已经有一段时间了,但在我看来,到目前为止我所做的一切都存在一些严重的漏洞并且非常混乱。我非常感谢你们的任何反馈和建议。提前致谢。

如果我理解正确的话,你有两个实体:employeeoffice。这些将需要两个 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