web-dev-qa-db-ja.com

一致を追跡するためのMongoDBスキーマ

これは私がチュートリアルを超えて作成しようとしている最初のmongo-backed-applicationであるため、ドキュメントスキーマに関しては想像力に欠けます。

コンテキスト

出会い系アプリケーションには、ユーザー間の一致を識別するアルゴリズムがあります。現在、これらの一致を保存する方法を特定しようとしています。

現在のスキーマ

ペアごとに2つの一致ドキュメント(ユーザーごとに1つ)を作成します。それぞれに、そのユーザーの応答、他のユーザーへの参照、およびペアのドキュメントのIDが保持されます。

Match : {
  objectid: [unique uuid],
  user: [idx, uuid],
  targetUser: [reference to User],
  pair: [Match uuid],
  approved: [bool / null]
}

ユースケース

アルゴリズムは一致オブジェクトを作成します。可能性のあるすべてのUser一致をフェッチするように要求され、データベースにMatchのすべてのUserオブジェクトを照会します。承認されたのはnullです。データベースはtargetUserフィールドに実際のUserドキュメント[!!!]を入力して戻ります。結果はシリアル化されて返送されます。

.。

ユーザーが一致を承認し、更新するためにリクエストが送信されましたMatch[objectid].approved = True。バックエンドは、pairによって参照される2番目のMatchオブジェクトの値をチェックし、値に応じて他のアクションを実行します。

懸念事項

まず、NoSQLの経験が豊富な人にとっては、これは恐ろしいことのように思えるかもしれません。その場合は、教えてください。私の主な関心事は、targetUserへの参照を持つことです。 NoSQLの大きなセールスポイントは、「結合」の数を減らすことですが、ここではそれを回避する方法を見つけることができません。また、1つのペアに2つのオブジェクトがあるという事実は、少し厄介です。しかし、私は他にどのように言うでしょう:give me all potential matches for User A

2
latusaki

MongoDBのデータベーススキーマを設計する場合、1番目の決定基準は「データの構造」ではありません。むしろ、「自分のデータに対してどのようなクエリを実行したいですか?」次に、パフォーマンスに関連するすべてのユースケースを1つのクエリで実行できるように、データスキーマを構造化する必要があります。

最も重要なクエリが「すべての未承認の一致を持つ特定のユーザーを取得する」である場合、そのユーザーのすべての未承認のMatch- documentsを含むユーザーフィールドの配列フィールドunapproved_matchesが必要です。これらの一致サブドキュメントには、フロントエンドに表示するすべてのデータを入力する必要があります。そのため、他のユーザーのドキュメントを参照するだけでなく、情報の名前、年齢、場所、プロフィールのURL、プロフィールの写真のURLを含めることをお勧めします。

つまり、個々の一致ドキュメントはデータベースに複数回存在する可能性があり、users- collectionには、承認/拒否する必要のある2人のユーザーのサブドキュメントとして2回存在し、(それ)グローバルmatchesコレクションのエントリとしてさらに別の機会に。また、ユーザードキュメントとそのユーザーに一致する一致ドキュメントの間で複製される情報もあります。

これは、リレーショナルデータベースでの作業に慣れている人にはかなり異端に聞こえるかもしれません。ただし、使用しているデータベースはリレーショナルではありません。したがって、レイモンドF.ボイスとエドガーF.コッドがデータの正規化について説明したことはすべて忘れてください。 MongoDBでは、データの重複は必ずしも悪いことではありません。 JOINを回避するために支払う代償は、冗長性を回避できないことが多いということです。

4
Philipp