我需要为员工的考勤系统设计和实施一个数据库。数据库不需要是非关系数据库,我可以选择最符合要求的数据库。要求很简单,我需要存储员工信息以及他们的时钟进出时间。
数据要求如下:
- 使用关系SQL(如mySQL)更好地使用MongoDB吗?
- 建议的数据库高级设计是什么,它将最好地简化数据库实施,数据访问和应用程序开发?
答案 0 :(得分:1)
您可以为员工提供2个收集,为出勤提供1个收集。
员工集合可以具有与员工相关的属性
和出勤收集可以具有与出勤相关的属性。
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:
注意:这种使用单个属性表的方法仅限于attribute_value只有一种数据类型(很可能是字符串),但是如果需要多种数据类型,可以通过为每个数据设置多个employee属性表来解决这个问题。类型,例如employee_attribute_i(对于int),employee_attribute_s(对于字符串),employee_attribute_b(对于布尔值)。
attribute_code_description:
这种方法可以用于其他出勤参数"。
关于"为每位员工计算迟到的人数",然后您可以设置触发器/规则以自动触发,可以为每个员工添加一个计数器,以监控他们是否迟到。这将通过在插入到与会者表中时触发触发器来执行,其中in_time字段然后可以与员工进行比较" start_time",如果它大于那个,则+1到记录如何的计数器他们经常迟到。我知道可以在几个关系数据库中完成(postgres / ingres当然,我确信很多其他数据库)。我不知道是否可以在mongo服务器上完成。