0

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

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

阅读此 stackoverflow 问题后,有两种设计数据库的方法:

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

使用后一种设计将使报告/分析变得非常容易(例如“哪个员工的工作时间超过 x 小时?”、“哪个员工没有出勤记录?”、“每位员工的总小时数?”、...)。

选项1

但是由于我需要存储所有上述信息以用于进出记录,因此我的表格设计如下所示:

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

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


选项 2

然后我考虑使用第二个表来获取详细信息:

记录:

RecordId | EmployeeId | TimestampIn | TimestampOut

记录详情

RecordDetailsId | RecordId | Timestamp | Dst | Uid | ProjectId

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


选项 3

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

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

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


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

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

4

2 回答 2

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

我希望您的事件表尽可能小,因为每次您的员工登录时都会重复此数据。这意味着其他所有内容都需要分开。

  • 输入您设备的密钥,然后在需要查询时加入员工和项目。
  • 'Status' 列是一个位值,1/0 表示输入/输出。
  • 可以在需要时导出 DST。
  • 分配给员工的设备。如果您的员工经常更换设备,那么您可能有一个联结表“EmpDevice”。
  • 与上述项目相同。
于 2013-11-06T11:49:59.177 回答
0

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

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

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

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

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

于 2013-11-05T15:16:32.657 回答