0

你好人和同行的SQL程序员。如何使外键的多个实例在一行中工作

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

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

+1

让我们看看你已经尝试了什么,并说明其存在的问题。 – jarlh

+0

基本上我按照客户的要求制作了表格:“工作人员”有(ID_W,Date_of_birth,Name,Surename),然后是“Work_place”(ID_W_P,Address,Pay_for_hour,Max_number_of_people,Min_number_of_people,Type) wok_goup“由(ID_W_G,Date,Start_of_Shift,End_of_Shift,Min_number_of_people,Max_number_of_people,Name)组成 –

+0

问题是我无法确定如何使Shift中的人数可以从2到4。因此,问题将从我需要​​多次创建属于Worker's表中工作人员的外键的多个实例指向Shift表格多次(2到4次),这在我看来非常混乱并且可能会导致实际问题,因为你可以有一个只由2人组成的班次,然后同时有3或4人。如何使这项工作? –

回答

0

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

employee: id, name, whatever_else 
office: id, desc, min_employees, max_employees, whatever_else 

理论上这两个实体之间的关系是one-to-many,因为你说的每一个员工都可以一次只被分配到一个办公室,所以你可以添加一个office_id外键employee表。

但是,如果要追踪历史记录,则意味着每个员工可能与办公室有多个关联关系,因此关系为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的记录。

这个例子查询上述会给你

id | desc | count 
1 | office1 | 4 
2 | office2 | 2 
+0

非常感谢你的解释,但我得到了关系(或者我想我会这样做),但是在查看Worker-Shift关系时遇到了更多麻烦。在每个班次中有2到4名工人,那么我将如何创建一个具有可变数量Worker_ID的行,每个行都引用一个独特的工人? –

+1

你不这样做。如果你有一个应用层,我会检查一个员工是否可以被添加到一个班次(在插入之前计算已经分配了多少人),否则你可以使用在插入之前检查的触发器 –

+0

因此,这些表将会如你所述,好吗?然后会有你提到的employeeOffice表。但是从我在该表中看到的只有一个可能的工作人员被放置 - 或者我得到那个错误?因为我认为employee_id需要在那里2次,或者是错误的?我只是试图查看并考虑将数据插入到其中以完成行的方式 - 我在开始时只需要在employeeOffice表/ Shift表中的2名工作人员,因为从您所说的我可以稍后添加它们。 –