Лучшая практика mongodb: вложение - PullRequest
11 голосов
/ 24 февраля 2011

Является ли этот пример гнездования общепринятой хорошей или плохой практикой (и почему)?

Коллекция называется пользователями:

user
    basic
        name : value
        url : value
    contact
        email
            primary : value
            secondary : value
        address
            en-gb
                address : value
                city : value
                state : value
                postalcode : value
                country : value
            es
                address : value
                city : value
                state : value
                postalcode : value
                country : value

Редактировать: Из ответов в этом посте я обновил схему, применяя следующие правила (данные немного отличаются от приведенных выше):

  • Гнездо, но только на один уровень глубиной
  • Удалить ненужные ключи
  • Использование массивов для повышения гибкости объектов

    {
       "_id": ObjectId("4d67965255541fa164000001"),
       "name": {
         "0": {
           "name": "Joe Bloggs",
           "il8n": "en" 
          } 
        },
       "type": "musician",
       "url": {
         "0": {
           "name": "joebloggs",
           "il8n": "en" 
          } 
        },
       "tags": {
         "0": {
           "name": "guitar",
           "points": 3,
           "il8n": "en" 
          } 
        },
       "email": {
         "0": {
           "address": "joe.bloggs@example.com",
           "name": "default",
           "primary": 1,
           "il8n": "en" 
          } 
        },
       "updates": {
         "0": {
           "type": "news",
           "il8n": "en" 
          } 
        },
       "address": {
         "0": {
           "address": "1 Some street",
           "city": "Somecity",
           "state": "Somestate",
           "postalcode": "SOM STR",
           "country": "UK",
           "lat": 49.4257641,
           "lng": -0.0698241,
           "primary": 1,
           "il8n": "en" 
          } 
        },
       "phone": {
         "0": {
           "number": "+44 (0)123 4567 890",
           "name": "Home",
           "primary": 1,
           "il8n": "en" 
          },
         "1": {
           "number": "+44 (0)098 7654 321",
           "name": "Mobile",
           "il8n": "en" 
          } 
        } 
    }
    

Спасибо!

Ответы [ 4 ]

11 голосов
/ 25 февраля 2011

На мой взгляд, приведенная выше схема не «общепринятая», но выглядит великолепно.Но я предлагаю некоторые улучшения, которые помогут вам в будущем запрашивать ваш документ:

User
    Name 
    Url
    Emails {email, emailType(primary, secondary)}
    Addresses{address, city, state, postalcode, country, language}

Вложение всегда хорошо, но глубокое вложение на двух или трех уровнях может создать дополнительные проблемы при запросе / обновлении.

Надеюсь, мои предложения помогут вам сделать правильный выбор дизайна схемы.

6 голосов
/ 24 февраля 2011

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

Встраивание предпочтительнее, поскольку «данные размещаются на диске; клиент-серверные обращения к базе данных исключаются».Если родительский объект находится в ОЗУ, то доступ к вложенным объектам всегда будет быстрым.

5 голосов
/ 25 февраля 2011

По своему опыту, я никогда не находил "лучших практик" для того, как на самом деле выглядит запись MongoDB.Вопрос, на который нужно действительно ответить: «Позволяет ли мне эта схема MongoDB делать то, что мне нужно?»

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

Однако я бы сказал, что nix - клавиши basic и contact.Что они на самом деле дают вам?Если вы индексируете name, это будет basic.name, а не просто name.AFAIK, некоторые длинные и короткие имена клавиш влияют на производительность.

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

1 голос
/ 24 февраля 2011

Это приемлемая практика.Есть некоторые проблемы с вложением массива в массив.См. SERVER-831 для одного примера.Однако вы, похоже, вообще не используете массивы в своей коллекции.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...