考勤系统MongoDB设计

时间:2016-08-10 17:50:09

标签: mysql node.js mongodb database-design database

我需要为员工的考勤系统设计和实施一个数据库。数据库不需要是非关系数据库,我可以选择最符合要求的数据库。要求很简单,我需要存储员工信息以及他们的时钟进出时间。

数据要求如下:

  1. 员工人数不会很大(20-50)。
  2. 能够检索特定日期或天数(例如一个月)的所有员工的所有出勤时间。
  3. 能够为特定员工添加/修改/删除出勤时间。
  4. 能够检索每位员工的计算延迟出勤率。 (根据与出勤时间和员工信息相关的一些业务规则,员工被视为迟到。)
  5. - 使用关系SQL(如mySQL)更好地使用MongoDB吗?

    - 建议的数据库高级设计是什么,它将最好地简化数据库实施,数据访问和应用程序开发?

2 个答案:

答案 0 :(得分:1)

您可以为员工提供2个收集,为出勤提供1个收集。

员工集合可以具有与员工相关的属性

  • _id:Object_id
  • name:string
  • 电子邮件:字符串
  • ......其他员工属性

和出勤收集可以具有与出勤相关的属性。

  • _id:date(您可以将日期存储为字符串或任何其他格式以使其每天唯一
  • in_time:date
  • out_time:date
  • 其他出勤参数....
  • employee_id :(员工为_id)

HTH。

答案 1 :(得分:1)

这种设计可以通过MongoDB或关系数据库来实现,每种都有优点和缺点。 user641887的架构设计是一个非常有效的MongoDB方法,虽然我不会使用" date"作为" _id"注意,因为同一天的两名员工将拥有相同的" _id"这是无效的,我会离开" _id" Object_id的与会者。但是请注意mongo与集合连接的限制,因为您需要查看&$ 39; $ lookup'函数(https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/),仅在Mongo-3.2中添加。 mongo设计的优点在于它允许用户641887提出的考勤表中的每个文档都是动态的,并且如果该数据库变得非常大,则不应该太难以扩展数据库。但我怀疑,如果只有50名员工每天进入1次(50 * 365 =每年18250),那将是一个问题,即使10年的数据也是非常少的。

使用关系结构也可以实现上述要求,其中您将再次拥有user641887所描述的2个表。根据您要在"其他属性/参数"中存储的其他信息量。你有几个选择。如果只有少数已知可能的其他属性,则可以向每个表添加一些可空字段。但是,如果有许多字段可能存在,或者在添加之前您不知道会发生什么,那么您可以将另外两个表与员工关联:

employee_attributes:

  • employee _id:匹配员工_id的_id代码 员工表
  • attribute_code:链接到code_description表(下面)
  • 的整数代码
  • attribute_value:属性的值

注意:这种使用单个属性表的方法仅限于attribute_value只有一种数据类型(很可能是字符串),但是如果需要多种数据类型,可以通过为每个数据设置多个employee属性表来解决这个问题。类型,例如employee_attribute_i(对于int),employee_attribute_s(对于字符串),employee_attribute_b(对于布尔值)。

attribute_code_description:

  • attribute_code:此属性的int代码
  • attribute_meaning:此属性用于的字符串描述(例如"过敏","试用"," start_time",...)

这种方法可以用于其他出勤参数"。

关于"为每位员工计算迟到的人数",然后您可以设置触发器/规则以自动触发,可以为每个员工添加一个计数器,以监控他们是否迟到。这将通过在插入到与会者表中时触发触发器来执行,其中in_time字段然后可以与员工进行比较" start_time",如果它大于那个,则+1到记录如何的计数器他们经常迟到。我知道可以在几个关系数据库中完成(postgres / ingres当然,我确信很多其他数据库)。我不知道是否可以在mongo服务器上完成。