Лучшая модель данных mongodb для вложенной информации - PullRequest
1 голос
/ 18 марта 2019

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

Single_Collection.

{

"collegeid": 1234,
"Name": "aaaa",
 "otherinfo": 1,

"studnet":[
    {
        "stdid": 1,
        "name": "n1"
    },
    {
        "stdid": 2,
        "name": "n2"
    }
]
}

Две коллекции.

  1. Информация о колледже

    {
    "collegeid": 1234,
    "Name": "aaaa",
     "otherinfo": 1
    }
    

Информация о студентах

    {
    "collegeid": 1234,
    "stdid": 1,
    "name": "n1"
    }

    {
    "collegeid": 1234,
    "stdid": 2,
    "name": "n2"
    }

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

Также я выполняю больше операций по вставке учеников

1 Ответ

1 голос
/ 19 марта 2019

IMO , каждый дизайн модели имеет свои плюсы и минусы. То, что мы говорим «лучший способ», зависит от ваших вариантов использования (Как вы запрашиваете данные? Вам нужны все данные в начале? Вам нужно пейджинг? И т. Д. ...)

Давайте начнем с ваших требований.

Ваши требования

  1. По номеру колледжа узнайте студентов вэтот колледж.
  2. Учитывая идентификатор студента, узнайте его идентификатор колледжа.

Отношения между предметами

Очевидно, колледж и студент 1: m картографирование, потому что много студентов в одном колледже, но каждый студент может остаться только в одном колледже.

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

Подход 1 - Включение студентов в колледж

Этот дизайн вы упомянули как одну коллекцию.

{
   "collegeid":1234,
   "Name":"aaaa",
   "otherinfo":1,
   "studnet":[
      {
         "stdid":1,
         "name":"n1"
      },
      {
         "stdid":2,
         "name":"n2"
      }
   ]
}

Плюсы:

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

Минусы:

  1. Если у вас в колледже огромное количество студентов, размердокумента будет очень большой.Это будет неэффективно, если вы будете часто добавлять / удалять / обновлять учащегося.
  2. Нет быстрого способа выполнить требование (2).Поскольку мы ведем сопоставление только от студентов колледжа -> студентов, вам необходимо просмотреть все документы, чтобы выяснить, в каком колледже указан указанный идентификатор студента.

Подход 2. У студента есть ссылка на колледж

Это дизайн, который вы упомянули как две коллекции.Он похож на таблицы СУБД, студент модель имеет ссылочный ключевой момент в его колледже

  1. коллекция колледжа:.
  2. Студенческая коллекция:
{
   "collegeid":1234,
   "stdid":1,
   "name":"n1"
}
{
   "collegeid":1234,
   "stdid":2,
   "name":"n2"
}

Плюсы:

  1. Можно выполнить требования (1) и (2).Не забудьте добавить индекс в поле "collegeid" и "stdid".
  2. Каждый документ можно хранить в небольшом размере, движок легко сохраняет данные.

Минусы:

  1. Колледж и студенты разделены.Это будет медленнее, чем в подходе 1, если загружается колледж и все его студенты (нужно два запроса).
  2. Вам необходимо объединить колледж и студентов самостоятельно, прежде чем отобразить в пользовательском интерфейсе.

Подход 3 - Дублированные данные в колледже и студентах

Этот подход выглядит так, как будто мы смешиваем подход 1 и подход 2. У нас есть две коллекции : в колледже будут встроены его студенты, а также отдельная коллекция студентов.Итак, данные об учениках дублируются в обеих коллекциях.

  1. Коллекция колледжа:
{
   "collegeid":1234,
   "Name":"aaaa",
   "otherinfo":1,
   "studnet":[         // duplicated here!
      {
         "stdid":1,
         "name":"n1"
      },
      {
         "stdid":2,
         "name":"n2"
      }
   ]
}
Студенческая коллекция:
{
   "collegeid":1234,
   "stdid":1,
   "name":"n1"
}
{
   "collegeid":1234,
   "stdid":2,
   "name":"n2"
}

Плюсы:

  1. У вас есть все плюсы с подхода 1 и подхода 2.

Минусы:

  1. Документ в коллекции колледжа станет очень большим.
  2. Вы должны хранить данные из коллекции колледжа и студентасбор Синхронный самостоятельно.

Подход 4 - Дублированные данные в колледже (только studentID) и студентах

Это вариант из Подхода 3. Мы предполагаем, чтоВаш вариант использования:

  1. Пользователь может искать колледж.
  2. Пользователь выбирает один колледж в результатах поиска.
  3. Новый пользовательский интерфейс отображает все идентификаторы студентов для пользователя(возможно, в виде таблицы или списка).
  4. Пользователь щелкает один идентификатор учащегося.
  5. Система загружает полные данные указанного учащегося и показывает его пользователю в другом пользовательском интерфейсе.

Одним словом, пользователю не нужны полные данные всех учеников в начале, ему просто нужна базовая информация учеников (например, студенческий билет) .Если пользователь принимает такой сценарий, вы можете иметь модель ниже:

  1. CollКоллекция ege:
{
   "collegeid":1234,
   "Name":"aaaa",
   "otherinfo":1,
   "studnetIds":[1, 2]  // only student IDs are duplicated
}
Студенческая коллекция:
{
   "collegeid":1234,
   "stdid":1,
   "name":"n1"
}
{
   "collegeid":1234,
   "stdid":2,
   "name":"n2"
}

В колледже есть только идентификаторы студенческих сетей.Это разница по сравнению с подходом 3.

Плюсы:

  1. Можно выполнить требования (1) и (2).
  2. Выне нужно беспокоиться о том, что документы колледжа вырастают до огромных размеров.Так как ему принадлежат только студенческие идентификаторы.
  3. Если пользователь примет вышеприведенный сценарий, это будет лучше для баланса производительности / комплекса / размера данных.

Минусы:

  1. Подходит для указанного варианта использования, если требование будет изменено в будущем, нарушит сценарий, и эта модель будет не годной.

Резюме

  1. Вы должны быть очень понятны с вашими вариантами использования.
  2. На основе вариантов использования сравните подходы, чтобы увидеть, можете ли вы принимать за и против.
  3. Нагрузочное тестирование важно!
...