嗨,我是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设计。
我需要做的是:
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
SELECT A.System_ID,A.Prop_Info FROM Authoization A,SYSTEM B WHERE A.System_ID = B.System_ID
任何人都可以帮助我如何将这些表设计为mongodb中的集合吗?
我需要嵌入r使用dbref吗?帮我设计一下这个架构。
答案 0 :(得分:2)
您的挑战来自两个查询都必须检索Prop_Info
的事实。这使得很难确定它应该存在哪个Mongo集合。
在MongoDB中,您可以创建文档架构,其理想目标是让单个文档在您的查询模式下获得所需的所有信息。如果您需要针对两个单独的集合D
和Prop_Info
提交相同的数据A
(例如您的B
),则需要必须在以下三种策略中进行选择:
在D
和A
的文档中复制B
,并强制与您的代码保持一致。这通常是高性能系统的设计选择,它们希望消除对第二个查询的需要,即使这是以插入/更新方面的额外代码复杂性为代价以及由于Mongo不是ACID而存在一些潜在的一致性问题。
将D
放入A
并在B
中存储引用(DBRef或其他一些标识字段组合),以便您可以通过第二个查询进行访问。当A
的查询数超过B
的查询数时,这通常是设计选择。它使D
保持本地更频繁查询的集合。在此架构设计模式中,您只需在查询B
时进行第二次查询。
将D
放入新收藏集C
,然后从A
和B
进行第二次查询。这通常是面对非常不确定的未来要求时的设计选择,如果您与上述(1)或(2)一起使用,则不清楚会有什么权衡取舍。它是最像"关系式的"架构以及在查询A
和B
时强制您进行第二次查询的架构。
您选择哪种策略取决于您的域,查询模式,从对象关系映射(ORM)框架获得的支持(如果您使用的话),以及最后但并非最不重要的,您的偏好。
在我遇到的情况下,我从未选择过(3)。我在高性能情况下(分析系统)使用过(1)。我已经在其他任何地方使用过(2),因为查询访问模式已经明确了"共享"数据应该存在。
一旦你选择了你的策略,如果你仍然需要帮助,请发布另一个SO问题,专门针对所选策略的架构设计问题。
最后三个提示:
如果共享数据D
具有大于1的关系,则使用数组。您可以索引整个数组,并且可以使用$elemMatch
精确查询数组内部。
要更新策略(1)或(2)中的D
,请使用MongoDB' atomic modifier operations,其中许多设计用于在阵列上运行。
This SO question涵盖了@Stennie的答案中的DBRef两种查询模式。 (@Stennie适用于MonggenDB的标记10gen。)
答案 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是一个面向文档的数据库。