DynamoDB と NoSQL を使いこなそうとしています。
学生がクラス内の関係を持つ必要があるという事実に関して、学生のテーブルとクラスのテーブルをモデル化するための最良の (正しい?) アプローチは何ですか。DynamoDB で使用できるセカンド インデックスがないことを考慮に入れています。
モデルは、次の質問に答える必要があります。
特定のクラスにはどの生徒がいますか?
生徒はどのクラスを受講しますか?
ありがとう
DynamoDB と NoSQL を使いこなそうとしています。
学生がクラス内の関係を持つ必要があるという事実に関して、学生のテーブルとクラスのテーブルをモデル化するための最良の (正しい?) アプローチは何ですか。DynamoDB で使用できるセカンド インデックスがないことを考慮に入れています。
モデルは、次の質問に答える必要があります。
特定のクラスにはどの生徒がいますか?
生徒はどのクラスを受講しますか?
ありがとう
非常に単純な提案(範囲キーなし)は、2つのテーブルを持つことです。クエリタイプごとに1つです。これはNoSQLデータベースでは珍しいことではありません。
あなたの場合、私たちは次のようになります。
Student
属性を持つテーブル。StudentId
各アイテムには、という名前の属性がありAttends
、その値はクラスのIDのリストでした。Class
属性を持つテーブル。ClassId
各アイテムには、という名前の属性がありAttendedBy
、その値は学生のIDのリストでした。クエリの実行は簡単です。1回の「参加」でデータベースを更新する-学生とクラスの関係には、各テーブルに1つずつ、合計2つの個別の書き込みが必要です。
別の設計ではAttends
、ハッシュと範囲の主キーを持つ1つのテーブルがあります。各レコードは、1人の生徒が1つのクラスに出席したことを表します。ハッシュ属性はクラスのIDであり、範囲キーは学生のIDである可能性があります。その場合、クラスと生徒に関する補足データは他のテーブルにあります。
2 つの Amazon DynamoDB テーブルを結合するには
次の例では、2 つの Hive テーブルを Amazon DynamoDB に保存されたデータにマッピングします。次に、これら 2 つのテーブル間で結合を呼び出します。結合はクラスターで計算され、返されます。結合は Amazon DynamoDB では行われません。この例では、2 つ以上の注文を行った顧客の顧客とその購入のリストを返します。
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;