Avantages et inconvénients des bases de données documentaires par rapport aux bases de données relationnelles
J'ai essayé de voir si je peux accomplir certaines exigences avec une base de données basée sur des documents, dans ce cas CouchDB. Deux Exigences génériques:
- CRUD d'entités avec certains champs qui ont un index unique sur elle
- ecommerce web app comme eBay ( meilleure description ici ).
et je commence à penser qu'une base de données basée sur des documents n'est pas le meilleur choix pour répondre à ces exigences. En outre, Je ne peux pas imaginer une utilisation pour une base de données basée sur des documents (peut-être que mon imagination est trop limitée).
pouvez-vous m'expliquer si je demande des poires à un orme quand j'essaie d'utiliser une base de données orientée documents pour ces exigences?
6 réponses
vous devez penser à la façon dont vous abordez l'application d'une manière axée sur les documents. Si vous essayez simplement de répliquer comment vous modéliseriez le problème dans un RDBMS alors vous échouerez. Il y a aussi différents arbitrages que vous pourriez faire. ([ed: Je ne sais pas comment cela se rattache à l'argument mais:] rappelez-vous que la conception de CouchDB suppose que vous aurez un cluster actif de nombreux noeuds qui pourraient échouer à tout moment. Comment votre application va gérer la disparition d'un des noeuds de la base de données sous elle?)
une façon d'y penser est d'imaginer que vous n'aviez pas d'ordinateur, juste des documents papier. Comment créeriez-vous un processus d'affaires efficace en utilisant des bouts de papier qui circulent? Comment pouvez-vous éviter les goulots d'étranglement? Que faire si quelque chose va mal?
un autre angle auquel vous devriez penser est la cohérence éventuelle, où vous finirez par entrer dans un état cohérent, mais vous pourriez être incohérent pendant un certain temps. C'est anathème dans la terre RDBMS, mais extrêmement commun dans le monde réel. L'canonique transaction exemple est de transférer de l'argent à partir de comptes bancaires. Comment cela se passe - t-il réellement dans le monde réel-par le biais d'une seule transaction atomique ou par le biais de différentes banques émettant des avis de crédit et de débit l'un à l'autre? Ce qui se passe quand vous écrivez un chèque?
voyons donc vos exemples:
- il.
si je comprends bien cela en termes CouchDB, vous voulez avoir une collection de documents où une certaine valeur nommée est garantie d'être unique à travers tous ces documents? Ce cas n'est généralement pas supportable parce que les documents peuvent être créés sur des répliques différentes.
nous devons donc examiner le problème du monde réel et voir si nous pouvons modéliser cela. Vous avez vraiment besoin qu'ils soient uniques? Votre application peut gérer plusieurs documents avec la même valeur? Devez-vous attribuer un identificateur unique? Pouvez-vous le faire de façon déterministe? Un scénario courant où cela est nécessaire est celui où vous avez besoin d'un identifiant séquentiel unique. C'est difficile à résoudre dans un environnement répliqué. En fait, si l'id unique doit être strictement séquentielle par rapport au temps créé, il est impossible si vous avez besoin de l'id immédiatement. Vous devez détendre au moins une de ces contraintes.
- ecommerce web app like ebay
Je ne sais pas quoi ajouter ici car le dernier commentaire que vous avez fait sur ce post était de dire" très utile! grâce." Y avait-il quelque chose qui manquait à l'approche décrite là-bas et qui vous Cause toujours un problème? Je pensais que la réponse de MrKurt était assez complète et j'ai ajouté une petite amélioration qui réduirait la controverse.
Est-il nécessaire de normaliser les données?
- Oui: utiliser relationnel.
- Non: utiliser le document.
je suis dans le même bateau, j'adore couchdb en ce moment, et je pense que tout le style fonctionnel est génial. Mais quand exactement commencerons-nous à les utiliser dans ernest pour des applications. Je veux dire, Oui, nous pouvons tous commencer à développer des applications extrêmement rapidement, sans se froisser avec tous ces vilains problèmes de forme normale qui sont laissés de côté et n'utilisent pas de schémas. Mais, pour reprendre l'expression consacrée "nous sommes debout sur les épaules de géants". Il y a une bonne raison d'utiliser les RDBM et de normaliser et d'utiliser des schémas. Ma vieille tête d'oracle chancelle en pensant à des données sans forme.
mon principal facteur wow sur couchdb est la réplication et le système de versioning fonctionnant en tandem.
j'ai creusé mon cerveau pendant le dernier mois en essayant de grok les mécanismes de stockage de couchdb, apparemment il utilise des arbres B mais ne stocke pas de données basées sur la forme normale. Est-ce à dire qu'il est vraiment très intelligent et se rend compte que les bits de données sont répliqué donc laisse juste faire un pointeur à cette entrée d'arbre B?
jusqu'à présent, je pense aux documents xml, aux fichiers de configuration, aux fichiers de ressources transmis en Strings base64.
mais est-ce que j'utiliserais couchdb pour les données structurelles. Je ne sais pas, toute aide grandement appréciée.
peut être utile pour stocker des données RDF ou même du texte libre.
une possibilité est d'avoir une base de données relationnelle principale qui stocke les définitions des éléments qui peuvent être récupérés par leur IDs, et une base de données de document pour les descriptions et/ou les spécifications de ces éléments. Par exemple, vous pourriez avoir une base de données relationnelle avec une table de produits avec les champs suivants:
- ProductID
- Description
- prix unitaire
- LotSize
- Spécifications
et que le champ "Spécifications" contiendrait en fait une référence à un document contenant les spécifications techniques du produit. De cette façon, vous avez le meilleur des deux mondes.
DBS basé sur des documents conviennent le mieux pour stocker, Eh bien, des documents. Lotus Notes est une implémentation courante et Notes email en est un exemple. Pour ce que vous décrivez, eCommerce, CRUD, etc., realtional DBs sont mieux conçus pour le stockage et la récupération de données d'objets/éléments qui sont indexés (par opposition aux documents).
Re CRUD: tout le RESTE paradigme des cartes directement sur CRUD (ou vice versa). Donc, si vous savez que vous pouvez modéliser vos besoins avec des ressources (identifiables via URIs) et un ensemble d'opérations de base (à savoir CRUD), vous pouvez être très proche d'un système basé sur le repos, que plusieurs systèmes orientés documents fournissent hors de la boîte.