Comment dois-je stocker des séries chronologiques dans mongodb

11

Je dois créer une base de données de séries chronologiques et effectuer les tâches suivantes:

  • créer de nouvelles séries chronologiques
  • mettre à jour les séries chronologiques existantes
  • interroger une ou plusieurs séries temporelles à la fois (par exemple toutes les séries temporelles pour la même date etc ...)

Mongo est-il adapté à cela et si oui, comment dois-je structurer la base de données? (une série temporelle = un document? Ou un document = une entrée de la série temporelle, et tous ces documents forment la collection qui est la série chronologique entière?)

Je suis un peu perdu ici et j'ai du mal à trouver des informations car généralement Mongo est présenté comme très flexible donc l'utilisateur a le choix dans l'infrastructure.

Tout lien vers un didacticiel expliquant spécifiquement comment gérer les séries temporelles dans Mongo est le bienvenu.

Je vous remercie!

RockScience
la source
Lisez aujourd'hui la conception de schéma pour les données de séries temporelles dans MongoDB . Très bonne écriture à ce sujet.
akauppi du
Il existe un livre blanc mis à jour qui traite des séries chronologiques dans MongoDB. mongodb.com/collateral/time-series-best-practices
Robert Walters

Réponses:

6

Je suggère une seule entrée de série chronologique par document. Il y a quelques problèmes avec le stockage de plusieurs entrées par document:

  • un seul document est limité à une certaine taille (actuellement 16 Mo); cela limite le nombre d'entrées pouvant être stockées dans un seul document
  • à mesure que plus d'entrées sont ajoutées à un document, le document entier (et les séries chronologiques) seront inutilement supprimés et réaffectés à une plus grande mémoire
  • les requêtes sur les sous-documents sont limitées par rapport aux requêtes sur les documents standard
  • les documents avec des structures très plates (comme un sous-document pour chaque seconde) ne sont pas performants
  • la carte-réduction intégrée ne fonctionne pas aussi bien sur les sous-documents

Notez également qu'un horodatage est intégré à l'ID d'objet MongoDB par défaut . Vous pouvez l' utiliser si la précision de la série chronologique est inférieure à une seconde.

Voici un exemple de document BSON d'une bibliothèque de journalisation des événements qui utilise 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
    }
}

Puisqu'un journal d'événements est similaire à une série chronologique, il peut être utile d'étudier le reste du code . Il existe des versions en Java, C #, PHP et Python.

Voici un autre projet open source similaire: Zarkov


[mise à jour] En réponse au commentaire de @ RockScience, j'ai ajouté quelques références supplémentaires:

Leftium
la source
ça va être BEAUCOUP de documents si ma série chronologique contient des données intrajournalières sur plusieurs années !!! n'est-ce pas un problème d'avoir autant de documents? Venant d'un fond sql, je trouve juste que la mémoire n'est pas très efficace. (Comme il y aura beaucoup de répétitions pour tous les points de données de la même série temporelle)
RockScience
@RockScience: MongoDB, comme beaucoup d'autres bases de données NoSQL, évite la normalisation et l'efficacité de la mémoire au profit d'autres choses comme la flexibilité, la vitesse et l'utilisation réduite du processeur. Si vous avez besoin d'une efficacité mémoire, MongoDB n'est peut-être pas la bonne solution pour vous. MongoDB copie le nom de texte intégral de chaque champ dans chaque document, pour crier à haute voix! Quoi qu'il en soit, j'ai mis à jour ma réponse avec quelques ressources supplémentaires, y compris une étude de cas sur la façon dont MongoDB a été utilisé pour stocker une très grande série chronologique.
Leftium
2

J'ai trouvé cette question sur SO ( /programming/4814167/storing-time-series-data-relational-or-non ) où l'OP demande comment stocker une série chronologique. Bien que sa question soit davantage basée sur l'utilisation d'une base de données NoSQL ou d'un SGBDR, et vous semblez plutôt déterminé à utiliser une base de données NoSQL.

Vous trouverez également cet article sur " Les exigences de base de données uniques des données de séries chronologiques " qui pourraient être utiles.

J'espère que cela t'aides.

Aaron
la source
2

Oui, la base de données NoSQL convient mieux au stockage des données de série temporelle que le SGBDR traditionnel.

Oui, MongoDB est exceptionnellement adapté à ce cas d'utilisation.

-Comment structurer la base de données? Un document = une entrée de série chronologique VS plusieurs séries chronologiques.

La réponse est de stocker dans un même document plusieurs séries temporelles. Avoir moins de documents améliorera les performances avec moins de lectures. Une astuce consiste à préparer votre document avec les valeurs prédéfinies. Cela optimisera la mise à jour du document en évitant le remplissage d'enregistrement .

Voici un exemple de schéma sur la façon de stocker de manière optimale une heure de séries temporelles avec un intervalle d'une minute:

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

Vous l'initiez avec 0 valeurs, puis les mises à jour seront optimisées. Les lectures sont optimisées car un document est lu au lieu de 60. Si vous avez besoin de stocker une journée de données, ou un mois vous procédez avec la même technique, vous avez l'idée.

Voici le lien vers un tutoriel qui explique spécifiquement comment gérer les séries chronologiques dans MongoDb à partir du blog officiel de MongoDb: http://blog.mongodb.org/post/65517193370/schema-design-for-time-series-data-in- mongodb

Naim Zard
la source
1
Les données de regroupement dans un document seront meilleures grâce aux performances et à l'utilisation des ressources. Trois scénarios de schéma sont discutés dans la série chronologique mise à jour pour le livre blanc sur les meilleures pratiques de MongoDB. mongodb.com/collateral/time-series-best-practices
Robert Walters