Table 在 NoSQL DB 中为 "attendance check" 设计

Table design for "attendance check" in NoSQL DB

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

我使用的一些属性是:

因为 date/attendance 将成为 "dynamic attribute"(无论孩子是否上学),我不确定是否应该:

  1. 为 every-day/week 或月份创建一个新的 table,仅将注册号作为属性,并使用 lambda 触发器在发现孩子时放置时间戳意思是孩子参加了 class(这会有很多......很多 tables,我相信破坏了 dynameDB 的目的)

  2. 在同一个 table 中插入出勤作为属性和 list 类型(可以是一个数组,用于插入孩子被发现的每一天的时间戳) ..此选项会使 DynamoDB 中的 item/table 权重超过应有的权重?导致速度变慢??

关于解决这个问题的可能方法有什么想法吗?有没有另一种方法成本更高 memory-optimized?

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

最简单的解决方案是使用 enrollmentID 作为分区键和 day(ISO 8601 日期字符串,如“2019-09-27 ") 作为范围键。

这使得添加出勤变得简单——只需将注册 ID-日期对插入 table。使用各种关键条件表达式查询学生上课时间很简单。

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

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

如果您愿意,任何其他数据(例如名字、姓氏等)都可以放在单独的 table 中,或者放在同一个 table 中,并带有“信息”之类的内容排序键值而不是真实日期。


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

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

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