- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
假设您想对某种情况进行建模。公司可以有一个或多个分支机构。这些分支机构的员工可以在不同的公司(甚至同一公司的两个不同的分支机构)工作。这当然只是一个例子。
我们还假设大多数搜索/查询将针对员工和公司集合进行。
第一种(天真的)方法是嵌入所有内容(公司有一系列分支机构,而分支机构有一系列员工):
{
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 在第一个查询中返回的公司工作的员工。
您会以其他方式执行此操作吗?有没有其他“推荐”的方式来做到这一点?你会添加一些改进吗?
更重要的是,当这两个查询返回的结果集有小的交集时该怎么办?在这种情况下如何提高性能?
最佳答案
我认为你的方向是正确的。
虽然在某些情况下,MongoDB 中的非规范化不像关系数据库中那样邪恶,但实际上是正确的做法,但这里有一个案例,您应该使用多个集合。这是因为 MongoDB 文档的上限为 16MB。当你有一家非常大的公司,有很多分支机构,有很多员工,员工子文档变得更加复杂,你可以很容易地突破这个限制。
让员工推荐公司是个好主意。但是你应该考虑不要使用公司的_id字段,而是使用公司名称和分公司名称,只要你能保证它们的每个组合在公司集合中都是唯一的(比如在这两个上使用唯一的复合索引字段)。原因是当您查找员工时,您通常还需要公司和分支机构的名称。当您只有 _id 时,您必须进行额外的查询才能获得该信息。
您说您在分支机构和员工之间没有 1:n 的关系,而是 n:m 的关系。在这种情况下,我建议您为每个员工添加一个“分配”数组,其中包含具有两个字段的对象,company_name 和 company_branch(也许您想添加第三个字段“职位”,说明他或她在做什么那里)。
您的员工文件将如下所示:
{
first_name: "First name",
last_name: "Last name",
//
assignments: [
{ company:"Aperture Science", branch:"R&D", position:"test subject" },
{ company:"Black Mesa", branch:"security", position:"leader of blue shift" }
]
}
请注意,您可以在这里使用无模式数据库的优势:您可以轻松地拥有不仅有分支机构,甚至更多层次结构级别(如部门和组)的公司,而其他公司则没有。
但是当我想重命名公司或分支机构时怎么办?
在这种情况下,您必须更新引用重命名的公司/分支机构的每个员工文档。是的,对于这种情况,它不是最有效的模式。但请记住,MongoDB 模式应始终针对最常见的用例进行优化。您认为哪些情况会更频繁地发生:a) 公司或分支机构更名或 b) 有人想查找员工?
关于mongodb - 对 MongoDB 架构设计的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14044287/
是否可以简化在裸机上运行的这条链: 具有随时间变化的副本数的 StatefulSet 服务 使用 proxy-next-upstream: "error http_502 timeout invali
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我需要为应用程序制定架构。它专为销售产品而设计。 系统每天将接受大约 30-40k 的新产品。它将导致在表 product 中创建新记录。 系统应保留价格历史记录。用户应该能够看到产品 A 的价格在去
我需要一些帮助来理解 PHP 的内部工作原理。 还记得,在过去,我们曾经写过 TSR(Terminate and stay resident)例程(pre-windows 时代)吗?一旦该程序被执行,
1.Nginx 基础架构 nginx 启动后以 daemon 形式在后台运行,后台进程包含一个 master 进程和多个 worker 进程。如下图所示: master与
.NET Core:架构、特性和优势详解 在软件开发领域,保持领先地位至关重要。随着技术以指数级的速度发展,开发人员不断寻求高效、可扩展且多功能的解决方案来应对现代挑战。.NET Core 就是这样
本文深入探讨了Kubernetes(K8s)的关键方面,包括其架构、容器编排、网络与存储管理、安全与合规、高可用性、灾难恢复以及监控与日志系统。 关注【TechLeadCloud】,
我知道 CNN 的工作原理,包括每一层的用途(Dropout、Pooling 等)。但是,在为新数据集设计 CNN 时,我不知道要使用多少个 Conv-Relu-Pool 层,在最终获得输出之前我应该
在基于 REST 的架构中,资源和方法之间有什么区别。有吗? 最佳答案 资源是您的应用程序定义的东西;它们与物体非常相似。方法是 HTTP 动词之一,例如 GET、POST、PUT、DELETE。它们
我想用 oneOf仅在 xyType 的值上不同的模式属性(property)。我想要其中两个:一个是 xyType设置为 "1"第二个在哪里xyType是 任何其他值 .这可以使用 json 模式完
寻求 PHP 架构师的建议! 我对 PHP 不是很熟悉,但已经接管了一个用该语言编写的大型分析包的维护工作。该架构旨在将报告的数据读取到大型键/值数组中,这些数组通过各种解析模块传递,以提取每个模块已
这些存在吗? 多年来,我一直是大型强类型面向对象语言(Java 和 C#)的奴隶,并且是 Martin Fowler 及其同类的信徒。 Javascript,由于它的松散类型和函数性质,似乎不适合我习
我已经阅读了 Manning 的 Big Data Lambda Architecture ( http://www.manning.com/marz/BD_meap_ch01.pdf ),但仍然无法
在过去的几年里,我做了相当多的 iOS 开发,所以我非常熟悉 iOS 架构和应用程序设计(一切都是一个 ViewController,您可以将其推送、弹出或粘贴到选项卡栏中)。我最近开始探索正确的 M
我有以下应用程序,我在其中循环一些数据并显示它。 {{thing.title}} {{thing.description}}
昨天我和我的伙伴讨论了我正在开发的这个电子购物网站的架构。请注意,我为此使用 ASP.NET。他非常惊讶地发现我没有将添加到购物车的项目保留在 ArrayList 或其他通用列表中,而是使用 LINQ
我正在使用在 tridion 蓝图层次结构中处于较低位置的出版物。从蓝图中较高级别的出版物继承的一些内容和模式不适合我的出版物,并且永远不会被我的出版物使用。 我将跟进添加这些项目的内部团队,并尝试说
我目前已经在 Cassandra 中设计了一个架构,但我想知道是否有更好的方法来做事情。基本上,问题在于大多数(如果不是全部)读取都是动态的。我构建了一个分段系统作为应用程序服务,读取动态自定义查询(
我正在按照 documentation 中给出的 icingaweb UI v 2.0 布局执行在服务器上设置 icinga 的步骤。 。我成功进入设置页面,该页面要求您输入 token ,然后按照步
我必须保存来自不同社交媒体的用户的不同个人资料。例如用户可能有 1 个 Facebook 和 2 个 Twitter 个人资料。如果我保存每个配置文件它作为新文档插入不同的集合中,例如 faceboo
我是一名优秀的程序员,十分优秀!