sql >> データベース >  >> NoSQL >> MongoDB

nosqlとの多対多の関係(mongodbおよびmongoose)

    それどころか、解決策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の方が優れていると思います。彼のプロジェクトなしでユーザーが必要な場合もありますが、ユーザーなしでプロジェクトが必要になる可能性はかなり低いです。ただし、正確な使用例によって異なります。



    1. $ unionWith –MongoDBのUNIONALLに相当

    2. すべてのホストにmongodbのレプリカセットを許可する方法

    3. Java mongodbドライバーの_idフィールドを使用してドキュメントをクエリする方法は?

    4. sidekiqのジョブの実行時間を短縮します