【问题标题】:Attendance System MongoDB design考勤系统MongoDB设计
【发布时间】:2016-12-17 05:52:48
【问题描述】:

我需要为员工考勤系统设计和实现一个数据库。数据库不必是非关系型的,我可以选择最适合需求的任何东西。要求很简单,我需要存储员工信息以及他们的上班和下班时间。

资料要求如下:

  1. 员工人数不会很大(20-50)。
  2. 能够检索所有员工在特定日期或特定日期范围内(例如一个月)的所有出勤时间。
  3. 能够为特定员工添加/修改/删除出勤时间。
  4. 能够检索每个员工的计算迟到出勤率。 (根据一些与考勤时间和员工信息相关的业务规则,员工被视为迟到)。

-使用 MongoDB 是否比使用关系 SQL(如 mySQL)更好?

-最能简化 DB 实现、数据访问和应用程序开发的 DB 的建议高级设计是什么?

【问题讨论】:

  • 要比较这些不同的产品,你需要两个程序员,每个程序员都对一个产品有很好的工作知识。给他们任务;完成后,比较结果,再给他们一次改进的机会。
  • 您可能会发现性能差异并不大,尤其是对于这么小的数据集。代码量可能很大;可能 MySQL 会更短。哪个更容易阅读?这取决于你的背景。

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


【解决方案1】:

您可以有 2 个集合,一个用于员工,一个用于出勤。

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

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

并且考勤集合可以有与考勤相关的属性。

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

HTH。

【讨论】:

  • 我认为该解决方案是遵循关系数据库设计的心态,而设计并没有真正帮助所需查询的简单性。
【解决方案2】:

这种设计可以通过 MongoDB 或关系数据库来实现,各有优缺点。 user641887 的模式设计是 MongoDB 的一种完全有效的方法,虽然我不会在出席时使用“日期”作为“_id”,因为同一天的两名员工将有相同的“_id”,这是无效的,我会留下 Object_id 的参加者的“_id”。但是,请注意 mongo 与集合连接的限制,因为您需要查看仅在 Mongo-3.2 中添加的“$lookup”函数 (https://docs.mongodb.com/manual/reference/operator/aggregation/lookup/)。 mongo设计的优点是它允许user641887提出的考勤表中的每个文档都是动态的,如果这个数据库变得非常大,扩展数据库应该不会太难。但我怀疑如果每天只有 50 名员工(50*365 = 18250 人每年),这将是一个问题,即使 10 年的数据也非常少。

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

员工属性:

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

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

attribute_code_description:

  • attribute_code : 该属性的 int 代码
  • attribute_meaning:此属性的用途的字符串描述(例如“allergies”、“probation”、“start_time”...)

同样的方法可以用于“其他考勤参数”。

关于“为每位员工计算迟到的出勤率”,您可以设置触发器/规则以自动触发,以便为每位员工添加计数器以监控他们是否迟到。这将通过在插入参加者表时触发触发器来工作,其中 in_time 字段可以与员工“start_time”进行比较,如果大于该值,则 +1 到记录他们迟到频率的计数器。我知道这可以在几个关系数据库中完成(当然是 postgres/ingres,我相信还有很多其他数据库)。我不知道这是否可以在 mongo 服务器上完成。

【讨论】:

  • 如果是这样,它是关于相同的 RDBMS。 MongoDB对我来说是新的,但我很确定这可以通过使用RDBMS来实现,尤其是“出席”不会有很多“属性”。那么使用 Mongo 有什么优势吗?
  • 很多问题都可以用 MongoDB 或 RDBMS 解决,在这个例子中,我认为任何一个选项都可以。所以你最舒服的可能是最好的选择。如果这个系统变得非常大,或者需要跨越多个站点,我认为 MongoDB 可能更适合,但使用 RDBMS 并非不可能。要进行一些比较(尽管也进行一些营销),请查看 Mongo 的这篇比较文章:mongodb.com/compare/mongodb-mysql
猜你喜欢
  • 1970-01-01
  • 2021-02-19
  • 1970-01-01
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-12
相关资源
最近更新 更多