それどころか、解決策1と2が最善の策です。解決策3は、更新/作成の頻度がプロジェクトやユーザーの読み取り頻度と比較して非常に少ない場合に検討できます。更新/作成には2つのクエリが必要であり、読みやすさがそれを補います。
ソリューション1と2から選択するには、読み取り頻度を考慮する必要があります。ユーザーのプロジェクトまたはプロジェクトの使用をより頻繁に必要とし、それに応じて選択しますか。両方の頻度が比較的同じであると感じる場合は、ユーザーオブジェクトのクラスター化をできるだけ少なくすることをお勧めします。どのオプションを選択する場合でも、index
を維持することを検討してください _id
を格納している配列 s(プロジェクトまたはユーザーの)。
例
userSchema = new Schema(
{//otherstuff
project_ids: [{type: Schema.Types.ObjectId, ref: 'Project'}})
...
})
userSchema.index({'project_ids':1})
または
projectSchema = new Schema(
{//otherstuff
user_ids: [{type: Schema.Types.ObjectId, ref: 'User'}})
...
})
projectSchema.index({'user_ids':1})
_id
の配列にインデックスを保持する かなりのオーバーヘッドが発生することを恐れる側で、クエリの速度が大幅に向上します。
ただし、index
は保持してください この関係が、多くのクエリが実行されている重要な関係である場合にのみ。これがプロジェクトの単なる副次的な機能である場合は、without
実行できます。 インデックスも。
ユーザーが多くのことを実行でき、多くの関係を持っている場合、アプリ全体でそのユーザーオブジェクトが常に必要になるため、アプリがプロジェクト固有でない場合は、プロジェクトIDをユーザースキーマに配置しない方がよいでしょう。 。ただし、IDを入力するだけなので、とにかくオーバーヘッドはそれほど大きくありません。心配する必要はありません。
両方のアレイのRegインデックス:はい、もちろん可能です。ただし、ソリューション3を選択する場合、ユーザーのプロジェクトのリストまたはプロジェクト内のユーザーのリストを取得するためのクエリを実行しないため、インデックスはまったく必要ありません。解決策3を使用すると、読み取りは非常に簡単になりますが、書き込みは少し面倒になります。しかし、あなたが言ったように、あなたのユースケースはreading>>writing
を含みます 、ソリューション3を使用しますが、データの不整合の危険性が常にあり、注意する必要があります。
インデックスを作成すると、処理が速くなります。ドキュメントに目を通し、少しグーグルしてください。特別なことは何もありません。インデックス付き配列に対するクエリは、通常の配列よりも効率的です。例:ソリューション2を使用すると仮定します。プロジェクトIDをproject_idsフィールドに保存します。
ユーザーのプロジェクトを簡単に取得できます。これは簡単です。
しかし、project1のユーザーを獲得するため。このようなクエリを実行する必要があります。
User.find({project_ids:project._id},function(err,docs){
//here docs will be the list of the users of project1
})
//The above query might be slow if the user base is large.
//But it can be improved vastly by indexing the project_ids field in the User schema.
ソリューション1の場合と同様です。各プロジェクトにはuser_idsフィールドがあります。user1があると仮定します。ユーザーのプロジェクトを取得するには、次のクエリを実行します
Project.find({user_ids:user1._id},function(err,docs){
//here docs will be the projects of user1
//But it can be improved vastly by indexing the user_ids field in the Project schema.
ソリューション1とソリューション2について熟考している場合は、ソリューション1の方が優れていると思います。彼のプロジェクトなしでユーザーが必要な場合もありますが、ユーザーなしでプロジェクトが必要になる可能性はかなり低いです。ただし、正確な使用例によって異なります。