【问题标题】:Employee In/Out Table - how to store additional information?Employee In/Out Table - 如何存储附加信息?
【发布时间】:2013-11-07 23:14:31
【问题描述】:

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

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

看完this stackoverflow question有两种设计数据库的方法:

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

使用后一种设计将使报告/分析变得非常容易(例如,“哪个员工的工作时间超过 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 中为空),那么它将是一个输出条目。

【问题讨论】:

  • 最佳实践是完成工作。我更喜欢事件表,因为它们更容易审计和排除故障。例如,您如何确定一名员工的早上 8 点到早上 7 点是 23 小时进出最后一分钟的项目推送,还是错过了?

标签: database-design


【解决方案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'。
  • 与上述项目相同。

【讨论】:

    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-23
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      • 1970-01-01
      • 2011-07-29
      相关资源
      最近更新 更多