假设您想对某些情况进行建模。公司可以有一个或多个分支机构。这些分支机构的员工可以在不同的公司(甚至同一公司的两个不同的分支机构)工作。这当然只是一个例子。
我们还假设大多数搜索/查询将在员工和公司集合上完成。
第一种(天真的)方法是嵌入所有内容(公司有分支机构,分支机构有员工):
{
name: "Company name",
// other company data
branches : [
{
name: "Branch name",
// other branch data
Employees: [
{
// employee1 data
},
{
// employee data
},
]
}
]
}
但是当人们对检索员工信息感兴趣时,这将是非常低效的(必须检索公司,然后遍历每个分支机构以查找所需的员工)。
另一方面,可以使用引用并模仿 RDBMS(会有 Company、Branch 和 Employee 集合),但这意味着更多的查询。
第三个选项(我最接近)是将 Employee 作为一个单独的集合,然后在 Branches 中有一个对它的引用数组。此外,为了允许更快的查询,例如:“具有特定名称的员工,为特定公司和特定分支机构工作”,Company ObjectId 可以存储在 Employee 集合中:
{
company_id: "some id",
first_name: "First name",
last_name: "Last name",
//
}
因此,在这种情况下,要搜索为特定公司和特定分支机构工作的具有特定姓名的所有员工,必须进行两次查询。第一个查询将返回满足“公司条件”(公司名称和分支机构名称)的公司,然后对 Employee 集合的第二个查询将返回所有具有指定名称且在其 id 在第一个查询中返回的公司工作的员工。
你会以其他方式做到这一点吗?有没有其他“推荐”的方式来做到这一点?你会添加一些改进吗?
更重要的是,当这两个查询返回的结果集有小的交集时怎么办?在这种情况下如何提高性能?