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