草庐IT

具有共享数据的 Mongodb 数据库架构设计

coder 2023-11-02 原文

您好,我是 mongodb 的新手。我正在使用 java。

我的关系表中有 4 个表 Tenant、system、authorization。

像这样。

Table            Fields

Tenant           Tenant_ID(PK), Tenant_INFO
System           System_ID(PK), System_Info
Authorization    System_ID, Autho_Info.
System_prop      System_ID, Prop_Info, Tenant_ID

在System_prop表中,Tenant_ID是指租户表Tenant_ID(PK),System_ID是指系统表System_ID。

在Authorization表中,System_ID指的是System标签System_ID

我正在将我的数据库从关系数据库切换到 mongodb。我需要做的第一件事是架构设计。

我需要做的查询是:

  1. 从 System_prop A、SYSTEM B、租户 C 中选择 A.Prop_Info、A.System_ID,其中 A.System_ID = B.System_ID AND A.Tenant_ID = C.Tenant_ID

  2. SELECT A.System_ID, A.Prop_Info FROM Authoization A, SYSTEM B WHERE A.System_ID = B.System_ID

任何人都可以帮助我如何将这些表设计为 mongodb 中的集合?

我需要嵌入 r 使用 dbref 吗?帮助我为此设计架构。

最佳答案

您的挑战来自 Prop_Info 必须由两个查询检索的事实。这使得很难确定它应该位于哪个 Mongo 集合中。

在 MongoDB 中,您创建文档模式的理想目标是让单个文档在给定查询模式的情况下拥有您需要的所有信息。如果您需要通过针对两个单独集合的两个单独查询返回相同的数据 D(例如 Prop_Info 在您的情况下)AB,您必须在以下三种策略中进行选择:

  1. AB 的文档中复制D,并强制与您的代码保持一致。这通常是高性能系统的设计选择,它们希望消除对第二个查询的需要,即使这会以插入/更新端的额外代码复杂性为代价,并且由于 Mongo 不是 ACID 而存在一些潜在的一致性问题。

  2. D 放入 A 并在 B 中存储一个引用(DBRef 或其他标识字段的组合),以便您可以通过第二个查询找到它。当对 A 的查询数量超过对 B 的查询数量时,这通常是设计选择。它将 D 保留在更频繁查询的集合的本地。在此架构设计模式中,您只需在查询 B 时进行第二次查询。

  3. D 放入新集合 C 中,并从 AB<>。这通常是面对非常不确定的 future 需求时的设计选择,在这种情况下,如果您选择上述 (1) 或 (2),您不清楚权衡是什么。它是最“类似关系”的架构,当您同时查询 AB 时,它会强制您进行第二次查询。

您选择哪种策略取决于您的领域、查询模式、您从对象关系映射 (ORM) 框架(如果您使用一个)获得的支持,以及最后但并非最不重要的一点,您的偏好。

在我遇到的情况下,我从来没有选择(3)。我在高性能情况下(分析系统)使用过(1)。我在其他任何地方都使用了 (2),因为查询访问模式使“共享”数据应该存在的位置变得显而易见。

一旦你选择了你的策略,如果你仍然需要帮助,请发布另一个 SO 问题,该问题专门关注给定所选策略的模式设计问题。

最后三个提示:

  1. 如果共享数据 D 具有大于 1 的关系重数,则使用数组。您可以索引整个数组,并且可以使用 $elemMatch 在数组内部精确查询.

  2. 要在策略 (1) 或 (2) 中更新 D,请使用 MongoDB 的 atomic modifier operations ,其中许多设计用于对数组进行操作。

  3. This SO question在@Stennie 的回答中涵盖了 DBRef 两种查询模式。 (@Stennie 为 10gen 工作,MongoDB 的标记。)

祝你好运!

关于具有共享数据的 Mongodb 数据库架构设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12239045/

有关具有共享数据的 Mongodb 数据库架构设计的更多相关文章

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

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

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  4. ruby - 通过 ruby​​ 进程共享变量 - 2

    我正在编写一个gem,我必须在其中fork两个启动两个webrick服务器的进程。我想通过基类的类方法启动这个服务器,因为应该只有这两个服务器在运行,而不是多个。在运行时,我想调用这两个服务器上的一些方法来更改变量。我的问题是,我无法通过基类的类方法访问fork的实例变量。此外,我不能在我的基类中使用线程,因为在幕后我正在使用另一个不是线程安全的库。所以我必须将每个服务器派生到它自己的进程。我用类变量试过了,比如@@server。但是当我试图通过基类访问这个变量时,它是nil。我读到在Ruby中不可能在分支之间共享类变量,对吗?那么,还有其他解决办法吗?我考虑过使用单例,但我不确定这是

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

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

  6. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  7. ruby-on-rails - Rails 3.1 中具有相同形式的多个模型? - 2

    我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#

  8. ruby - 我如何添加二进制数据来遏制 POST - 2

    我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_

  9. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  10. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

随机推荐