MongoDB的数据库架构设计与共享数据(Mongodb database Schema Desig

2019-06-27 17:49发布

你好我是新手,我mongodb.I使用Java。

我有4个表租客,系统,授权在我的关系表。

事情是这样的。

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。

在授权表,SYSTEM_ID是指系统TABEL SYSTEM_ID

我从关系到MongoDB的转换我的数据库。 我需要做的第一件事是架构设计。

查询我需要做的是:

  1. SELECT A.Prop_Info,A.System_ID从System_prop A,系统B,TENANT C其中A.System_ID = B.System_ID AND A.Tenant_ID = C.Tenant_ID

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

谁能帮我如何设计这些表在MongoDB的收藏?

我需要嵌入R中,使用DBREF? 帮我设计这个架构。

Answer 1:

你的挑战来自于这样的事实Prop_Info必须由这两个查询检索。 这使得它很难找出哪些蒙戈集合应该居住。

在MongoDB中,您创建一个理想的目标文档架构一个单一的文件有你需要给你的查询模式的所有信息。 在你需要有相同的数据的情况下D (如Prop_Info你的情况)通过对两个单独集合两个单独的查询返回AB ,您有以下三种策略之间进行选择:

  1. 重复D在这两个文件AB ,并与您的代码执行的一致性。 这是典型的设计选择是要消除对第二查询的需求即使会造成额外的代码复杂度的插入/更新侧,并与一些潜在的一致性问题的成本,因为蒙戈不耐酸的高性能系统。

  2. DA和存储在参考(DBREF或识别字段的一些其它组合) B ,这样就可以得到它与第二查询。 这通常是设计的选择,当查询的数目A超过查询的数目B 。 它使D地方来的更频繁查询的集合。 在这种架构设计模式,你只需要进行第二次查询时您查询B

  3. D在一个新的集合C并从两个进行第二次查询,它AB 。 这通常是设计选择的未来非常不确定的需求,面对它在哪里并不清楚,如果你去权衡将是什么(1)或(2)以上。 这是最“关系式”模式和一个将迫使你进行第二次查询时,您既查询AB

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

在我遇到的情况,我从来没有选择(3)。 我在高性能的情况下(分析系统)使用(1)。 我用(2)其他地方,因为查询访问模式,取得了很明显这里的“共享”的数据应该住。

一旦你选择你的策略,如果你仍然需要帮助,张贴其他SO疑问,特别是侧重于提供给所选择的战略模式设计问题。

三个最后提示:

  1. 如果共享数据D具有多个关系大于1只使用阵列更大。 你可以索引整个阵列,您可以查询使用精确的内部数组$elemMatch

  2. 更新D在策略(1)或(2)使用MongoDB的原子改性剂的操作 ,其中有许多是设计为在阵列操作。

  3. 这太问题涵盖了@ Stennie的答案DBREF两种查询方式。 (@Stennie工程10gen的,MongoDB中的标记。)

祝好运!



Answer 2:

您可能只需要一个与所有的文件集,当然你最终会由有太多的重复场,但是这是为了很好地扩展的伎俩。 对于关系类型一对多和一对一你只是删除这些标识符,并把其余属性,因为MongoDB的将主键的照顾。 (“我爱的MongoDB为”)。

对于许多人,你有租户和系统之间你将不得不将其更改为MongoDB中的数据结构数组一对多的关系。

coll{
Tenant : 'value',
tenant_info : 'value',
Sys_info: 'value' ,
auth_info: 'value' ,
Prop_info : array [ 'value','value',''value....]
}


Answer 3:

你还是想在关系数据库中。 MongoDB的,但是,是一个面向文档的数据库。

  1. 通常不需要人工ID号码,因为每一个文档自动具有_id场,这是一个GUID(如作为保证是全局唯一的好)。
  2. 关系表不应在MongoDB中使用。 n型关系与阵列区域,而不是制造。 因此,当1个系统有它使用N个授权,系统文件应该有一个字段“授权”,这是它具有授权的对象ID的数组。 是的,这将是一个可怕的违反关系型数据库的规范化规则。 但是你没有关系数据库在这里。 MongoDB中是实用的表示与阵列的N-关系,因为阵列是透明的查询语言。


文章来源: Mongodb database Schema Design with shared data