Table 在 NoSQL DB 中为 "attendance check" 设计
Table design for "attendance check" in NoSQL DB
我正在尝试使用 AWS 识别来传递 "Attendance" 并将记录(日期和时间)插入 DynamoDB table 以获取孩子上学的每一天,问题是我不熟悉 NoSQL,我想知道考虑到这一点,创建 table 的最佳方法是什么。
我使用的一些属性是:
- 注册号(PartionKey)
- 名字
- 姓氏
因为 date/attendance 将成为 "dynamic attribute"(无论孩子是否上学),我不确定是否应该:
为 every-day/week 或月份创建一个新的 table,仅将注册号作为属性,并使用 lambda 触发器在发现孩子时放置时间戳意思是孩子参加了 class(这会有很多......很多 tables,我相信破坏了 dynameDB 的目的)
在同一个 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 中,并带有“信息”之类的内容排序键值而不是真实日期。
您也可以使用布尔值列表来表示出勤年份。您可以使用 enrollmentID
和 year
作为分区和排序键。
{
enrollmentID: 123,
year: 2019,
attendance: [ 0, 1, 1, 1, 0, 1... ],
firstName: “John”,
lastName: “Smith”
}
这是一种更有效的存储使用方式,但它限制了您的查询选项,并且在索引到出勤列表时更容易因差一错误而意外破坏您的数据。
我正在尝试使用 AWS 识别来传递 "Attendance" 并将记录(日期和时间)插入 DynamoDB table 以获取孩子上学的每一天,问题是我不熟悉 NoSQL,我想知道考虑到这一点,创建 table 的最佳方法是什么。
我使用的一些属性是:
- 注册号(PartionKey)
- 名字
- 姓氏
因为 date/attendance 将成为 "dynamic attribute"(无论孩子是否上学),我不确定是否应该:
为 every-day/week 或月份创建一个新的 table,仅将注册号作为属性,并使用 lambda 触发器在发现孩子时放置时间戳意思是孩子参加了 class(这会有很多......很多 tables,我相信破坏了 dynameDB 的目的)
在同一个 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 中,并带有“信息”之类的内容排序键值而不是真实日期。
您也可以使用布尔值列表来表示出勤年份。您可以使用 enrollmentID
和 year
作为分区和排序键。
{
enrollmentID: 123,
year: 2019,
attendance: [ 0, 1, 1, 1, 0, 1... ],
firstName: “John”,
lastName: “Smith”
}
这是一种更有效的存储使用方式,但它限制了您的查询选项,并且在索引到出勤列表时更容易因差一错误而意外破坏您的数据。