2012-02-07 48 views
17

我试图用DynamoDB和NoSQL取得成功。如何使用DynamoDB(NoSQL)为学生/班级建模

什么是对学生表和班级表进行建模的最佳(正确?)方法,因为我需要有一个学生在课堂上的关系。 我正在考虑DynamoDB中没有第二个索引。

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

哪些学生在特定的班级?

学生需要上哪些课?

由于

+0

这功课吗?如果是这样,请将其标记为(不要试图做人的意思,而只是检查)。 – Kiril 2012-02-07 16:30:11

+5

这不是作业;我试图想出一些最简单的建设性问题,我花了一些时间试图了解NoSQL和非关系模型后想到的问题...... – 2012-02-07 18:06:49

回答

14

一个非常简单的建议(无范围的键)。将有两个表:每个查询类型。这在NoSQL数据库中并不罕见。

在你的情况,我们就必须:

  • 的表Student与属性StudentId为(散列式)主键。每个项目可能会有一个名为Attends的属性,其值是类的ID列表。
  • Class的属性ClassId作为(散列类型)主键。然后每个项目可能有一个名为AttendedBy的属性,其值是学生的ID列表。

执行查询很简单。用学生和班级之间的“出席”关系更新数据库需要两次分开写入,每次写入一次。

另一种设计将有一个表Attends带有散列和范围主键。每个记录将代表一个学生参加一个班级。哈希属性可以是类的Id,范围键可以是学生的Id。然后,关于班级和学生的补充数据将驻留在其他表格中。

+0

由于(据我了解)我仅限于DynamoDB中的一个哈希键(no列索引)它必须是用户名,而不是一些任意的userId,因为我想获得一个学生的课程,同时提供他的名字给“查询” – 2012-02-08 09:16:37

+0

是的,如果你为每个学生有一个唯一的用户名,那就是使用正确的标识符。 – 2012-02-08 12:29:33

+0

它被认为是非标准化吗? – 2012-02-08 13:18:43

-1

要连接两个亚马逊DynamoDB表

下面的示例映射2个蜂房表来存储在亚马逊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; 
+4

这不是DynamoDB,并没有回答有关数据建模的问题 – Tyrsius 2017-03-31 16:12:44

相关问题