我试图用DynamoDB和NoSQL取得成功。如何使用DynamoDB(NoSQL)为学生/班级建模
什么是对学生表和班级表进行建模的最佳(正确?)方法,因为我需要有一个学生在课堂上的关系。 我正在考虑DynamoDB中没有第二个索引。
该模型需要回答以下问题:
哪些学生在特定的班级?
学生需要上哪些课?
由于
我试图用DynamoDB和NoSQL取得成功。如何使用DynamoDB(NoSQL)为学生/班级建模
什么是对学生表和班级表进行建模的最佳(正确?)方法,因为我需要有一个学生在课堂上的关系。 我正在考虑DynamoDB中没有第二个索引。
该模型需要回答以下问题:
哪些学生在特定的班级?
学生需要上哪些课?
由于
一个非常简单的建议(无范围的键)。将有两个表:每个查询类型。这在NoSQL数据库中并不罕见。
在你的情况,我们就必须:
Student
与属性StudentId
为(散列式)主键。每个项目可能会有一个名为Attends
的属性,其值是类的ID列表。Class
的属性ClassId
作为(散列类型)主键。然后每个项目可能有一个名为AttendedBy
的属性,其值是学生的ID列表。执行查询很简单。用学生和班级之间的“出席”关系更新数据库需要两次分开写入,每次写入一次。
另一种设计将有一个表Attends
带有散列和范围主键。每个记录将代表一个学生参加一个班级。哈希属性可以是类的Id,范围键可以是学生的Id。然后,关于班级和学生的补充数据将驻留在其他表格中。
由于(据我了解)我仅限于DynamoDB中的一个哈希键(no列索引)它必须是用户名,而不是一些任意的userId,因为我想获得一个学生的课程,同时提供他的名字给“查询” – 2012-02-08 09:16:37
是的,如果你为每个学生有一个唯一的用户名,那就是使用正确的标识符。 – 2012-02-08 12:29:33
它被认为是非标准化吗? – 2012-02-08 13:18:43
要连接两个亚马逊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;
这不是DynamoDB,并没有回答有关数据建模的问题 – Tyrsius 2017-03-31 16:12:44
这功课吗?如果是这样,请将其标记为(不要试图做人的意思,而只是检查)。 – Kiril 2012-02-07 16:30:11
这不是作业;我试图想出一些最简单的建设性问题,我花了一些时间试图了解NoSQL和非关系模型后想到的问题...... – 2012-02-07 18:06:49