【问题标题】:Embedding Vs Linking in MongoDB.when to embed and when to link?在 MongoDB 中嵌入与链接。何时嵌入以及何时链接?
【发布时间】:2011-11-23 09:29:26
【问题描述】:

我阅读了this page,但不知道何时使用嵌入功能以及何时使用链接。我在 django 中有一个项目,我正在使用 MongoDB。在我的 models.py 文件中,我有以下模型:

class Projects(models.Model):
    projectName =models.CharField(max_length = 100,unique=True,db_index=True)
    projectManager = EmbeddedModelField('Users')

class Teams(models.Model):
    teamType = models.CharField(max_length =100)
    teamLeader = EmbeddedModelField('Users')
    teamProject = EmbeddedModelField('Projects')
    objects = MongoDBManager()

class Users(models.Model):
    name = models.CharField(max_length = 100,unique=True)
    designation = models.CharField(max_length =100 )
    teams = ListField(EmbeddedModelField('Teams'))



class Tasks(models.Model):
    title = models.CharField(max_length = 150)
    description = models.CharField(max_length=1000)
    priority = models.CharField(max_length=20)
    Status = models.CharField(max_length=20)
    assigned_to = EmbeddedModelField('Users')
    assigned_by = EmbeddedModelField('Users')
    child_tasks = ListField()
    parent_task = models.CharField(max_length = 150)

我的问题是,如果我们进行嵌入,我们是否必须更新所有模型中的对象。就像我想更新“用户”的名称一样,我必须为模型运行更新:项目、团队、用户和在我的情况下,任务或链接会更好吗?

【问题讨论】:

    标签: python django mongodb django-nonrel


    【解决方案1】:

    在您的示例中,是的,更改用户名意味着如果您使用嵌入,那么您必须通过额外的步骤更新所有其他文档。在您的情况下更合适的是链接(引用)。这涉及到查询时的额外步骤,但由于您的特定“业务逻辑”,它会更好。

    一般来说,如果一个给定的文档需要从多个不同的地方访问,那么将其作为参考而不是嵌入是有意义的。这同样适用于文档频繁更改的情况。

    【讨论】:

    • 只需将所有 EmbeddedModelField('Users') 替换为 ReferenceField('Users')。
    • 但是我使用的是 Django-mongoDB 引擎,它没有像 ReferenceField 这样的字段。 :(
    • 好吧,我不知道。为什么不切换到更成熟的mongoengine?
    【解决方案2】:

    首先,从概念上讲,将模型类命名为单个对象。

    用户应该是用户,团队应该是团队......

    将模型视为制作多个对象的模具。用户模型将生产用户并存储在一个名为用户的表中,其中每个文档/行都是一个用户对象。

    现在,关于您的问题,hymloth 是完全正确的。使其成为对文档而不是嵌入文档的引用的方法是更改​​这些特定字段以引用用户集合中用户的 id。这样,您只需存储要查找的 id 而不是用户文档的副本。当您更改参考文档时,它会在所有被参考的地方发生变化。 (典型的关系关联)

    我也没有在 Django-mongoDB 中看到该字段,但也许您可以为此目的使用传统的 django ForeignKey 字段。不知道能不能混搭,试一试吧。

    例如,您的 Teams 类将具有如下字段:

    teamLeader = ForeignKey(User)
    

    让我知道这是否有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多