Як слід зберігати часові ряди в mongodb


11

Мені потрібно створити базу даних часових рядів і виконати наступні завдання:

  • створити новий часовий ряд
  • оновити існуючий часовий ряд
  • запитувати одразу один або декілька часових рядів (наприклад, усі часові ряди на ту саму дату тощо).

Чи пристосований Монго до цього і якщо так, то як я повинен структурувати базу даних? (один час serie = один документ? Або один документ = один запис серії serie time, і всі ці документи утворюють колекцію, що становить весь часовий ряд?)

Я трохи загубився тут, і мені важко знайти будь-яку інформацію, оскільки Монго зазвичай представлений як дуже гнучка, тому користувач має вибір у інфраструктурі.

Будь-яке посилання на підручник, який конкретно пояснює, як керувати тимчасовими рядами в Монго, дуже вітається.

Дякую!


Прочитайте Дизайн схеми даних часових рядів у MongoDB сьогодні. Дуже добре пишу на цьому.
akauppi

Існує оновлений білий документ, який обговорює часові ряди в MongoDB. mongodb.com/collateral/time-series-best-practices
Роберт Уолтерс

Відповіді:


6

Я пропоную ввести один часовий ряд на документ. Існують деякі проблеми зі зберіганням кількох записів на документ:

  • один документ обмежений певним розміром (зараз 16 МБ); це обмежує кількість записів, які можуть зберігатися в одному документі
  • оскільки в документ додано більше записів, весь документ (і часовий ряд) буде непотрібно видаляти та перерозподіляти на більший фрагмент пам'яті
  • запити на піддокументи обмежені порівняно із запитами у звичайних документах
  • документи з дуже плоскими структурами (як один піддокумент на кожну секунду) не виконуються
  • вбудоване зменшення карт не працює також на піддокументах

Також зверніть увагу, що часова мітка вбудована до MongoDB ObjectId за замовчуванням . Ви можете використовувати це, якщо точність часового ряду менше однієї секунди.

Ось приклад документа BSON з бібліотеки реєстрації подій, яка використовує MongoDB :

Example format of generated bson document:
{
    'thread': -1216977216,
    'level': 'ERROR',
    'timestamp': Timestamp(1290895671, 63),
    'message': 'test message',
    'fileName': '/var/projects/python/log4mongo-python/tests/test_mongo_handler.py',
    'lineNumber': 38,
    'method': 'test_emit_exception',
    'loggerName':  'testLogger',
    'exception': {
        'stackTrace': 'Traceback (most recent call last):
                       File "/var/projects/python/log4mongo-python/tests/test_mongo_handler.py", line 36, in test_emit_exception
                       raise Exception(\'exc1\')
                       Exception: exc1',
        'message': 'exc1',
        'code': 0
    }
}

Оскільки журнал подій схожий на часовий ряд, можливо, варто вивчити решту коду . Існують версії на Java, C #, PHP та Python.

Ось ще один подібний проект з відкритим кодом: Зарков


[оновлення] У відповідь на коментар @ RockScience я додав ще кілька посилань:


це буде багато документів, якщо в моєму часовому ряду є дані про внутрішньоденні дані протягом декількох років !!! чи не проблема мати стільки документів? Виходячи з sql фону, я просто вважаю це не дуже ефективною пам'яттю. (Оскільки буде багато повторень для всіх точок даних одного часового ряду)
RockScience

@RockScience: MongoDB, як і багато інших баз даних NoSQL, відмовляється від нормалізації та ефективності пам'яті на користь інших речей, таких як гнучкість, швидкість та скорочення використання процесора. Якщо вам потрібна ефективність пам'яті, MongoDB може бути не правильним рішенням для вас. MongoDB копіює повне текстове ім'я кожного поля у кожен документ, щоб голосно плакати! У будь-якому разі я оновив свою відповідь ще кількома ресурсами, включаючи тематичне дослідження того, як MongoDB використовувався для зберігання дуже великого часового ряду.
Лефтій

2

Я знайшов це питання на SO ( /programming/4814167/storing-time-series-data-relational-or-non ), де ОП запитує, як зберігати часовий ряд. Хоча його питання більше базується на використанні бази даних NoSQL або RDBMS, і ви, здається, досить налаштовані на використання NoSQL db.

Також знайдена ця стаття про " Унікальні вимоги до бази даних даних часових рядів ", яка може бути корисною.

Сподіваюсь, це допомагає.


2

Так, безумовно, база даних NoSQL краще підходить для зберігання даних часових журналів, ніж традиційні RDBMS.

Так, MongoDB винятково адаптується до цього випадку використання.

-Як слід структурувати базу даних? Один документ = введення одного часового ряду VS кілька часових рядів.

Відповідь - зберігати в одному документі кілька часових журналів. Маючи менше документів, допоможе продуктивність із меншою кількістю читань. Один фокус - підготувати ваш документ із заздалегідь заданими значеннями. Це дозволить оптимізувати оновлення документа, уникаючи прокладки записів .

Ось приклад схеми про те, як оптимально зберігати часові години з хвилинним інтервалом:

{
  timestamp_hour: ISODate("2015-07-02T23:00:00.000Z"),
  type: memory_used”,
  values: {
    0: 999999,
    1: 1000000, 
    …,
    58: 0,
    59: 0
  }
}

Ви ініціюєте його з 0 значеннями, а потім оновлення будуть оптимізовані. Читання оптимізовано, оскільки один документ читається замість 60. Якщо вам потрібно зберігати дані, що варті дня, або місяць, який ви продовжуєте з тією ж методикою, ви отримуєте ідею.

Ось посилання на підручник, який конкретно пояснює, як керувати тимчасовими рядами в MongoDb з офіційного блогу MongoDb: http://blog.mongodb.org/post/65517193370/schema-design-for-time-series-data-in- mongodb


1
Купівля даних у документі буде кращою від продуктивності та використання ресурсів. Існує три сценарії схеми, обговорені в оновленому часовому ряду для найкращих практик MongoDB. mongodb.com/collateral/time-series-best-practices
Роберт Уолтерс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.