web-dev-qa-db-fra.com

Avantages / 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 dessus
  • application web de commerce électronique 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. De plus, 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 lorsque j'essaie d'utiliser une base de données orientée document pour ces exigences?

69
user2427

Vous devez penser à la façon dont vous abordez l'application d'une manière orientée document. Si vous essayez simplement de reproduire la façon dont vous modéliseriez le problème dans un SGBDR, vous échouerez. Vous pouvez également faire différents compromis. " dessous?)

Une façon d'y penser est d'imaginer que vous n'aviez pas d'ordinateurs, juste des documents papier. Comment pourriez-vous créer un processus commercial efficace en utilisant des bouts de papier qui circulent? Comment éviter les goulots d'étranglement? Et si quelque chose tourne mal?

Un autre angle auquel vous devriez penser est la cohérence éventuelle, où vous entrerez éventuellement dans un état cohérent, mais vous pourriez être incohérent pendant une certaine période de temps. C'est un anathème en terre SGBDR, mais extrêmement courant dans le monde réel. L'exemple canonique de transaction est de transférer de l'argent à partir de comptes bancaires. Comment cela se produit-il réellement dans le monde réel - par le biais d'une seule transaction atomique ou par le biais de différentes banques qui se communiquent des avis de crédit et de débit? Que se passe-t-il lorsque vous écrivez un chèque?

Regardons donc vos exemples:

  • CRUD d'entités avec certains champs avec un index unique dessus.

Si je comprends bien cela en termes de CouchDB, vous voulez avoir une collection de documents où une valeur nommée est garantie d'être unique dans tous ces documents? Ce cas n'est généralement pas pris en charge car les documents peuvent être créés sur différentes répliques.

Nous devons donc examiner le problème du monde réel et voir si nous pouvons modéliser cela. En avez-vous vraiment besoin pour être unique? Votre application peut-elle gérer plusieurs documents avec la même valeur? Avez-vous besoin d'attribuer un identifiant unique? Pouvez-vous le faire de façon déterministe? Un scénario courant où cela est requis 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'identifiant unique doit être strictement séquentiel par rapport au temps créé, il est impossible si vous avez besoin de l'identifiant immédiatement. Vous devez assouplir au moins une de ces contraintes.

  • application web de commerce électronique comme 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! Merci". Y a-t-il quelque chose qui manque dans l'approche décrite ici qui vous pose 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 les conflits.

34
Kerr

Faut-il normaliser les données?

  • Oui: utilisez le relationnel.
  • Non: utilisez le document.
14
dacracot

Je suis dans le même bateau, j'adore couchdb en ce moment et je pense que tout le style fonctionnel est super. Mais quand exactement commençons-nous à les utiliser dans ernest pour des applications. Je veux dire, oui, nous pouvons tous commencer à développer des applications extrêmement rapidement, sans corruption, avec tous ces accrochages désagréables sur la forme normale laissée sur le bord de la route et sans utiliser de schémas. Mais, pour inventer une phrase "nous sommes sur les épaules de géants". Il y a une bonne raison d'utiliser le SGBDR et de normaliser et d'utiliser les schémas. Mon ancienne tête Oracle est ébranlée en pensant aux données sans forme.

Mon principal facteur wow sur couchdb est la réplication et le système de gestion des versions fonctionnant en tandem.

J'ai creusé la tête pendant le mois dernier en essayant de bloquer les mécanismes de stockage de couchdb, apparemment il utilise des arbres B mais ne stocke pas de données basées sur une forme normale. Cela signifie-t-il qu'il est vraiment très intelligent et se rend compte que les bits de données sont répliqués alors permet simplement de faire un pointeur vers cette entrée d'arbre B?

Jusqu'à présent, je pense aux documents xml, aux fichiers de configuration, aux fichiers de ressources diffusés en chaînes de base64.

Mais utiliserais-je couchdb pour les données structurelles. Je ne sais pas, toute aide grandement appréciée à ce sujet.

Peut être utile pour stocker des données RDF ou même du texte sous forme libre.

7
WeNeedAnswers

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ées par leurs ID, et une base de données de documents pour les descriptions et/ou les spécifications de ces éléments. Par exemple, vous pouvez avoir une base de données relationnelle avec une table Produits avec les champs suivants:

  • ProductID
  • La description
  • Prix ​​unitaire
  • La taille du lot
  • Caractéristiques

Et ce champ Spécifications contiendrait en fait une référence à un document avec les spécifications techniques du produit. De cette façon, vous avez le meilleur des deux mondes.

4
pyon

Les bases de données basées sur des documents conviennent le mieux pour stocker des documents. Lotus Notes est une implémentation courante et le courrier électronique Notes en est un exemple. Pour ce que vous décrivez, commerce électronique, CRUD, etc., les bases de données immobilières sont mieux conçues pour le stockage et la récupération des éléments de données/éléments qui sont indexés (par opposition aux documents).

3
Jim Anderson

Concernant CRUD: l'ensemble du paradigme REST correspond directement à CRUD (ou vice versa). Donc, si vous savez que vous pouvez modéliser vos besoins avec des ressources (identifiables via des URI) et un ensemble de base d'opérations ( à savoir CRUD), vous pouvez être très proche d'un système basé sur REST, que bon nombre de systèmes orientés documents fournissent dès le départ.

0
KoW