Производительность схемы документа - PullRequest
0 голосов
/ 28 апреля 2019

Я пытаюсь определить лучшую схему документа для проекта для couchdb (2.3.1). Исследуя это, я нахожу некоторую противоречивую информацию и никаких соответствующих рекомендаций для последней версии couchdb и подобных сценариев. Если эти данные не подходят для couchdb или другого метода, отличного от того, что подробно описано ниже, я хотел бы лучше понять, почему.

Мой сценарий - отслеживать детали изготовления виджетов:

  1. 100 000-300 000 типов виджетов должны отслеживаться
  2. Каждый виджет изготавливается от 200 до 1800 раз в день
  3. Производство виджетов может вырасти до ~ 10000 в день
  4. Каждое создание виджета и связанные с ним детали должны быть записаны и обновлены
  5. Создание виджета сохраняется в течение 30 дней
  6. Запрос информации о виджете по типу виджета и creationStartTime / creationEndTime
  7. Меня не интересуют ревизии, я могу просто обновить и использовать тот же _rev, если это может повысить производительность

Метод 1:

{
    "_id": "*",
    "_rev": "*",
    "widgetTypeId": "1831",
    "creation": [{
        "creationId" "da17faef-3591-4579-b5f6-ff0a719a6da7",
        "creationStartTime": 1556471139,
        "creationEndTime": 1556471173,
        "color": "#ffffff",
        "styleId": "92811",
        "creatorId": "82812"
  },{
        "creationId" "893fede7-3874-44ed-b290-7001b4901bc9",
        "creationStartTime": 1556471481,
        "creationEndTime": 1556471497,
        "color": "#cccccc",
        "styleId": "75343",
        "creatorId": "3211"
  }]
}

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

Метод 2:

{
    "_id": "*",
    "_rev": "*",
    "widgetTypeId": "1831",
    "creationId" "da17faef-3591-4579-b5f6-ff0a719a6da7",
    "creationStartTime": 1556471139,
    "creationEndTime": 1556471173,
    "color": "#ffffff",
    "styleId": "92811",
    "creatorId": "82812"
},{
    "_id": "*",
    "_rev": "*",
    "widgetTypeId": "1831",
    "creationId" "893fede7-3874-44ed-b290-7001b4901bc9",
    "creationStartTime": 1556471481,
    "creationEndTime": 1556471497,
    "color": "#cccccc",
    "styleId": "75343",
    "creatorId": "3211"   
}

Метод 2 создает высокую базу данных

1 Ответ

1 голос
/ 30 апреля 2019

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

  1. В CouchDB нет поддержки частичных обновлений (патчей). Поэтому, если вам нужно вставить данные в массив в большом документе, вам нужно извлечь все данные, распаковать json, вставить данные, перепаковать json и отправить все это обратно в CouchDB по проводам.

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

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

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

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