首页 > 解决方案 > Shifts 的数据库架构设计

问题描述

我想检查我要使用的模式是否是存储以下数据的最有效方式。

数据代表消防员的轮班。每个班次都需要每个职级的一定数量的员工(消防员和厨师是两个职级)。

即在周一白班在文特鲁阿工作,您可能需要 4 名消防员和两名 cheifs。

每个班次所需的(消防员)人数取决于班次类型(白天、下午或晚上)、(消防站的)位置和一周中的某一天(dow)。

因此,定义一个地点在一周内所有级别的所有班次中的人员配备要求所需的记录总数变为

7(天)* 3(班次类型)* 2(等级)= 42 条记录。

当班次类型和星期几所需的员工数量在 90% 的情况下都相同时,这是很多记录。

我创建了以下架构:

CREATE TABLE locations (
    locationid INT PRIMARY KEY,
    location VARCHAR(100),
    CN VARCHAR(100)
  );
  
  INSERT INTO locations VALUES
    (1, 'FIRE/OPS/SANTAMONICA/ENG', 'Santa Monica Emergency'),
    (2, 'FIRE/OPS/VENTURA/EMG', 'Ventura County Emergency'),
    (3, 'FIRE/OPS/ORANGE/EMG', 'Orange Country Emergency');

 CREATE TABLE shiftstrength (
   ID INT PRIMARY KEY,
   shifttype ENUM ('Day', 'Afternoon', 'Night'),
   locationid INT,
   dow INT,
   rank ENUM ('Firefighter', 'Cheif I', 'Cheif II'),
   numberofstaff INT,
   FOREIGN KEY (locationid) REFERENCES locations(locationid)
 );
 
 INSERT INTO shiftstrength VALUES
   (1, 'Day', 1, 4, 'Firefighter', 4),
   (2, 'Day', 1, 4, 'Cheif I', 2),
   (3, 'Afternoon', 1, 4, 'Firefighter', 4),
   (4, 'Afternoon', 1, 4, 'Cheif I', 2),
   (5, 'Night', 1, 4, 'Firefighter', 4),
   (6, 'Night', 1, 4, 'Cheif I', 2),
   (7, 'Day', 2, 4, 'Firefighter', 4),
   (8, 'Day', 2, 4, 'Cheif I', 2),
   (9, 'Afternoon', 2, 4, 'Firefighter', 5),
   (10, 'Afternoon', 2, 4, 'Cheif I', 2),
   (11, 'Night', 2, 4, 'Firefighter', 5),
   (12, 'Night', 2, 4, 'Cheif I', 2),
   (13, 'Day', 3, 4, 'Firefighter', 4),
   (14, 'Day', 3, 4, 'Cheif I', 2),
   (15, 'Afternoon', 3, 4, 'Firefighter', 5),
   (16, 'Afternoon', 3, 4, 'Cheif I', 2),
   (17, 'Night', 3, 4, 'Firefighter', 5),
   (18, 'Night', 3, 5, 'Cheif I', 2),
   (19, 'Day', 1, 5, 'Firefighter', 4),
   (20, 'Day', 1, 5, 'Cheif I', 2),
   (21, 'Afternoon', 1, 5, 'Firefighter', 5),
   (22, 'Afternoon', 1, 5, 'Cheif I', 2),
   (23, 'Night', 1, 5, 'Firefighter', 5),
   (24, 'Night', 1, 5, 'Cheif I', 2),
   (25, 'Day', 2, 5, 'Firefighter', 4),
   (26, 'Day', 2, 5, 'Cheif I', 2),
   (27, 'Afternoon', 2, 5, 'Firefighter', 5),
   (28, 'Afternoon', 2, 5, 'Cheif I', 2),
   (29, 'Night', 2, 5, 'Firefighter', 5),
   (30, 'Night', 2, 5, 'Cheif I', 2),
   (31, 'Day', 3, 5, 'Firefighter', 4),
   (32, 'Day', 3, 5, 'Cheif I', 2),
   (33, 'Afternoon', 3, 5, 'Firefighter', 5),
   (34, 'Afternoon', 3, 5, 'Cheif I', 2),
   (35, 'Night', 3, 7, 'Firefighter', 5),
   (36, 'Night', 3, 7, 'Cheif I', 2);

我这样做的方式是生成大量记录。

是否可以将数据扁平化以将消防员和酋长的数量作为单个记录中的一个字段?

有没有更有效的方法来构建这些数据?

标签: mysqldatabase-design

解决方案


推荐阅读