我正在尝试使用DynamoDB和NoSQL。
对于建模学生表和班级表以及需要具有“学生在课堂中”的关系的情况,最佳(正确?)方法是什么? 考虑到DynamoDB中没有第二索引可用。
模型需要回答以下问题:
哪些学生在特定的班级中?
学生参加哪些课程?
谢谢
我正在尝试使用DynamoDB和NoSQL。
对于建模学生表和班级表以及需要具有“学生在课堂中”的关系的情况,最佳(正确?)方法是什么? 考虑到DynamoDB中没有第二索引可用。
模型需要回答以下问题:
哪些学生在特定的班级中?
学生参加哪些课程?
谢谢
一个非常简单的建议(没有范围键)是建立两个表:一个用于查询类型。在NoSQL数据库中,这并不罕见。
在您的情况下,我们将有:
Student
的表,其属性StudentId
为(哈希类型)主键。然后每个项目可能会有一个名为Attends
的属性,其值是班级Ids的列表。Class
的表,其属性ClassId
为(哈希类型)主键。然后每个项目可能会有一个名为AttendedBy
的属性,其值是学生Ids的列表。执行查询非常简单。使用一个“attends”关系更新一个学生和一个班级之间的数据库需要进行两个单独的写操作,每个写入操作都针对一个表进行。
另一种设计方式是使用一个带有哈希和范围主键的表Attends
。每条记录代表一个学生参加一个班级的出勤情况。哈希属性可以是班级的Id,而范围键可以是学生的Id。然后班级和学生的补充数据将存储在其他表中。
连接两个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;