如何使用DynamoDB(NoSQL)建模学生/班级

18

我正在尝试使用DynamoDB和NoSQL。

对于建模学生表和班级表以及需要具有“学生在课堂中”的关系的情况,最佳(正确?)方法是什么? 考虑到DynamoDB中没有第二索引可用。

模型需要回答以下问题:

哪些学生在特定的班级中?

学生参加哪些课程?

谢谢


这是作业吗?如果是,请标记为作业(不是要刻意挑剔,只是想确认一下)。 - Kiril
7
这不是家庭作业;我尝试了解NoSQL和非关系型模型,并想出了一个最简单的建设性问题。 - Chen Harel
2个回答

15

一个非常简单的建议(没有范围键)是建立两个表:一个用于查询类型。在NoSQL数据库中,这并不罕见。

在您的情况下,我们将有:

  • 一个名为Student的表,其属性StudentId为(哈希类型)主键。然后每个项目可能会有一个名为Attends的属性,其值是班级Ids的列表。
  • 一个名为Class的表,其属性ClassId为(哈希类型)主键。然后每个项目可能会有一个名为AttendedBy的属性,其值是学生Ids的列表。

执行查询非常简单。使用一个“attends”关系更新一个学生和一个班级之间的数据库需要进行两个单独的写操作,每个写入操作都针对一个表进行。

另一种设计方式是使用一个带有哈希和范围主键的表Attends。每条记录代表一个学生参加一个班级的出勤情况。哈希属性可以是班级的Id,而范围键可以是学生的Id。然后班级和学生的补充数据将存储在其他表中。


根据我的理解,在DynamoDB中,由于我受到一个哈希键的限制(没有列索引),所以它必须是用户名,而不是某个任意的用户ID。因为我想在提供学生名字给“查询”命令时获取他的班级。 - Chen Harel
是的,如果每个学生都有一个唯一的用户名,那么这就是正确的标识符。 - Niels Christensen
这是否被视为非规范化? - Chen Harel
“Which "it"?”通常情况下,规范化和反规范化倾向于在关系型数据库的上下文中使用。 - Niels Christensen

-3

连接两个Amazon DynamoDB表

以下示例将两个Hive表映射到存储在Amazon DynamoDB中的数据。然后调用跨这两个表的连接。连接在集群上计算并返回。连接不会在Amazon DynamoDB中发生。此示例返回已下订单超过两次的客户及其购买记录列表。

CREATE EXTERNAL TABLE hive_purchases(customerId bigint, total_cost double, items_purchased array<String>) 
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler'
TBLPROPERTIES ("dynamodb.table.name" = "Purchases",
"dynamodb.column.mapping" = "customerId:CustomerId,total_cost:Cost,items_purchased:Items");

CREATE EXTERNAL TABLE hive_customers(customerId bigint, customerName string, customerAddress array<String>) 
STORED BY 'org.apache.hadoop.hive.dynamodb.DynamoDBStorageHandler' TBLPROPERTIES ("dynamodb.table.name" = "Customers",
"dynamodb.column.mapping" = "customerId:CustomerId,customerName:Name,customerAddress:Address");

Select c.customerId, c.customerName, count(*) as count from hive_customers c 
JOIN hive_purchases p ON c.customerId=p.customerId 
GROUP BY c.customerId, c.customerName HAVING count > 2;

6
这不是DynamoDB,并且不回答关于数据建模的问题。 - Kyeotic

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