如果我理解正确,你有两个实体:employee
和office
。这将需要两个表:
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
让我们看看你已经尝试了什么,并说明其存在的问题。 – jarlh
基本上我按照客户的要求制作了表格:“工作人员”有(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)组成 –
问题是我无法确定如何使Shift中的人数可以从2到4。因此,问题将从我需要多次创建属于Worker's表中工作人员的外键的多个实例指向Shift表格多次(2到4次),这在我看来非常混乱并且可能会导致实际问题,因为你可以有一个只由2人组成的班次,然后同时有3或4人。如何使这项工作? –