design - MongoDB替代设计

  显示原文与译文双语对照的内容
0 0

因为真正的不可能返回单个嵌入式文档 ( 但是),所以什么是好的数据库设计替代?

现在有情况,我有一个对象。 首先有一个第二个对象的array 。 第二个对象具有第三个对象的array 。

db.myDb.findOne()
{
"_id" : ObjectId("..."),
"Seconds" : [
 {
"Second Name" :"value",
"Thirds" : [
 {
"Third Name" :"value" 
 }
 ]
 }
 ]
}

我有一个网站,显示了第一个对象的列表。 你可以以选择第一个对象,它将带你到一个显示第一个对象列表的细节的页面。 如果选择第二个对象,同样的事情会发生。

当拉出第三个页面时,查询获取单个第一个对象似乎是不正确的。 直接得到第三个对象会容易得多,可能是通过 _id 。

也许我仍然在 SQL,中,但是在这种情况下,我想为每个类型创建一个集合。

这是正确的解决这个问题的方法,或者者我只是在文档土地上不清楚。

时间:原作者:1个回答

0 0

我认为这将取决于。 如果你经常需要访问没有包含'第一'的'第二'或者'第三'项,那么也许它们最好不要嵌入。

我曾经用来帮助我确定某事是否更好的问题是问自己是否是它的中的一部分或者与它的相关。 比如,'第一'实际上包含一个或者多个''( 等等),或者它们是以某种方式相互关联的? 从表面上看,我会说一个博客帖子包含评论但是用户/*author*可能不包含帖子列表,而是以某种方式链接到不同的集合。

可以使用 DBRef 通过MongoDB实现交叉集合关系。 这是一种特殊类型,描述与另一个对象的关系。 如果项目确实属于它们自己的集合,那么它们可以在彼此之间有一个 DBRef 。 这些可以按你想要的方式走( 例如 。 它们的集合中的一个集合,或者每个子对象的第二个集合,可以有一个指向它的父。

示例 1 - 每个父对象都有一个子引用集合:

db.firsts.findOne()
{
"_id" : ObjectId("..."),
"Seconds" : [
 { $ref : 'seconds', $id : <idvalue> },
 { $ref : 'seconds', $id : <idvalue> },
 { $ref : 'seconds', $id : <idvalue> }
 ]
}
db.seconds.findOne()
{
"_id" : ObjectId("..."),
"Second Name" :"value",
"Thirds" : [
 { $ref : 'thirds', $id : <idvalue> },
 { $ref : 'thirds', $id : <idvalue> }
 ]
}
db.thirds.findOne()
{
"_id" : ObjectId("..."),
"Third Name" :"value"
}

示例 2 - 每个子元素都有对其父级的引用

db.firsts.findOne()
{
"_id" : ObjectId("...")
}
db.seconds.findOne()
{
"_id" : ObjectId("..."),
"First" : { $ref : 'firsts', $id : <idvalue> }
"Second Name" :"value",
}
db.thirds.findOne()
{
"_id" : ObjectId("..."),
"Second" : { $ref : 'seconds', $id : <idvalue> }
"Third Name" :"value"
}

语言驱动程序大多数都有一种处理 DBRefs的方法,比在控制台( 通常用某种方法'dbref'类) 中更简洁的方式。 这样做意味着你有更多的数据库请求,但是如果对于应用程序很有意义,或者者'秒'或者'三分'的。

第二种方法最像你将使用传统的关系数据库。 MongoDB的优点是,当它实际上有意义的时候,它允许你工作,而不是在这样做的时候。 非常灵活,最终取决于你的数据和应用程序,这对你有什么意义。 最终你应该使用哪种方法的答案取决于你的应用程序和它存储的数据。

原作者:
...