2

基本的に他のユーザーに支払うべき日数を保持する「carpool_debts」を保存したいと思います。次のようになります。

carpool_debts{
              _id,
              owner,
              owner_id,
              creditors:[{name,
                          id,
                          amount},
                          {name,
                           id,
                           amount}
                        ]} 

そのデータ構造は、私が保存したいものに対して妥当に見えますか?また、そのデータ構造を実装することは維持するのが面倒に思えました。主にmeteorで利用できるupsertタイプの関数がまだないため、面倒だと感じました。債権者がサブドキュメントのリストである代わりに、債権者を区切り文字列として保存する方がよいでしょうか?私が正しい道を進んでいるのか、それとも何かが足りないのか知りたいのですが?ありがとう。

4

2 に答える 2

3

リレーショナルデータベースの場合と同じようにmongoドキュメントを構成できます。たとえば、債権者と所有者用に別々のコレクションを作成し、carpool_debtsを金額が添付されたリンクテーブルとして使用します。

carpool_debts{
              _id,
              owner_id,
              creditor_id,
              amount}

creditors{
          _id,
          name}

owners{
       _id,
       name}

ただし、これはmongodbを最大限に活用していません。特に、これが大量のデータを含むデータベースである場合は、最もよく使用されるクエリ用に最適化することをお勧めします。そうしないと、処理が遅くなります。たとえば、所有者の債務を検索するために最適化するために、債権者用のサブドキュメントと個々の債務用のサブドキュメントを使用して、所有者コレクションに必要なデータを追加できます。これは、すでに行ったことと同じです。

owners{
       _id,
       name,
       creditors: {id,
                   name,
                   debts: {
                           amount,
                           due_date}
                  }
      }

同様に、債権者の未払いの債務を頻繁に検索する場合は、債権者コレクションに債務情報を追加します。

creditors{
          _id,
          name,
          debtors: {
                    owner_id,
                    owner_name, 
                    debts: { 
                             aount,
                             due_date
                           }
                   }
         }

このように、必要なすべての情報を取得するには、1つのレコードを検索するだけで済みます。もちろん、落とし穴もあります。まず第一に、これはあまり乾燥していませんが、それは意図的なものです。ただし、何かが変更された場合は、他のテーブルを更新することを忘れないでください。たとえば、債権者の名前を変更する場合は、この債権者との債務があるすべての所有者ドキュメントを更新する必要があります(必ずインデックスを作成してください)。もちろん、これにより更新がはるかに遅くなります(そしてデータベースが大きくなります)が、あまり頻繁に更新せず、頻繁に検索する場合、これは問題にはなりません。また、たとえば債権者が数千の個別の未払い債務を抱えている可能性がある場合は、それをリンクテーブルに分割する必要があります。つまり、次のようにリンクコレクションを作成して、mongodbの最大ドキュメントサイズを超えないようにする必要があります。

creditors{
          _id,
          name,
         }

debtors: {
           owner_id,
           creditor_id, 
           debts: { 
                    amount,
                    due_date
                  }
          }

次に、債権者と所有者の接続ごとに1つのドキュメントがあります。これは、債権者を調べるときに検索するドキュメントが増えることを意味しますが、それでも所有者を検索するためのドキュメントは1つだけです。

于 2013-01-27T14:14:12.457 に答える
1

これは問題ないように見えますが、債権者を独自のコレクションに分割し、債権回収にcreditor_idの配列を格納することも検討できます。これにより、複雑さが軽減され、情報の検索とフィルタリングが容易になります。また、同じ債権者に複数の債務がある場合、債権者は1つの場所にしか保管されないため、より乾燥します。

また、債権回収の各ドキュメントを、所有者から単一の債権者への単一の債務にすることも検討できます。次に、リレーショナルデータベースのリンクテーブルのように、id、owner_id、creditor_idがあります。

于 2013-01-27T02:46:12.243 に答える