如何使用DynamoDB(NoSQL)为学生/类建模

时间:2012-02-07 16:07:04

标签: database nosql data-modeling amazon-dynamodb

我正在尝试使用DynamoDB和NoSQL。

对于我需要建立学生与班级关系这一事实,对学生表和班级表进行建模的最佳(对吗?)方法是什么? 我考虑到DynamoDB中没有第二个索引。

该模型需要回答以下问题:

哪些学生在特定班级?

学生上哪些课程?

由于

2 个答案:

答案 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;