草庐IT

mongodb - 对 MongoDB 架构设计的建议

coder 2023-05-04 原文

假设您想对某种情况进行建模。公司可以有一个或多个分支机构。这些分支机构的员工可以在不同的公司(甚至同一公司的两个不同的分支机构)工作。这当然只是一个例子。

我们还假设大多数搜索/查询将针对员工和公司集合进行。

第一种(天真的)方法是嵌入所有内容(公司有一系列分支机构,而分支机构有一系列员工):

{
    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/

有关mongodb - 对 MongoDB 架构设计的建议的更多相关文章

  1. ruby-on-rails - Rails - 子类化模型的设计模式是什么? - 2

    我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co

  2. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  3. LC滤波器设计学习笔记(一)滤波电路入门 - 2

    目录前言滤波电路科普主要分类实际情况单位的概念常用评价参数函数型滤波器简单分析滤波电路构成低通滤波器RC低通滤波器RL低通滤波器高通滤波器RC高通滤波器RL高通滤波器部分摘自《LC滤波器设计与制作》,侵权删。前言最近需要学习放大电路和滤波电路,但是由于只在之前做音乐频谱分析仪的时候简单了解过一点点运放,所以也是相当从零开始学习了。滤波电路科普主要分类滤波器:主要是从不同频率的成分中提取出特定频率的信号。有源滤波器:由RC元件与运算放大器组成的滤波器。可滤除某一次或多次谐波,最普通易于采用的无源滤波器结构是将电感与电容串联,可对主要次谐波(3、5、7)构成低阻抗旁路。无源滤波器:无源滤波器,又称

  4. 计算机毕业设计ssm+vue基本微信小程序的小学生兴趣延时班预约小程序 - 2

    项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU

  5. HBase Region 简介和建议数量&大小 - 2

    Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile

  6. ruby-on-rails - 设计注册确认 - 2

    我在我的项目中有一个用户和一个管理员角色。我使用Devise创建了身份验证。在我的管理员角色中,我没有任何确认。在我的用户模型中,我有以下内容:devise:database_authenticatable,:confirmable,:recoverable,:rememberable,:trackable,:validatable,:timeoutable,:registerable#Setupaccessible(orprotected)attributesforyourmodelattr_accessible:email,:username,:prename,:surname,:

  7. ruby - Ruby 和 Ruby on Rails 中的三层架构 - 2

    我是一名决定学习Ruby和RubyonRails的ASP.NETMVC开发人员。我已经有所了解并在RoR上创建了一个网站。在ASP.NETMVC上开发,我一直使用三层架构:数据层、业务层和UI(或表示)层。尝试在RubyonRails应用程序中使用这种方法,我发现没有关于它的信息(或者也许我只是找不到它?)。也许有人可以建议我如何在RubyonRails上创建或使用三层架构?附言我使用ruby​​1.9.3和RubyonRails3.2.3。 最佳答案 我建议在制作RoR应用程序时遵循RubyonRails(RoR)风格。Rails

  8. ruby-on-rails - 设计通过 reset_password_token 获取用户 - 2

    我正在尝试创建密码规则来设计可恢复的密码更改。我通过passwords_controller.rb做了一个父类(superclass),但我需要在应用规则之前检查用户角色,但我所拥有的只是reset_password_token。 最佳答案 假设您的模型是用户:User.with_reset_password_token(your_token_here)Source 关于ruby-on-rails-设计通过reset_password_token获取用户,我们在StackOverflow

  9. ruby-on-rails - Rails 5,公寓和设计 : sign in with subdomains are not working - 2

    我已经使用Apartment设置了一个Rails5应用程序(1.2.0)和Devise(4.2.0)。由于某些DDNS问题,应用只能在app.myapp.com下访问(请注意子域app)。myapp.com重定向到app.myapp.com。我的用例是每个注册该应用的用户(租户)都应该通过他们的子域(例如tenant.myapp.com)访问他们的特定数据。用户不应限定在其子域内。基本上应该可以从任何子域登录。重定向到租户的正确子域由ApplicationController处理。根据Devise标准,登录页面位于app.myapp.com/users/sign_in。这就是问题开始的

  10. ruby-on-rails - 我需要从 HTML 转到 markdown,有什么建议吗? - 2

    我正在使用Maruku,将Markdown(超集)转换为HTML,你知道我该怎么做才能从HTML转换为Markdown吗? 最佳答案 Google发现了一个名为reverse_markdown的ruby​​脚本.它似乎可以满足您的需求。 关于ruby-on-rails-我需要从HTML转到markdown,有什么建议吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/175162

随机推荐