2013-06-16 4 views
1

В настоящее время я разрабатываю схему db для приложения, которое будет использовать mongodb и spring-data. Я совершенно новый для баз данных NoSQL и struggeling со следующей проблемой дизайна:Советы по дизайну схемы MongoDB

приложение будет иметь три простые объекты домена: Users, Notes и Tags. Пользователи могут владеть несколькими Notes (1: n), и каждый примечание аннотируется с использованием одного или нескольких тегов (n: m).

Теперь моя проблема:, что я не могу понять, что является лучшим способом разработки отношений «один ко многим» между Notes и тегами.

Основная информация о запросе Notes для пользователя с помощью аннотированных тегов. Поэтому мой первый подход заключался в том, чтобы вставить теги внутри Notes. Я мог бы справиться с избыточностью здесь, так как я действительно хочу, чтобы часто выполнялись быстрые операции чтения и обновления Notes и/или тегов. Однако мне также нужно запросить список всех тегов пользователя (т. Е. Реализовать функции «вперед» при поиске заметок по тегам).

В настоящее время моего Примечания документы выглядят примерно так:

{ 
    "id":"51bcf4a97aecbafaf5e79713", 
    "label":"Label of the Note", 
    "contents":"Contents of the Note", 
    "owner":"username", 
    "tags":[ 
     {  
     "name":"Tag1", 
     "type":"default" 
     }, 
     {  
     "name":"Tag2", 
     "type":"default" 
     } 
    ] 
} 

Моих основными вопросов:

  • Если я иду с вложением, что был бы наилучшим способом эффективного запроса для список всех тегов пользователя (без дубликатов)?
  • Было бы лучше использовать ссылку на встраивание в эту настройку? Как я могу затем запросить для всех Notes, которые аннотируются со списком определенных тегов? (Возможно ли это вообще?)

Спасибо advanve за вашу помощь и советы :-)

ответ

2

Я хотел бы предложить, чтобы хранить заметки, как вы описали и дополнительно хранить все используемые тег в пользовательском документе. Помните, что избыточность данных допустима в MongoDB, и очень часто это лучший способ, так как вы должны проектировать свою схему для чтения, а не для записи.

Затем на стороне Java вы просто храните теги в Set как свойство класса User, чтобы вы могли хранить там уникальные данные.

Смежные вопросы