特定の状況をモデル化するとします。会社は 1 つまたは複数の支店を持つことができます。そして、それらの支店には、別の会社 (または同じ会社の 2 つの異なる支店) で働くことができる従業員がいます。もちろんこれはほんの一例です。
また、ほとんどの検索/クエリが従業員と会社のコレクションに対して行われると仮定しましょう。
これを行う最初の(単純な)方法は、すべてを埋め込むことです(会社には支店の配列があり、支店には従業員の配列があります):
{
name: "Company name",
// other company data
branches : [
{
name: "Branch name",
// other branch data
Employees: [
{
// employee1 data
},
{
// employee data
},
]
}
]
}
しかし、これは、従業員情報を取得することに関心がある場合には非常に非効率的です (会社を取得してから、必要な従業員を見つけるためにすべてのブランチを反復処理する必要があります)。
反対に、参照を使用して RDBMS を模倣することもできます (Company、Branch、Employee コレクションがあります) が、それはより多くのクエリを意味します。
3 番目のオプション (私が最も近い) は、Employee を別のコレクションとして保持し、Branches でそれへの参照の配列を保持することです。また、「特定の会社と特定の支店で働く、特定の名前の従業員」などのより高速なクエリを可能にするために、Company ObjectId を Employee コレクションに格納できます。
{
company_id: "some id",
first_name: "First name",
last_name: "Last name",
//
}
したがって、この場合、特定の会社と特定の支店で働く特定の名前を持つすべての従業員を検索するには、2 つのクエリを実行する必要があります。最初のクエリは「会社の条件」 (会社名と支店名) を満たす会社を返し、次に Employee コレクションに対する 2 番目のクエリは、指定された名前を持ち、ID が最初のクエリで返された会社で働いているすべての従業員を返します。
これを別の方法で行いますか?これを行うための他の「推奨」方法はありますか?いくつかの改善を追加しますか?
さらに重要なことは、これら 2 つのクエリが小さな交差を持つ結果セットを返した場合、どうすればよいでしょうか? その場合のパフォーマンスを向上させる方法は?