在员工读取他的rfid卡后,我从多个rfid硬件设备获取记录。这些记录包含
阅读this stackoverflow question后,有两种设计数据库的方法:
使用后一种设计可以使报告/分析变得非常简单(例如“哪个员工的工作时间超过x小时?”,“哪个员工没有记录?”,“每个员工的总小时数?”,......)。
但由于我需要存储上述和外出记录的所有上述信息,我的表格设计如下:
RecordId | EmployeeId | TimestampIn | DstIn | UidIn | ProjectIdIn | TimestampOut | DstOut |...
这并不“看起来”就像是完成我需要的正确方法。
然后我考虑使用第二个表格来详细说明:
记录:
RecordId | EmployeeId | TimestampIn | TimestampOut
RecordDetails
RecordDetailsId | RecordId | Timestamp | Dst | Uid | ProjectId
这样我可以根据需要访问详细信息,但可以直接在记录表上进行基本计算。
第三个选项是使用事件表:
RecordId | EmployeeId | Timestamp | Dst | Uid | ProjectId | In/Out
这肯定有用,但以后分析/报告会更难(见上文)。
所以我的问题归结为:上述任何设计都被认为是我的问题的“最佳实践”,我应该选择其中一个选项吗? 虽然选项1在计算持续时间等方面看起来很好。我担心如果我需要添加额外的列,这最终会变得一团糟。
注意:如果记录进/出将由员工的最后一个条目确定。如果它是一个记录(在选项1/2中Out为空)那么它将是一个输入。
答案 0 :(得分:1)
不知道这有多大帮助,但我会这样做。
Employee
PK EmpId | Name | ect..
EmpDevice
PK EmpDeviceId | FK EmpId | FK DeviceId | ActiveFrom | ActiveTo
Device
PK DeviceId | FK EmpDeviceId | Name | Serial Number | ect..
EmpProj
PK EmpProjId | Fk ProjectId | Fk UserId | ActiveFrom | ActiveTo
Event
PK EventId | Fk DeviceId | Timestamp | Status
我的事件表尽可能小,因为这个数据会是 每当你的员工登录时重复。意味着其他一切都需要分开。
答案 1 :(得分:0)
我建议使用事件表。事件表更容易审核和排除故障。
RecordId | EmployeeId | DeviceID | Timestamp | Dst | Uid | ProjectId
输入/输出不在事件表中。输入或输出状态通过手动检查事件行或稍后处理来确定。
包含DeviceID允许稍后在确定员工错过进出事件后手动插入事件行。
举一个例子,你如何确定一个员工的早上8点到早上7点是最后一分钟23小时进/出项目推送还是错过了?