Встраивание Vs Linking в MongoDB. Когда встраивать и когда связывать? - PullRequest
5 голосов
/ 23 ноября 2011

Я прочитал эту страницу , но не понял, когда использовать функцию встраивания, а когда использовать ссылки. У меня есть проект в 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)

Мой вопрос: если мы делаем встраивание, нужно ли обновлять объект во всех моделях? Как, если я хочу обновить имя пользователя, мне нужно запустить updateдля моделей: Проекты, Команды, Пользователи и Задачи или связывание было бы лучше в моем случае?

Ответы [ 2 ]

4 голосов
/ 23 ноября 2011

В вашем примере, да, изменение имени пользователя подразумевает, что, если вы используете встраивание, вы должны обновить все другие документы с дополнительным шагом.Что более уместно в вашей ситуации - это ссылки (ссылки).Это включает в себя дополнительный шаг во время запроса, но из-за вашей конкретной "бизнес-логики" это лучше.

Как правило, если к определенному документу требуется доступ из нескольких разных мест, то имеет смыслсделать его ссылкой, а не встроенным.То же самое относится к ситуациям, когда документ часто изменяется.

3 голосов
/ 23 ноября 2011

Во-первых, концептуально, назовите классы вашей модели как единичные объекты.

Пользователи должны быть пользователями, команды должны быть командой ...

Думайте о модели как о форме, из которой несколько объектовбудет сделано.Пользовательская модель произведет пользователей и будет храниться в таблице «Пользователи», где каждый документ / строка является объектом «Пользователь».

Теперь, в отношении вашего вопроса, hymloth совершенно прав.Чтобы сделать ссылку на документ вместо встроенного, нужно изменить эти конкретные поля, чтобы они ссылались на идентификатор пользователя в коллекции пользователя.Таким образом, вы просто сохраняете идентификатор для поиска вместо копии пользовательского документа.При изменении ссылочного документа он будет изменен во всех местах, на которые он ссылается.(Типичная реляционная ассоциация)

Я также не видел поля для этого в Django-mongoDB, но, возможно, вы можете использовать для этой цели традиционное поле ForeignKey django.Я не знаю, можете ли вы смешивать и сочетать, поэтому попробуйте.

например, у вашего класса Команды будет поле наподобие этого:

teamLeader = ForeignKey(User)

Дайте мне знать, если этоработы.

...