これは私がチュートリアルを超えて作成しようとしている最初の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
?
MongoDBのデータベーススキーマを設計する場合、1番目の決定基準は「データの構造」ではありません。むしろ、「自分のデータに対してどのようなクエリを実行したいですか?」次に、パフォーマンスに関連するすべてのユースケースを1つのクエリで実行できるように、データスキーマを構造化する必要があります。
最も重要なクエリが「すべての未承認の一致を持つ特定のユーザーを取得する」である場合、そのユーザーのすべての未承認のMatch
- documentsを含むユーザーフィールドの配列フィールドunapproved_matches
が必要です。これらの一致サブドキュメントには、フロントエンドに表示するすべてのデータを入力する必要があります。そのため、他のユーザーのドキュメントを参照するだけでなく、情報の名前、年齢、場所、プロフィールのURL、プロフィールの写真のURLを含めることをお勧めします。
つまり、個々の一致ドキュメントはデータベースに複数回存在する可能性があり、users
- collectionには、承認/拒否する必要のある2人のユーザーのサブドキュメントとして2回存在し、(それ)グローバルmatches
コレクションのエントリとしてさらに別の機会に。また、ユーザードキュメントとそのユーザーに一致する一致ドキュメントの間で複製される情報もあります。
これは、リレーショナルデータベースでの作業に慣れている人にはかなり異端に聞こえるかもしれません。ただし、使用しているデータベースはリレーショナルではありません。したがって、レイモンドF.ボイスとエドガーF.コッドがデータの正規化について説明したことはすべて忘れてください。 MongoDBでは、データの重複は必ずしも悪いことではありません。 JOINを回避するために支払う代償は、冗長性を回避できないことが多いということです。