如何在DynamoDB中建模1:N:M关系

3
我们需要在dynamodb中创建一个学校的模式。需求如下:
1. 每个学校包含一组课程。[1:N] 2. 每个课程组包含一组课程。[1:N] 3. 每个课程包含一组模块。[1:N]
每个实体都有相应的属性。以下是我对该模式的第一次尝试:
学校 - 学校ID - Hash Key,属性。 课程组:学校ID - Hash Key,课程组 - 带有属性的范围键 课程:学校ID - Hash Key,[课程组+课程名称] - 带有属性的范围键 模块:学校ID - Hash Key,[课程组+课程名称+模块名称] - 带有属性的范围键
以上模式的问题是,如果我想提前创建一个模块而不创建课程和课程组,则无法正常工作。此外,我希望对此模式执行以下查询:
1. 获取给定学校的所有课程组、课程和模块列表。 2. 获取给定学校的课程组列表。 3. 获取给定课程组的课程列表。 4. 获取给定课程的所有模块列表。
1个回答

1

这是我想出的初始模式:

school (schoolId(hash), otherAttributes)
courseGroup (gpId(hash), schoolId(range), array of courseIds , othersAttributes)
     courseGroupIndex(schoolId(hash), otherAttribute) -- Global Secondary Index
courses (courseId, array of moduleIds, othersAttributes)
modules (moduleId , othersAttributes)

这里最重要的一点是,即使两个表的列名相同,它们之间实际上没有任何链接,您需要在应用程序级别上将这些表连接起来。
看看是否覆盖了所有查询:
1. 获取给定学校的所有课程组、课程和模块的列表。 将schoolId传递到courseGroup表中获取所有courseIds -> 将courseIds传递到courses表中获取所有moduleIds -> 传递moduleId以从module表中获取所有模块
2. 获取给定学校的课程组列表。 将schoolId传递到courseGroupIndex表中获取所有courcesGroup 3. 获取给定课程组的课程列表。 将courseGroupId传递到courseGroup表中获取所有courseIds
4. 获取给定课程的所有模块列表。 将courseId传递到course表中获取所有moduleIds
希望能帮到您。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接