员工进/出表 - 如何存储其他信息?

时间:2013-11-05 11:50:16

标签: database-design

在员工读取他的rfid卡后,我从多个rfid硬件设备获取记录。这些记录包含

  • 设备ID
  • 时间戳
  • DST /非DST
  • UID(RFID卡)
  • 项目ID(由用户选择)

阅读this stackoverflow question后,有两种设计数据库的方法:

  • 使用类似事件的表设计(每个记录是一个新行)
  • 使用类似时钟的表格设计(每个输入/输出对是一个新行)

使用后一种设计可以使报告/分析变得非常简单(例如“哪个员工的工作时间超过x小时?”,“哪个员工没有记录?”,“每个员工的总小时数?”,......)。

选项1

但由于我需要存储上述和外出记录的所有上述信息,我的表格设计如下:

RecordId | EmployeeId | TimestampIn | DstIn | UidIn | ProjectIdIn | TimestampOut | DstOut |...

这并不“看起来”就像是完成我需要的正确方法。


选项2

然后我考虑使用第二个表格来详细说明:

记录:

RecordId | EmployeeId | TimestampIn | TimestampOut

RecordDetails

RecordDetailsId | RecordId | Timestamp | Dst | Uid | ProjectId

这样我可以根据需要访问详细信息,但可以直接在记录表上进行基本计算。


选项3

第三个选项是使用事件表:

RecordId | EmployeeId | Timestamp | Dst | Uid | ProjectId | In/Out

这肯定有用,但以后分析/报告会更难(见上文)。


所以我的问题归结为:上述任何设计都被认为是我的问题的“最佳实践”,我应该选择其中一个选项吗? 虽然选项1在计算持续时间等方面看起来很好。我担心如果我需要添加额外的列,这最终会变得一团糟。

注意:如果记录进/出将由员工的最后一个条目确定。如果它是一个记录(在选项1/2中Out为空)那么它将是一个输入。

2 个答案:

答案 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

我的事件表尽可能小,因为这个数据会是    每当你的员工登录时重复。意味着其他一切都需要分开。

  • 您设备的密钥,然后在需要查询的情况下加入员工和项目。
  • '状态'列有点 value,1/0表示输入/输出。
  • 可在需要时派生DST。
  • 分配给员工的设备。如果您的员工更改设备 经常那么你可以有一个联合表'EmpDevice'。
  • 与上述项目相同。

答案 1 :(得分:0)

我建议使用事件表。事件表更容易审核和排除故障。

RecordId | EmployeeId | DeviceID | Timestamp | Dst | Uid | ProjectId 

输入/输出不在事件表中。输入或输出状态通过手动检查事件行或稍后处理来确定。

包含DeviceID允许稍后在确定员工错过进出事件后手动插入事件行。

举一个例子,你如何确定一个员工的早上8点到早上7点是最后一分钟23小时进/出项目推送还是错过了?