0

次のような2つのテーブルを持つSQLデータベースがあります。

Users
 Id (PK)
 Name

Orders
 Id (PK)
 UserId (FK - User.Id)
 Amount

(非常に大きな結果セットで)結合を回避するために、これをNoSQL(つまり、MongoDb)Key-Valueストアに移動したいと思います。

  1. この構造は、そのままKVデータベースに移動するのが理にかなっていますか?そうでない場合は、ユーザーと注文に関連するUser_Ordersのような別のテーブルを追加する必要がありますか?

注文をグリッドで表示する画面がありますが、ユーザー名も表示したいと思います。SQLでは、結合を使用してデータベースからこれをプルします。

  1. 関連するユーザーを取得するためにOrder.UserIdごとに1回データベースにクエリを実行する以外に、NoSQL(結合なし)に同等のものはありますか?そうでない場合、私のアーキテクチャで複数のフロントエンドサーバーとアプリケーションサーバーを実行できると仮定して、このインスタンスでMap-Reduceを適用して同じ目標を達成するにはどうすればよいですか?

ありがとう!

4

1 に答える 1

1

リレーショナルデータベースからNoSQLデータベースへの大きな変更は、非正規化です。システム内でユーザー名が変更される頻度に基づいて、orders コレクション(リレーショナル用語のテーブル)にユーザー名を追加するだけです。

したがって、ordersコレクションスキーマは次のようになります。

{"userId":"abc123", "userName": "Some Name", "orderId":"someorderId","amount":153.23}

簡単なfind()クエリを使用して、注文とユーザーに関するデータを取得できます。名前が変更された場合、それは複数のドキュメントの更新になりますが、それが頻繁に発生しない場合は、それほど悪くはありません。ブルームーンの更新で一度は、読み取りに役立つため、非正規化は適切です。繰り返しますが、これは経験則ではありませんが、読み取りと書き込みの比率を考慮するのは、完全にユースケースと設計次第です。

ユーザー名が頻繁に変更され、非正規化したくない場合は、データベースを使用する代わりに、いつでも適切なTTLを使用してuserIdをuserNameマップにキャッシュし、アプリケーション層でID->Nameを検索できます。ビジネス上の制約を課します。

データの大規模な集約を行っていない限り、注文とユーザーをプルするためだけにmap-reduceは必要ありません。

于 2011-11-22T00:37:16.110 に答える