Mongodb数据库架构设计技巧

时间:2012-09-02 20:25:56

标签: java mongodb

  

可能重复:
  Mongodb database Schema Design with shared data

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

我需要做的是:

SELECT D.Prop_Info, D.System_ID, A.Tenant_Info From TENANT A ,System_prop D, SYSTEM B, Where D.System_ID = B.System_ID AND D.Tenant_ID = A.Tenant_ID

SELECT C.System_ID, C.auth_Info, B.System_ID FROM Authorization C, SYSTEM B WHERE C.System_ID = B.System_ID

有人可以帮助我如何在mongodb中将这些表设计为集合吗?

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

根据您提供的架构信息,您看起来在租户和系统之间存在多对多关系(通过JOIN表System_prop),以及系统和授权之间的一对多关系。

在MongoDB中,可以使用数组字段实现这两种类型的关系。这是您设置系统集合的方法:

{
    System_Info: ...,

    Tenant: [ 
        { 
            Tenant_Id: ..., 
            Tenant_Info: ..., 
            Prop_Info: ...
        }, 
        { 
            Tenant_Id: ..., 
            Tenant_Info: ..., 
            Prop_Info: ...
        } ],

    Authorization: [ 
        {
            Auth_Id: ..., 
            Auth_Info: ...
        }, 
        {
            Auth_Id: ..., 
            Auth_Info: ...
        } ]
}

但是,对于租户信息,您现在将取消规范化重复信息,即同一租户文档出现在不同的系统文档中。由您的应用程序来确保一致性。

至于您提到的查询:看起来有些信息丢失了。对于第一个查询,您要加入Tenant_Id但不要求租户表中的任何信息。第二个请求授权表中的Prop_Info,但该表没有Prop_Info。那应该是A.Autho_Info吗?因此,您可能需要仔细检查这些查询。

以下是有关MongoDB中架构设计的一些额外资源,值得一读:

http://www.mongodb.org/display/DOCS/Schema+Design

https://openshift.redhat.com/community/blogs/designing-mongodb-schemas-with-embedded-non-embedded-and-bucket-structures

最后,它取决于您的应用程序和最常见的查询您选择如何存储数据,上面的示例只是设置架构的一种方法。