Разработка схемы MongoDB для документа, который может быть встроен или автономен - PullRequest
0 голосов
/ 02 апреля 2012

Я относительно новичок в MongoDB и все еще привыкаю к ​​дизайну схемы.

В проекте, над которым я сейчас работаю, пользователи могут отмечать файлы, которые они загружают.Существует три типа тегов: описательный, бренд и store_department.Они представляются пользователю в виде трех полей, но в действительности они объединяются и сохраняются в виде тегов, а именно:

"tags" : [
  {
    "type" : "descriptive",
    "tag" : "this is my tag"
  },
  {
    "type" : "brand",
    "tag" : "this is another tag"
  }
]

Это облегчает поиск.Используя тип, я могу представить пользователю три различных поля, чтобы побудить их предоставить информацию, а затем разрешить более сложные запросы, такие как поиск по бренду или отделу магазина.Поиск по умолчанию будет просто искать соответствующие теги.

Проблема в том, что я предоставляю функцию автозаполнения во всех полях.Когда пользователь вводит в поле «бренд», отображаются все созданные теги типа «бренд», которые соответствуют его вводу.Это легко сделать, если у вас есть отдельная коллекция тегов.Новые документы тегов создаются и обновляются при сохранении файла документа.Автозаполнение запросов к автономной коллекции тегов вместо встроенных тегов для производительности.

Что-то не так с этим дизайном.В некотором отношении это дублирование усилий, но, похоже, оно отлично работает с точки зрения взаимодействия с пользователем.Я использую Mongoid, и для размещения этого дизайна пришлось создать две модели для моих коллекций тегов.Тот, который определяет два атрибута, и второй, который наследуется от первого, но добавляет макрос внедренный.

Я мог бы видеть, что этот шаблон полезен и в других случаях: товары и корзины покупок, товары и заказы на покупку и т. Д.. Есть ли лучший способ?

1 Ответ

0 голосов
/ 02 апреля 2012

Что-то не так с этим дизайном.В некотором отношении это дублирование усилий, но, похоже, оно отлично работает с точки зрения взаимодействия с пользователем.

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

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

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

"tags" : { "descriptive: [ "this is my tag" ],
           "brand": ["this is another tag" ] }
...