【问题标题】:Table design for "attendance check" in NoSQL DBNoSQL DB 中“出勤检查”的表设计
【发布时间】:2019-09-29 03:11:14
【问题描述】:

我正在尝试使用 AWS 识别来传递“出勤”并将记录(日期和时间)插入到 DynamoDB 表中,以记录孩子上学的每一天,问题是我不熟悉 NoSQL 和考虑到这一点,我想知道创建表格的最佳方法是什么。

我使用的一些属性是:

  • 注册号(PartionKey)
  • 名字
  • 姓氏

由于日期/出勤率将成为“动态属性”(孩子是否上学),我不确定是否应该:

  1. 为每天/每周或每月创建一个新表,并且只有注册号作为属性,并且有一个 lambda 触发器来放置一个时间戳,当孩子被发现意味着孩子上课时(这个会有很多...很多表,我相信会破坏 dynameDB 的目的)

  2. 在同一张表中插入出勤率作为属性和list 类型(可以是一个数组,用于插入每天发现孩子的时间戳)..此选项将使项目/表在 DynamoDB 中的权重超过它应该?导致它变慢??

关于解决此问题的可能方法有什么想法吗?还有另一种成本和内存优化的方法吗?

我没有提到触发器、lambda 函数、AWS 识别,因为它超出了本文的范围

【问题讨论】:

  • 你能解释一下enrollmentID代表什么吗?是学生和班级的关系吗?为了对表设计提出建议,您还需要解释您预期的查询模式。
  • enrollmentID 只是我将使用的主键,我打算查询是否有一个孩子在任何一天上学
  • 是的,但是注册代表什么?如果我需要唯一标识一个学生,一个enrollmentID 就足够了吗?
  • 是的,enrollmentID 将是每个学生的唯一编号......
  • 我知道个人属性将保持不变,但出勤列表会随着时间的推移而增加,所以我应该将所有内容嵌入到一个表中还是应该为每个学生引用一个新表? (估计有 500 名学生)

标签: database database-design nosql amazon-dynamodb key-value


【解决方案1】:

最简单的解决方案是使用enrollmentID 作为分区键和day(ISO 8601 日期字符串,如“2019-09-27”)作为范围键,为所有考勤记录创建一个表。

这使得添加出勤变得简单 - 只需在您的表中插入一个注册 ID-日期对。使用各种关键条件表达式查询学生参加的时间很简单。

  • 学生 123 的所有出勤率:enrollmentID = 123
  • 学生 123 在给定年份的所有出勤率:enrollmentID = 123 and begins_with(day, “2019”)
  • 学生 123 在给定月份的所有出勤率:enrollmentID = 123 and begins_with(day, “2019-09”)

作为奖励,您还可以通过创建以day 作为分区键的 GSI 来查找在给定日期参加的所有学生。

如果您愿意,任何其他数据(例如名字、姓氏等)都可以放在单独的表中,也可以放在同一个表中,以“info”作为排序键值而不是实际日期。


您也可以使用布尔值列表来表示一年的出勤率。您可以使用enrollmentIDyear 作为分区键和排序键。

{
    enrollmentID: 123,
    year: 2019,
    attendance: [ 0, 1, 1, 1, 0, 1... ],
    firstName: “John”,
    lastName: “Smith”
}

这是一种更有效的存储使用方式,但它限制了您的查询选项,并且在索引到考勤列表时更容易意外地破坏您的数据并出现一个错误。

【讨论】:

    猜你喜欢
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2015-12-26
    • 2017-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-01-04
    相关资源
    最近更新 更多