私には2つのテーブルがあり、そのテーブル間のいくつかのフィールドには多対多の関係があります。この機能をAmazonDynamoDBに実装するにはどうすればよいですか?
1 に答える
クイックアンサー:コード内で、またはテーブルを非正規化(冗長データを格納)します。
非正規化; つまり、中央の「結合」テーブルに冗長データを格納して、その1つのテーブルにクエリを実行することで必要なすべての情報を取得できるようにします。これはおそらく最善のオプションですが、左または右のテーブルを更新するときは、中央のテーブルの関連するすべてのレコードを更新することを忘れないでください。このコストは、追加のデータストレージに加えて、更新ごとに追加のプログラミングの手間がかかります。
3つのクエリを実行します。結合の中央テーブルをプルし、次に右と左のテーブルをさらに2つのクエリでプルします。
他の2つのハイブリッドオプション:
3番目のオプションは、1つのテーブルのみで非正規化することです。左側のテーブルには、結合データのserialized()配列を格納する列があります。したがって、左側のテーブルをプルするだけで、右側のテーブルからへのすべての結合がすでに完了しています。右側のテーブルをすべて更新する必要がある場合は、このアプローチを実行しないでください。左側のテーブルをすべてプルし、更新が必要な場所を見つけてから、左側のテーブルを更新します。厄介な-だからあなたは4番目のオプションに落ちる可能性があります...
関連するIDのリストを左側のテーブルに(同じシリアル化された方法で)格納します。これにより、左側のテーブルをプルし、IDSのセラライズを解除して、右側から何をプルするかを知ることができます。これは、3つだけではなく、2つのクエリを意味します。
どちらが効果的かは、プログラムによって異なります。データを「追加」するだけなのか、多くの編集や削除を行うだけなのかによって異なります。それらのどれも機能しない場合は、リレーショナルデータベースを検討してください。
理由(ご存知の場合は申し訳ありませんが、完全を期すために追加します)。
DynamoDBはnoSQLデータベースであり、非リレーショナルクエリ用に設計されています。したがって、JOINSや外部キーやカスケードなどは実行しないでください(はい、ここでは単純化していますが、簡単にまとめるといいのですが)。クエリでデータを取得し、コードで「結合」を実行します。外部キーとそのすべてのジャズは実際には機能していません。
リレーショナルデータベースが必要な場合は、リレーショナルデータベースを使用してください。
アマゾンの宣伝文句を直接引用するには:
Amazon DynamoDBは、データベースのスケーラビリティ、管理、パフォーマンス、信頼性という主要な問題に取り組んでいますが、リレーショナルデータベースではなく、複雑なリレーショナルクエリ(結合など)や複雑なトランザクションをサポートしていません。ワークロードにこの機能が必要な場合、または既存のリレーショナルエンジンとの互換性を探している場合は、Amazon Relational Database Service(RDS)を試してください。