我正在尝试使用 DynamoDB 和 NoSQL。
关于我需要有学生在课堂上的关系这一事实,对学生表和班级表进行建模的最佳(对吗?)方法是什么。我考虑到 DynamoDB 中没有可用的第二索引。
该模型需要回答以下问题:
特定班级有哪些学生?
学生上哪些课?
谢谢
我正在尝试使用 DynamoDB 和 NoSQL。
关于我需要有学生在课堂上的关系这一事实,对学生表和班级表进行建模的最佳(对吗?)方法是什么。我考虑到 DynamoDB 中没有可用的第二索引。
该模型需要回答以下问题:
特定班级有哪些学生?
学生上哪些课?
谢谢
一个非常简单的建议(没有范围键)是有两个表:每个查询类型一个。这在 NoSQL 数据库中并不罕见。
在你的情况下,我们有:
Student
具有属性StudentId
作为(散列类型)主键的表。然后每个项目可能有一个名为 的属性Attends
,其值是类上的 Id 列表。Class
具有属性ClassId
作为(散列类型)主键的表。然后,每个项目可能都有一个名为 的属性AttendedBy
,其值是学生的 Id 列表。执行您的查询将很简单。用学生和班级之间的一种“参加”关系更新数据库需要两次单独的写入,每个表一次。
另一种设计将有一个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;