18

DynamoDB と NoSQL を使いこなそうとしています。

学生がクラス内の関係を持つ必要があるという事実に関して、学生のテーブルとクラスのテーブルをモデル化するための最良の (正しい?) アプローチは何ですか。DynamoDB で使用できるセカンド インデックスがないことを考慮に入れています。

モデルは、次の質問に答える必要があります。

特定のクラスにはどの生徒がいますか?

生徒はどのクラスを受講しますか?

ありがとう

4

2 に答える 2

15

非常に単純な提案(範囲キーなし)は、2つのテーブルを持つことです。クエリタイプごとに1つです。これはNoSQLデータベースでは珍しいことではありません。

あなたの場合、私たちは次のようになります。

  • (ハッシュタイプ)主キーとしてStudent属性を持つテーブル。StudentId各アイテムには、という名前の属性がありAttends、その値はクラスのIDのリストでした。
  • (ハッシュタイプ)主キーとしてClass属性を持つテーブル。ClassId各アイテムには、という名前の属性がありAttendedBy、その値は学生のIDのリストでした。

クエリの実行は簡単です。1回の「参加」でデータベースを更新する-学生とクラスの関係には、各テーブルに1つずつ、合計2つの個別の書き込みが必要です。

別の設計ではAttends、ハッシュと範囲の主キーを持つ1つのテーブルがあります。各レコードは、1人の生徒が1つのクラスに出席したことを表します。ハッシュ属性はクラスのIDであり、範囲キーは学生のIDである可能性があります。その場合、クラスと生徒に関する補足データは他のテーブルにあります。

于 2012-02-07T21:49:26.727 に答える
-3

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;
于 2012-04-25T20:09:18.850 に答える