具有共享数据的Mongodb数据库模式设计

时间:2012-09-02 19:26:37

标签: mongodb mongodb-java mongodb-query

嗨,我是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。

在授权表中,System_ID引用System tabel System_ID

我正在将我的数据库从关系转换为mongodb。我需要做的第一件事是Schema设计。

我需要做的是:

  1. SELECT A.Prop_Info,A.System_ID来自System_prop A,SYSTEM 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,SYSTEM B WHERE A.System_ID = B.System_ID

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

    我需要嵌入r使用dbref吗?帮我设计一下这个架构。

3 个答案:

答案 0 :(得分:2)

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

在MongoDB中,您可以创建文档架构,其理想目标是让单个文档在您的查询模式下获得所需的所有信息。如果您需要针对两个单独的集合DProp_Info提交相同的数据A(例如您的B),则需要必须在以下三种策略中进行选择:

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

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

  3. D放入新收藏集C,然后从AB进行第二次查询。这通常是面对非常不确定的未来要求时的设计选择,如果您与上述(1)或(2)一起使用,则不清楚会有什么权衡取舍。它是最像"关系式的"架构以及在查询AB时强制您进行第二次查询的架构。

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

    在我遇到的情况下,我从未选择过(3)。我在高性能情况下(分析系统)使用过(1)。我已经在其他任何地方使用过(2),因为查询访问模式已经明确了"共享"数据应该存在。

    一旦你选择了你的策略,如果你仍然需要帮助,请发布另一个SO问题,专门针对所选策略的架构设计问题。

    最后三个提示:

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

    2. 要更新策略(1)或(2)中的D,请使用MongoDB' atomic modifier operations,其中许多设计用于在阵列上运行。

    3. This SO question涵盖了@Stennie的答案中的DBRef两种查询模式。 (@Stennie适用于MonggenDB的标记10gen。)

    4. 祝你好运!

答案 1 :(得分:2)

你可能只需要一个包含所有文档的集合,当然你最终会有太多的重复字段,但这是一个很好的扩展技巧。 对于关系类型一对多和一对一,您将只删除标识符并放置其余属性,因为MongoDB将处理主键。 ('我喜欢MongoDB')。

对于Tenant和System之间的多对多关系,您必须将其更改为MongoDB数据结构中的数组。

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

答案 2 :(得分:1)

您仍在思考关系数据库。但是,MongoDB是一个面向文档的数据库。

  1. 通常不需要人工ID号,因为每个文档都自动有一个_id字段,这是一个GUID(保证全局唯一)。
  2. 不应在MongoDB中使用
  3. 关系表。 n型关系是用数组字段代替的。因此,当1个系统具有其使用的N个授权时,您的系统文档应该具有字段“授权”,该字段是其具有的授权的对象ID的数组。是的,这将严重违反关系数据库的规范化规则。但是这里没有关系数据库。在MongoDB中,用数组表示N关系是实用的,因为数组对查询语言是透明的。