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

MongoDB — это база данных документов на основе гибкой схемы. Гибкость была тем, чего мы жаждали после многих лет работы с SQL. Гибкость — это так весело кодировать и наслаждаться, пока код вашего приложения не начнет страдать от вопроса «Что это была за схема?» проблема. MongoDB следует принципу проектирования на основе документов для моделирования вещей. Вы можете вставить столько объектов/массивов в MongoDB, если не превысите лимит в 16 МБ.
Таким образом, вероятность того, что вы никогда не обнаружите проблему, пока она не станет слишком поздно, высока.

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

  1. Шаблон управления версиями схемы:

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

Версия схемы имеет свои плюсы и минусы.

Плюсы:

  • Легче обрабатывать изменения
  • Гибкость вашего приложения растет.
  • Легче отлаживать и отслеживать

Минусы:

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

2. Расчетный шаблон:

Вы когда-нибудь задумывались, как YouTube может получить общее количество просмотров видео в реальном времени?

Видео выше имеет 1,3 миллиарда просмотров, но если вы подсчитаете это в любой БД, используя

db.getCollection("video-views").find({]).count();

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

Новые документы будут примерно такими, и ваша служба приложений должна увеличивать значение просмотров каждый раз, когда кто-то просматривает видео.

{
  "title": "Rick Astley - Never Gonna Give You Up (Official Music Video)",
  "description": "1987 pop hit, famously used in internet 'Rickrolling' meme",
  "videoId": "dQw4w9WgXcQ",
  "views": 217383786
}

Плюсы:

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

Минусы:

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

3. Шаблон подмножества:

Шаблон подмножества в MongoDB — это шаблон, в котором мы храним подмножество полей документа в чужой коллекции. Его можно рассматривать как материализованное представление для MongoDB. Для большого документа назовите пользователя как

{
  "_id": ObjectId("6155e5b5c3e30c0410c07e84"),
  "username": "johndoe",
  "email": "[email protected]",
  "password": "$2a$12$R1..K94OiVJ.gNwINZfNkuNpJcoCJErjy.NxJmp/9cGJbEjK2rJ4S",
  "profile": {
    "firstName": "John",
    "lastName": "Doe",
    "birthdate": ISODate("1980-01-01T00:00:00Z"),
    "gender": "male",
    "address": {
      "street": "123 Main St",
      "city": "Anytown",
      "state": "CA",
      "zip": "12345"
    },
    "phoneNumbers": {
      "home": "555-1234",
      "work": "555-5678",
      "mobile": "555-9012"
    },
    "education": [
      {
        "degree": "Bachelor of Science",
        "major": "Computer Science",
        "university": "University of California, Los Angeles",
        "graduationYear": 2002
      },
      {
        "degree": "Master of Business Administration",
        "major": "Finance",
        "university": "Stanford University",
        "graduationYear": 2006
      }
    ],
    "workHistory": [
      {
        "company": "Acme Corporation",
        "position": "Software Engineer",
        "startDate": ISODate("2002-01-01T00:00:00Z"),
        "endDate": ISODate("2005-12-31T00:00:00Z")
      },
      {
        "company": "Widgets, Inc.",
        "position": "Product Manager",
        "startDate": ISODate("2006-01-01T00:00:00Z"),
        "endDate": ISODate("2010-12-31T00:00:00Z")
      },
      {
        "company": "XYZ Corp.",
        "position": "Director of Marketing",
        "startDate": ISODate("2011-01-01T00:00:00Z"),
        "endDate": null
      }
    ],
    "interests": [
      "hiking",
      "reading",
      "traveling",
      "playing guitar"
    ]
  },
  "preferences": {
    "language": "en",
    "theme": "light",
    "timezone": "America/Los_Angeles"
  },
  "notifications": [
    {
      "type": "email",
      "frequency": "daily"
    },
    {
      "type": "sms",
      "frequency": "weekly"
    }
  ],
  "createdAt": ISODate("2021-09-30T10:15:01Z"),
  "updatedAt": ISODate("2022-10-01T14:30:05Z")
}

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

{
  "_id": ObjectId("605edb98fbf3d639d3cf6c8f"),
  "name": "Jane Doe",
  "email": "[email protected]"
}

Примечание. Мы можем добиться того же результата, используя операцию проецирования в MongoDB или конвейер $project в агрегации MongoDB. Теперь вместо использования коллекции пользователей для чтения значения мы можем использовать коллекцию имен пользователей.

Плюсы:

  • Эффективное управление памятью
  • Более короткое время доступа к диску

Минусы:

  • Если транзакция не используется, коллекции могут стать несогласованными.
  • Дополнительные обращения к БД при создании, обновлении или удалении операций

4. Выкройка ковша:

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

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

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

Мы можем запускать аналитику на основе данных корзины, мы также можем добавить шаблон корзины с шаблоном вычисляемых данных, чтобы разместить статистические данные для нашей простоты, более новая версия документов будет выглядеть так:

{
  device_id: "device1",
  type: "2A",
  date: ISODate("2022-04-01T00:00:00Z"),
  temp: [20.5, 21.3, 22.1, 20.8, 21.7],
  mean_temperature: 21.28,
  std_temperature: 0.72
},
{
  device_id: "device1",
  type: "2A",
  date: ISODate("2022-04-01T01:00:00Z"),
  temp: [21.1, 20.9, 21.5, 22.3, 20.4],
  mean_temperature: 21.24,
  std_temperature: 0.69
}

Плюсы:

  1. Подходит для реализации IOT
  2. Улучшает скорость запросов с помощью индексов
  3. Отлично подходит для данных временных рядов

Минусы:

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

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

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

https://www.linkedin.com/in/nirjalpaudel/

У шаблона MongoDB есть свои плюсы и минусы, и, в конце концов, правильное использование шаблонов не позволяет вам позвонить в 2 часа ночи и сказать, что БД не работает, но, с другой стороны, вы пропустите сверхурочную оплату от вашей компании, так что выбирайте с умом дополнительные 💰 или 🛌.