Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么MongoDB推荐双向引用?Isn';这不就是循环引用吗?_Mongodb_Circular Reference - Fatal编程技术网

为什么MongoDB推荐双向引用?Isn';这不就是循环引用吗?

为什么MongoDB推荐双向引用?Isn';这不就是循环引用吗?,mongodb,circular-reference,Mongodb,Circular Reference,参考资料: 在MongoDB的一篇教程文章中,它特别鼓励双向引用。如您所见,Person文档引用Tasks文档,反之亦然 我认为在大多数情况下应该避免循环引用。该网站没有解释为什么它对MongoDB不是问题。请有人帮我理解为什么这在MongoDB中是可能的,因为它在SQL中是一个很大的禁忌?我知道这更像是一个理论问题,但如果有充分的理由,我想在我正在研究的数据库中实现这种类型的设计。如果你从中得出一个循环引用,它只是一个循环引用 意思:假设您想将Mongo文档打印成JSON字符串,以便在浏览器

参考资料:

在MongoDB的一篇教程文章中,它特别鼓励双向引用。如您所见,Person文档引用Tasks文档,反之亦然


我认为在大多数情况下应该避免循环引用。该网站没有解释为什么它对MongoDB不是问题。请有人帮我理解为什么这在MongoDB中是可能的,因为它在SQL中是一个很大的禁忌?我知道这更像是一个理论问题,但如果有充分的理由,我想在我正在研究的数据库中实现这种类型的设计。

如果你从中得出一个循环引用,它只是一个循环引用

意思:假设您想将Mongo文档打印成JSON字符串,以便在浏览器中打印。您不想在任务部分下打印一堆ID,而是想打印实际名称。在这种情况下,您必须按照ID打印名称。 但是:如果您现在进入对象并解析所有者对象后面的ID,您将再次打印您的个人。如果你用这种方式编程的话,这种情况可能会持续下去。如果你不知道,那只是一堆身份证

编辑:根据您的实现,ID不会自动解析,因此不会引起头痛

有一件事:根据您的数据结构和性能考虑,将任何对象直接放入父文档有时会更容易。在两侧引用ID仅在多对多关系中才有意义


HTH

谢谢@Codebaard。我认为有一种特殊的方法可以防止双向引用引起的潜在问题。那将是我的下一个任务。正如您所指出的,我计划在多对多关系中使用它,但我也可能会探讨它是否可以提高频繁阅读文档的阅读性能(比如在person文档中嵌入任务文档的子集,比如10个大多数任务)。很高兴我能帮上忙。把我的答案标记为解决方案。
db.person.findOne()
    {
        _id: ObjectID("AAF1"),
        name: "Kate Monster",
        tasks [     // array of references to Task documents
            ObjectID("ADF9"), 
            ObjectID("AE02"),
            ObjectID("AE73") 
            // etc
        ]
    }
    
db.tasks.findOne()
    {
        _id: ObjectID("ADF9"), 
        description: "Write lesson plan",
        due_date:  ISODate("2014-04-01"),
        owner: ObjectID("AAF1")     // Reference to Person document
    }