mongodb: это где я должен просто нормализовать мои встроенные объекты? - PullRequest
2 голосов
/ 03 марта 2012

У меня есть коллекция Parent с, которая содержит EmbeddedThing с, и каждый EmbeddedThing содержит ссылку на User, который ее создал.

UserCollection: [
  {
    _id: ObjectId(…),
    name: '…'
  },
  …
]

ParentCollection: [
  {
    _id: ObjectId(…),
      EmbeddedThings: [
      {
        _id: 1,
        userId: ObjectId(…)
      },
      {
        _id: 2,
        userId: ObjectId(…)
      }
    ]
  },
  …
]

Я скоро понял, что янужно получить все EmbeddedThing с для данного пользователя, что мне удалось сделать с помощью map / redu:

"results": [
  {
    "_id": 1,
    "value": [ `EmbeddedThing`, `EmbeddedThing`, … ]
  },
  {
    "_id": 2,
    "value": [ `EmbeddedThing`, `EmbeddedThing`, … ]
  },
  …
]

Это где я должен просто нормализовать EmbeddedThing в его собственную коллекцию, или долженЯ все еще держу карту / уменьшить, чтобы выполнить это?Может быть, какой-то другой дизайн?

Если это поможет, пользователи увидят свой список EmbeddedThing во всех Parent, в отличие от какой-то задачи по отчетности / агрегированию (что заставило меня понять, что ямогу ли я сделать это неправильно).

Спасибо!

1 Ответ

2 голосов
/ 03 марта 2012

«Встраивать или не встраивать: вот в чем вопрос»:)

Мои правила:

  • embed, если внедренный объект имеет смысл только в контексте родительских объектов. Например, OrderItem без Order не имеет смысла.
  • вставлять, если это диктуется требованиями к производительности. Читать полное дерево документа очень дешево (в отличие от необходимости делать несколько запросов и соединять их программно).

Вы должны посмотреть на ваши шаблоны доступа. Если вы загружаете ParentThing несколько тысяч раз в секунду и загружаете User раз в неделю, вероятно, хорошим выбором будет сокращение карты. Пользовательский запрос будет медленным, но он может подойти для вашего приложения.

Еще один подход - денормализовать еще больше. То есть, когда вы добавляете внедренную вещь, добавьте ее как родительской вещи, так и пользователю.

  • Плюсы: запросы быстрые.
  • Минусы: сложный код. Двойное количество записей. Потенциальная потеря синхронизации (вы обновляете / удаляете в одном месте, но забыли сделать в другом).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...