2012-05-08 8 views
8

Je suis habitué à travailler avec mysql mais pour ma prochaine série de projets, CouchDB (NoSQL) semble être le chemin à suivre, essentiellement pour éviter EAV dans mysql et pour adopter toutes les fonctionnalités intéressantes qu'il a à offrir . Après beaucoup de recherches et de documentation, etc., il y a une chose que je ne comprends pas très bien.couchdb bases de données multiples

Supposons que j'héberge trois applications Web sur mon serveur et que j'ai besoin de trois bases de données en conséquence. Par exemple, il y a une boutique en ligne avec des tableaux de produits et de factures, un weblog avec des tables d'articles et de commentaires et un autre est un jeu basé sur le Web avec des tables de statistiques de jeu (simplification évidemment). Donc, j'héberge plusieurs sites sur une installation de mysql, et chaque application que j'exécute sur mon serveur obtient sa propre base de données avec des tables, des champs et du contenu. Maintenant, avec CouchDb, je veux faire exactement la même chose. Le problème semble être que la création d'une base de données dans CouchDb, est plus similaire à la création d'une table dans mysql. C'est à dire. Je crée des bases de données appelées 'commentaires', 'articles' etc. pour mon blog et à l'intérieur je crée un document par article ou un document par commentaire. Donc, ma question est la suivante: comment puis-je séparer mes données de plusieurs applications Web sur une installation CouchDB?

Je pense que je fais quelque chose de fondamentalement faux ici mais j'espère que l'un d'entre vous pourra m'aider à me mettre sur la bonne voie.

Répondre

6

Dans CouchDB, il n'y a pas de besoin explicite de séparer des données non liées dans plusieurs bases de données. Si vous avez correctement construit vos documents et vos vues, seules les données pertinentes apparaîtront dans vos requêtes.

Si vous décidez de séparer vos données dans des bases de données distinctes, créez simplement une nouvelle base de données.

$ curl -X PUT http://localhost:5984/somedb 
{"ok":true} 
+0

donc si j'ai deux applications sans relation de données sage à l'autre, je finirais avec deux bases de données distinctes droit? par exemple http: // localhost: 5984/webshop_for_client et http: // localhost: 5984/personal_blog –

+0

Correct. Ce sont deux bases de données distinctes. – Chris

4

De mon expérience avec CouchDB, séparer les données non liées dans différentes bases de données est très important pour la performance et aussi une évidence. La génération de vue est une partie douloureuse de couchdb. Chaque fois que la base de données est mise à jour, les vues (pensez-y comme des index dans une base de données SQL relationnelle traditionnelle) doivent être régénérées. Cela implique l'itération chaque document dans la base de données . Donc si vous avez 2 millions de documents de type A, et que vous avez 300 documents de type, B. Et vous devez régénérer une vue les requêtes de type B, alors toutes les 2 millions et 300 cents énumérations seront effectuées lors de la génération de vues. prendra beaucoup de temps (il pourrait même faire un timeout de lecture). Par conséquent, avoir plusieurs bases de données est une évidence quand il s'agit de garder des vues (comment vous interrogez dans couchdb, une fonctionnalité évidemment importante et incontournable) mis à jour.

+1

"Chaque fois que la base de données est mise à jour" est un peu trompeur. Les vues ne sont pas régénérées lorsque des documents sont ajoutés/mis à jour/supprimés - uniquement lorsque la définition des vues change, ce qui devrait être rare. Les opérations CRUD régulières mettent à jour les vues de manière incrémentielle. –

2

@Zombies est extrêmement juste au sujet de la performance. CouchDB n'est pas adapté pour effectuer de nombreux documents dans une base de données unique. Si vous devez effectuer, disons, plus de 5000 documents, MongoDB dépassera CouchDB.

Les vues dans CouchDB sont essentielles, mais douloureuses, avec des options JavaScript limitées pour créer vos requêtes (ne pensez même pas aux références de documents ou aux objets imbriqués). Considérant avoir plusieurs bases de données pour différents documents est tout à fait la solution.Certaines personnes diront quelque chose comme:

CouchDB est une base de données NoSQL, et en tant que tel, vous ne devriez pas avoir besoin de commander vos documents ni de les filtrer en utilisant autre chose que des vues. fonction de base de base de données NoSQL est la capacité de stocker des documents régime-less [...]

Et je trouve cela très ennuyeux quand vous besoin de trouver une solution à la performance et interrogation. Vous ne devriez pas craindre de créer quelques bases de données pour séparer vos données si cela vous permet de diviser vos données, ce sera toujours sur une 'seule installation CouchDB'. Ne pas oublier que CouchDB est adapté pour petites bases de données. Plus la base de données sera petite, plus votre requête sera rapide, meilleure sera la performance.

(je ne sais pas s'il y a des erreurs anglaises, excusez-moi si oui)


EDIT Certaines entreprises comme ArangoDB ont fait une comparaison entre eux, MongoDB et CouchDB, et il confirme mon dicton sur le nombre de documents. Ceci est le résultat:

Graphical comparison

Il y a beaucoup d'autres ressources sur leur site web. D'autre part, cette déclaration était une expérience personnelle, et de les comparer à mon stage, avec un logiciel de benchmarking .PHP que j'ai trouvé sur Internet. Les résultats sont présentés ci-dessous:

enter image description here

+0

"Si vous devez effectuer, disons, plus de 5000 documents, MongoDB dépassera CouchDB." -> Ceci est pur, conneries uncut –

+1

-> https://www.arangodb.com/wp-content/uploads /2014/12/chart-overall-2.png Nous l'avons également comparé, même s'il n'est pas disponible sur Internet (c'était pour un stage). S'il vous plaît prouver votre point, peut-être que nous serons en mesure d'en discuter, au lieu d'être agressif pour à peu près rien. Malheureusement, il n'y a pas beaucoup de comparaisons graphiques entre Mongo et CouchDB, ce qui me dérange. –

Questions connexes