Quel est le plus rapide: PostgreSQL vs MongoDB sur de grands ensembles de données JSON?

10

J'ai un grand ensemble de données avec des objets JSON de 9 m à environ 300 octets chacun. Ce sont des publications d'un agrégateur de liens: essentiellement des liens (une URL, un titre et un identifiant d'auteur) et des commentaires (texte et identifiant d'auteur) + des métadonnées.

Ils peuvent très bien être des enregistrements relationnels dans une table, à l'exception du fait qu'ils ont un champ de tableau avec des ID pointant vers des enregistrements enfants.

Quelle implémentation semble plus solide?

  1. Objets JSON sur une base de données PostgreSQL (juste une grande table avec une colonne, à savoir l'objet JSON)
  2. Objets JSON sur un MongoDB
  3. Décomposer les objets JSON en colonnes et utiliser des tableaux sur PostgreSQL

Je veux maximiser les performances dans les jointures, donc je peux masser les données et les explorer jusqu'à ce que je trouve des analyses intéressantes, à quel point je pense qu'il sera préférable de transformer les données sous une forme spécifique à chaque analyse.

bleu-dino
la source
pourrait vouloir vérifier flocon de neige. Il peut gérer à la fois des données structurées et semi-structurées. www.snowflake.net
Je pense que vous devez développer ce que signifie "maximiser les performances dans les jointures" pour vous. Rejoindre quoi?
Spacedman

Réponses:

10

Pour le chargement des données, Postgre surpasse MongoDB. MongoDB est presque toujours plus rapide lors du renvoi du nombre de requêtes. PostgreSQL est presque toujours plus rapide pour les requêtes utilisant des index.

Consultez ce site Web et celui- ci aussi pour plus d'informations. Ils ont des explications très détaillées.

programmeur sans titre
la source
Très bons liens, spécialement le premier qui semble plus détaillé et approfondi. Lors de la recherche de l'année (une chaîne) et du retour de l'ID d'enregistrement (un int), potgresql est environ 4 fois plus rapide, mais lors du retour de l'auteur, l'ordre de grandeur est le même. MongoDB est seulement environ 20% plus lent lors du retour de l'auteur. Y a-t-il une différence fondamentale entre retourner un int et retourner une chaîne qui pourrait expliquer cela? Autrement dit, si recid était une chaîne, l'avantage de postgresql disparaîtrait-il et les deux seraient-ils à peu près les mêmes que dans le cas de l'auteur?
MASL
1

Vous pouvez bénéficier davantage de la conception sans schéma de Mongodb. Cela signifie qu'il est très facile de modifier les structures de données à la volée.

Il n'y a pas de jointure dans Mongodb. Donc, comment on pense aux données et comment les utiliser doit être modifié pour tenir compte des environnements db basés sur des documents et sans schéma.

Peut-être que la vitesse devient moins importante à mesure que la perspective et les priorités changent.

J'espère que ça aide.

-Todd

Todd Canedy
la source
Dans les benchmarks les plus récents, PostgreSQL possédait totalement MongoDB ...
A QUIT - Anony-Mousse
@ Anony-Mousse: Intéressant. Connaissez-vous des sources?
Isaac
par exemple tiborsimko.org/postgresql-mongodb-json-select-speed.html et enterprisedb.com/postgres-plus-edb-blog/marc-linster/… de l'autre réponse. Une des principales raisons est que Postgres a de bons index, alors que les index dans MongoDB n'en valent pas la peine. De plus, Postgres a obtenu le support BSON et d'autres ajouts pour gérer JSON, ce qui a considérablement amélioré les performances. C'est pourquoi il est devenu beaucoup plus rapide que dans les premières versions.
A QUIT - Anony-Mousse
0

Pour les chiffres que vous mentionnez, je pense que toutes les alternatives devraient fonctionner (lire: vous serez en mesure de terminer votre analyse dans un délai raisonnable). Je recommande une conception qui peut conduire à des résultats beaucoup plus rapides.

Comme indiqué précédemment, en général, postgresql est plus rapide que mongo, parfois plus de 4 fois plus rapide. Voir par exemple: http://www.enterprisedb.com/postgres-plus-edb-blog/marc-linster/postgres-outperforms-mongodb-and-ushers-new-developer-reality

Vous avez dit que vous souhaitiez améliorer les performances des jointures. Je suppose que vous êtes intéressé par le calcul des similitudes entre les entités (par exemple, publication, auteur), vous allez donc principalement rejoindre la table avec elle-même (par exemple, par publication ou auteur) et agréger.

Ajoutez à cela le fait qu'après le chargement initial, votre base de données sera en lecture seule, ce qui rend le problème très approprié pour indexer l'utilisation. Vous ne paierez pas pour la mise à jour de l'index car vous n'en aurez pas et je suppose que vous avez le stockage supplémentaire pour l'index.

J'aurais utilisé postgres et stocké les données dans deux tableaux:

créer des publications de table (entier post_id, url varchar (255), author_id entier);

- Charger des données puis créer les indices. - Cela conduira à une charge plus rapide et à de meilleurs indices. Modifier les messages de la table ajouter une contrainte à la clé primaire posts_pk (post_id); créer un index post_author sur les articles (author_id);

créer des commentaires de table (entier commentaire_id, entier post_id, entier author_id, commentaire varchar (255)); modifier les commentaires de table ajouter une contrainte commentaires_pk clé primaire (comment_id); créer un index comment_author sur les commentaires (author_id); créer un index comment_post sur les commentaires (post_id);

Ensuite, vous pouvez calculer la similitude des auteurs sur la base des commentaires dans les requêtes comme select m. author_id comme m_author_id, a. author_id en tant que a_author_id, count (distinct m.post_id) en tant que publications à partir de commentaires lorsque m joint les commentaires en tant que groupe utilisant (post_id) par m.author_id, a. author_id

Dans le cas où vous souhaiteriez taper les mots dans le commentaire pour nlp, ajoutez un autre tableau pour cela, mais n'oubliez pas que cela augmentera considérablement le volume de vos données.Il est généralement préférable de ne pas représenter la tokenisation entière dans la base de données.

DaL
la source