Концепция схемы MongoDB - PullRequest
0 голосов
/ 10 мая 2019

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

Контекст: товар имеет запас в магазине, запас определяется несколькими счетчиками: физические (простые: например, запас в магазине) и виртуальные (которые являются результатом расчета, например, запас, доступный для продажа)

API должен возвращать значение каждого счетчика для продукта:

{
  "product_code": "123456",
  "counters": [
    {
      "code": "1",
      "label": "Stock 1",
      "value": 42
    },
    {
      "code": "2",
      "label": "Stock 2",
      "value": 1337
    },
    {
      "code": "50",
      "label": "Available for sale",
      "value": 1295 // <= result of $2 - $1
    }
  ]
}

Итак, я сделал 3 схемы (не окончательные):

склад:

{
  "product": "123456",
  "1": 42,
  "2": 1337
}

физический счетчик:

{
  "code": "1",
  "label": "Stock 1"
}

виртуальный счетчик:

{
  "code": "50",
  "label": "Available for sale",
  "calculation": [
     {
       "counter": "1",
       "operation": "-"
     },
     {
       "counter": "2",
       "operation": "+"
     }
}

Проблема: я беспокоюсь о виртуальных счетчиках, у которых есть вычисление, которое может изменить , поэтому либо:

  • Я храню их в другой коллекции (как есть) и рассчитываю в своем API на каждый вызов (проблема производительности)

  • Я сохраняю их в другой коллекции и вычисляю в виде (возможно, лучшую производительность с кэш-памятью Монго, но все равно рассчитываю при каждом вызове)

  • Я предварительно вычисляю значение и сохраняю только одну коллекцию, но что, если расчет изменится? Мне нужно массово обновить все документы (что может привести к несогласованности при наличии двух одновременных обновлений)

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

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

Какой была бы ваша рекомендация?

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