我正在设计一个工资系统,我设计了一个有几个表的数据库,这个问题与下面的表格有关
EMPLOYEE (Employee_ID [pk], Name,... etc)
LOCATION (Location_ID [pk], Name, Address, ...etc)
这两个表具有多到多个关系,因为一名员工可以在多个地点工作,而在一个地点,多名员工正在工作。
这两个表是通过ATTENDANCE
表关联的。
ATTENDANCE (Employee_ID, Location_ID, Shift_Type, In, Out)
Shift类型要么是"Day“,要么是”黑夜“,"In”/ "Out“字段是DateTime
字段。shift类型是根据" in“字段中的日期确定的。例如,如果员工的In
字段是-06/22/2014 07:30:00 PM
,那么shift类型是Night
,shift属于22/06/2014。(他的Out
时间是23/06/2014 07:30AM
,那是在第二天)
条件是,员工不能在同一天工作两次,甚至在两个地点。但是员工可以白天在一个地方工作,晚上在另一个地方工作。
我最初的主键选择考勤表是(Employee_ID + In)
,但这是错误的,因为如果In
时间在两次情况下略有不同,员工可以在同一天工作同一班。
所以现在我知道主键应该是一些类似于(Employee_ID + Shift_Type + Shift_Date)
的东西。但问题是我在出勤表中没有日期字段。但是我有In
字段,它是DateTime
字段。
我对这个问题的理解是正确的.
我的问题是,如果在考勤表中添加另一个字段为Shift_Date
,那么在为该表创建一个PRIMARY KEY
时,是否有可能获得字段In
的日期部分?
发布于 2014-06-22 19:25:50
您可以使用日期字段作为主键,但不能在字段的一部分上键入。你得用日期做一个单独的字段。
这种特殊情况通常不是通过将其构建到表的主键中来实现的。你的“员工不能在同一天工作两次,甚至在两个地点工作”是一条商业规则,不一定永远都是一样的。(天知道,外面有太多地方让他们的员工分班.)处理这个问题的一个更典型的方法是为主键生成一个自动递增字段,然后在更靠近用户界面的地方强制执行业务规则。
https://softwareengineering.stackexchange.com/questions/245720
复制相似问题