NoSQLは通常、非正規化 を推奨しています。 データモデルの場合、単一のデータベースエントリに無制限のリストを含めないことが最善です。 DynamoDBでこのデータをモデル化するには、を使用する必要があります多対多の関係をモデル化するための隣接リスト 。 費用対効果の高いはありません 私が知っているデータをモデル化して、1回の呼び出しで必要なすべてのデータを取得できるようにする方法。ただし、(レイテンシー要件を指定せずに)速度が最も重要であるとおっしゃっていたので、DynamoDBに保存した場合にデータを取得できる速度について説明します。
スキーマは次のようになります:
Actor {
ActorId, <-- This is the application/database id, not the actor's actual ID
Name,
Age,
Bio
}
Film {
FilmId, <-- This is the application/database id for the film
Title,
Description,
ReleaseDate
}
ActedIn {
ActorId,
FilmId
}
俳優が映画で演技したことを示すには、1回の書き込み(私の経験ではDynamoDBを使用すると一貫して1桁のミリ秒)を実行するだけで、ActedInアイテムをテーブルに追加できます。
俳優のすべての映画を取得するには、関係ですべての演技を取得するために1回クエリを実行してから、すべての映画を取得するためにバッチ読み取りを行う必要があります。 (私の経験では)クエリの一般的な待機時間は、ネットワーク速度とネットワーク経由で送信されるデータの量に応じて、10ミリ秒未満です。 ActedInリレーションシップは非常に小さなオブジェクトであるため、クエリがAWSデータセンター(EC2、Lambdaなど)でも実行されているものから発信されている場合、クエリの平均ケースは5ミリ秒になると予想できます。
>単一のアイテムの取得は5ミリ秒未満になり、並行して実行できます。 BatchGetItems APIもありますが、それに関する統計はありません。
それで、あなたにとって〜10msは十分に速いですか?
そうでない場合は、DAX を使用できます。 、DynamoDBにキャッシングレイヤーを追加し、<1msのリクエストレイテンシーを約束します。
これを1回の呼び出しで行うための、保守不可能で費用効果の低い方法は何ですか?
ActedInの関係ごとに、次のようにデータを保存します。
ActedIn {
ActorId,
ActorName,
ActorAge,
ActorBio,
FilmId,
FilmTitle,
FilmDescription,
FilmReleaseDate
}
すべての映画の詳細を取得するには、特定の俳優に対して1つのクエリを実行するだけで済み、特定の映画のすべての俳優の詳細を取得するには、1つのクエリのみを実行する必要があります。 実際にはこれを行わないでください。 複製されたデータは、俳優の詳細を更新する必要があるたびに、俳優が出演したすべての映画、および同様に映画の詳細について更新する必要があることを意味します。これは運用上の悪夢になります。
私は確信していません。 NoSQLはこれにはひどいようです。
NoSQLにはさまざまな種類があることを覚えておく必要があります(NoSQL =SQLだけではありません)。したがって、1つのNoSQLソリューションが機能しない場合でも、完全に除外するべきではありません。 1回の呼び出しでこれがどうしても必要な場合は、グラフデータベース の使用を検討する必要があります。 (これは別の種類のNoSQLデータベースです。)