web-dev-qa-db-ja.com

AWS DynamoDBでテーブルを結合する方法は?

デザイン全体が自然な集合体(ドキュメント)に基づいている必要があることはわかっていますが、ローカリゼーション(言語、キー、テキスト)に別のテーブルを実装し、他のテーブルでキーを使用することを考えています。ただし、これを行う例は見つかりませんでした。

どんなポインターでも役立つかもしれません!

33
Centurion

確かに、DynamoDBはリレーショナルデータベースとして設計されておらず、結合操作をサポートしていません。 DynamoDBは単なるキーと値のペアのセットであると考えることができます。

複数のテーブル(たとえばdocument_ID)で同じキーを使用できますが、DynamoDBはそれらを自動的に同期したり、外部キー機能を使用したりしません。 1つのテーブルのdocument_IDは同じ名前ですが、技術的には異なるテーブルのdocument_IDとは異なります。これらのキーが同期されることを確認するのは、アプリケーションソフトウェア次第です。

DynamoDBはデータベースに関する別の考え方であり、Amazon Auroraなどの管理されたリレーショナルデータベースの使用を検討することをお勧めします。 https://aws.Amazon.com/rds/aurora/

注意すべき点として、Amazon EMRではDynamoDBテーブルを結合できますが、それがあなたが探しているものかどうかはわかりません: http://docs.aws.Amazon.com/ElasticMapReduce/latest/DeveloperGuide /EMRforDynamoDB.html

33
Reid Hughes

DynamoDBでは、参加するのではなく、後で読む予定の形でデータを保存することが最善の解決策だと思います。

複雑な読み取りクエリが必要な場合は、DynamoDBがRDBMSのように動作することを期待するというtrapに陥ったかもしれませんが、そうではありません。書き込んだデータを変換および整形し、読み取りをシンプルにします。

ディスクは最近の計算よりもはるかに安価です。非正規化を恐れないでください。

14
Lloyd

最初のテーブルをクエリし、次のテーブルでgetリクエストを使用して各アイテムを反復処理する必要があります。

他の答えは、1)質問に答えないこと、さらに重要なこと、2)将来のアプリケーションを知る前に、どのようにテーブルを設計できますか?技術的な負債は、無制限の将来の可能性を合理的にカバーするには高すぎます。

私の答えは恐ろしく非効率的ですが、これは提起された質問に対する唯一の現在の解決策です。

より良い答えを心待ちにしています。

5
James Shiztar

この分野で何度も出てきたソリューションの1つは、DynamoDBから、探している種類の操作により適した別のデータベースに同期することです。

私は ブログ を書いて、このトピックについて人々がこの問題に取り組むさまざまなアプローチを比較しましたが、ここで重要なポイントをいくつか要約するので、すべてを読む必要はありません。 。

DynamoDBセカンダリインデックス

どうよ?

  1. 高速で他のシステムは必要ありません!
  2. 作成中の非常に特定の分析機能に適しています(リーダーボードなど)

考慮事項

  1. セカンダリインデックスの制限、クエリの忠実度の制限
  2. スキャンに依存している場合は高価です
  3. 運用データベースを分析に直接使用するセキュリティとパフォーマンスの問題

DynamoDB +接着剤+ S3 +アテナ

Architecture

どうよ?

  1. すべてのコンポーネントは「サーバーレス」であり、インフラストラクチャのプロビジョニングは不要です
  2. ETLパイプラインを自動化するのは簡単

考慮事項

  1. 数時間の高いエンドツーエンドのデータ遅延、つまり古いデータ
  2. クエリの待ち時間は数十秒から数分の間で変化します
  3. スキーマの施行により、混合型の情報が失われる可能性があります
  4. ソースのデータの構造が変更された場合、ETLプロセスは時々メンテナンスを必要とする可能性があります

DynamoDB + Hive/Spark

Architecture

どうよ?

  1. DynamoDBの最新データに対するクエリ
  2. スキーマを指定する以外にETL /前処理を必要としません

考慮事項

  1. フィールドに型が混在している場合、スキーマの施行により情報が失われる可能性があります
  2. EMRクラスターには、いくつかの管理とインフラストラクチャ管理が必要です
  3. 最新データのクエリにはスキャンが含まれ、費用がかかります
  4. クエリの待機時間は、Hive/Sparkで直接数十秒から数分の間で変化します
  5. 運用データベースで分析クエリを実行することのセキュリティとパフォーマンスへの影響

DynamoDB + AWS Lambda + Elasticsearch

どうよ?

  1. 全文検索のサポート
  2. いくつかのタイプの分析クエリのサポート
  3. DynamoDBの最新データを処理できます

考慮事項

  1. 取り込み、インデックス作成、レプリケーション、シャーディングのためのインフラストラクチャの管理と監視が必要です
  2. DynamoDBとElasticsearchの間でデータの整合性と一貫性を確保するには、別のシステムが必要です
  3. スケーリングは手動で行われ、追加のインフラストラクチャと運用のプロビジョニングが必要です
  4. 異なるインデックス間の結合はサポートされていません

DynamoDB + ロックセット

Architecture

どうよ?

  1. 完全にサーバーレス。インフラストラクチャまたはデータベースの操作またはプロビジョニングは不要
  2. DynamoDBとRocksetコレクション間のライブ同期。数秒以上離れることはありません
  3. DynamoDBとRockset間の一貫性を確保するための監視
  4. 低遅延クエリを可能にするデータ上に構築された自動インデックス
  5. 高QPSに拡張できるSQLクエリサービス
  6. Amazon Kinesis、Apache Kafka、Amazon S3などの他のソースからのデータと結合します。
  7. RESTおよびクライアントライブラリの使用)を介したTableau、Redash、Superset、SQL APIなどのツールとの統合。
  8. 全文検索、取り込み変換、保持、暗号化、きめの細かいアクセス制御などの機能

考慮事項

  1. まれにしかクエリされないデータ(マシンログなど)の保存にはあまり適していません
  2. トランザクションデータストアではありません

(完全開示:Rockset @ Rocksetで作業しています)個々のアプローチの詳細については、 blog をご覧ください。

2

私の応答は、数年遅れてわずかに遅れることを知っています。ただし、Amazon DynamoDB&Joinsに関するいくつかの追加情報を掘り下げることができました。これは、あなた(または、将来、この情報を調査中にこの議論につまずくかもしれない別の個人)に役立つかもしれません。

要点を説明するために、Apache HiveQLクエリ言語を使用してAmazon DynamoDBのテーブル、列、データなどで結合を実行できることを記載したドキュメントをAmazon DynamoDBウェブサイトで見つけることができました。

DynamoDBのデータのクエリ(w/HiveQL): https://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/EMRforDynamoDB.Querying.html

Amazon DynamoDBとApache Hiveを使用した作業: https://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/EMRforDynamoDB.Tutorial.html

Amazon EMRでApache Hiveを使用してAmazon DynamoDBデータを処理する: https://docs.aws.Amazon.com/amazondynamodb/latest/developerguide/EMRforDynamoDB.html

この情報が元のポスターではないにしても、誰かの助けになることを願っています。

0
Matti

最近、dynamoDbでavgやsumなどの結合および集計関数を使用するという同じ要件がありますが、これを解決するためにCdata JDBCドライバーを使用し、完全に機能しました。結合関数および集約関数をサポートします。ただし、Cdataのライセンスコストのために、cdataの使用を避けるためのソリューションも探しています。

0
vivek agrawal