リレーショナルデータベースの場合と同じように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つだけです。