Conception de bases de données non relationnelles [fermé]

114

Je suis intéressé par les stratégies de conception que vous avez utilisées avec les bases de données non relationnelles «nosql» - c'est-à-dire la classe (principalement nouvelle) de magasins de données qui n'utilisent pas la conception relationnelle traditionnelle ou SQL (comme Hypertable, CouchDB, SimpleDB, magasin de données Google App Engine, Voldemort, Cassandra, SQL Data Services, etc.). Ils sont également souvent appelés «magasins de clés / valeurs» et agissent à la base comme des tables de hachage persistantes géantes.

Plus précisément, je souhaite en savoir plus sur les différences de conception de données conceptuelles avec ces nouvelles bases de données. Qu'est-ce qui est plus facile, qu'est-ce qui est plus difficile, qu'est-ce qui ne peut pas être fait du tout?

  • Avez-vous proposé des conceptions alternatives qui fonctionnent beaucoup mieux dans le monde non relationnel?

  • Vous êtes-vous cogné la tête contre tout ce qui semble impossible?

  • Avez-vous comblé le fossé avec des modèles de conception, par exemple pour traduire de l'un à l'autre?

  • Faites-vous même du tout des modèles de données explicites maintenant (par exemple en UML) ou les avez-vous entièrement rejetés en faveur de blobs de données semi-structurées / orientées document?

  • Vous manquez l'un des principaux services supplémentaires fournis par les SGBDR, comme l'intégrité relationnelle, la prise en charge de transactions arbitrairement complexes, les déclencheurs, etc.?

Je viens d'un background DB relationnel SQL, donc la normalisation est dans mon sang. Cela dit, j'obtiens les avantages des bases de données non relationnelles pour la simplicité et la mise à l'échelle, et mon instinct me dit qu'il doit y avoir un chevauchement plus riche des capacités de conception. Qu'avez-vous fait?

Pour info, il y a eu des discussions StackOverflow sur des sujets similaires ici:

Ian Varley
la source
2
bases de données clé / valeur l'ancienne nouvelle chose.
Christopher
1
Pour toute personne très intéressée, une longue discussion est en cours sur le groupe google NoSQL, ici: groups.google.com/group/nosql-discussion/browse_thread/thread/…
Ian Varley
4
Pour info, j'ai rédigé un rapport détaillé sur ce sujet, ici: google.com/url?sa=D&q=http://ianvarley.com/UT/MR/ Merci à vous tous pour votre contribution utile!
Ian Varley

Réponses:

55

Je pense que vous devez considérer que les SGBD non relationnels diffèrent beaucoup en ce qui concerne leur modèle de données et donc la conception conceptuelle des données sera également beaucoup différente. Dans le fil Data Design in Non-Relational Databases du groupe NOSQL Google, les différents paradigmes sont classés comme suit :

  1. Systèmes de type Bigtable (HBase, Hypertable, etc.)
  2. Magasins à valeur clé (Tokyo, Voldemort, etc.)
  3. Bases de données documentaires (CouchDB, MongoDB, etc.)
  4. Bases de données graphiques (AllegroGraph, Neo4j, Sesame, etc.)

Je suis principalement dans les bases de données de graphes , et l'élégance de la conception de données utilisant ce paradigme est ce qui m'a amené là-bas, fatigué des lacunes du SGBDR . J'ai mis quelques exemples de conception de données à l'aide d'une base de données de graphiques sur cette page wiki et il y a un exemple de la façon de modéliser les données de base du film / acteur / rôle IMDB .

Les diapositives de présentation (slideshare) Graph Databases and the Future of Large-Scale Knowledge Management par Marko Rodriguez contiennent une très belle introduction à la conception de données à l'aide d'une base de données de graphiques.

Répondre aux questions spécifiques d'un point de vue graphdb:

Conception alternative: ajout de relations entre de nombreux types d'entités sans aucun souci ni besoin de prédéfinir quelles entités peuvent être connectées.

Combler le fossé: j'ai tendance à faire cela différemment pour chaque cas, en fonction du domaine lui-même, car je ne veux pas d'un "graphe orienté table" et autres. Cependant, voici quelques informations sur la traduction automatique du SGBDR vers graphdb.

Modèles de données explicites: je les fais tout le temps (style tableau blanc), puis j'utilise également le modèle tel qu'il est dans la base de données.

Miss du monde RDBMS: des moyens simples de créer des rapports. Mise à jour: il n'est peut-être pas si difficile de créer des rapports à partir d'une base de données de graphes, voir Créer un rapport pour une base de données exemple Neo4J .

nawroth
la source
79

Je viens juste de commencer avec des bases de données non relationnelles, et j'essaie toujours de comprendre ce que serait le meilleur modèle. Et je ne peux parler que pour CouchDB.

Pourtant, j'ai quelques conclusions préliminaires:

Avez-vous proposé des conceptions alternatives qui fonctionnent beaucoup mieux dans le monde non relationnel?

L'orientation de la conception change: La conception du modèle de document (correspondant aux tables de base de données) devient quasiment hors de propos, tandis que tout dépend de la conception des vues (correspondant aux requêtes).

La base de données de documents permute en quelque sorte les complexités: SQL a des données inflexibles et des requêtes flexibles, les bases de données de documents sont l'inverse.

Le modèle CouchDB est une collection de "documents JSON" (essentiellement des tables de hachage imbriquées). Chaque document a un identifiant unique et peut être facilement récupéré par identifiant. Pour toute autre requête, vous écrivez des «vues», qui sont des ensembles nommés de fonctions de mappage / réduction. Les vues renvoient un jeu de résultats sous forme de liste de paires clé / valeur.

L'astuce est que vous n'interrogez pas la base de données dans le sens où vous interrogez une base de données SQL: les résultats de l'exécution des fonctions de vue sont stockés dans un index, et seul l'index peut être interrogé. (Comme "obtenir tout", "obtenir la clé" ou "obtenir la plage de clés".)

L'analogie la plus proche dans le monde SQL serait si vous ne pouviez interroger la base de données qu'à l'aide de procédures stockées - chaque requête que vous souhaitez prendre en charge doit être prédéfinie.

La conception des documents est extrêmement flexible. Je n'ai trouvé que deux contraintes:

  • Conservez les données associées ensemble dans le même document, car il n'y a rien de correspondant à une jointure.
  • Ne rendez pas les documents si volumineux qu'ils sont mis à jour trop fréquemment (comme mettre toutes les ventes de l'entreprise pour l'année dans le même document), car chaque mise à jour de document déclenche une réindexation.

Mais tout dépend de la conception des vues.

Les conceptions alternatives que j'ai trouvées qui fonctionnent mieux avec CouchDB qu'avec n'importe quelle base de données SQL sont au niveau du système plutôt qu'au niveau du stockage. Si vous avez des données et que vous souhaitez les diffuser sur une page Web, la complexité de l'ensemble du système est réduite d'au moins 50%:

  • pas de conception de tables de base de données (problème mineur)
  • pas de couche intermédiaire ODBC / JDBC, toutes les requêtes et transactions via http (problème modéré)
  • mappage DB-à-objet simple de JSON, ce qui est presque trivial par rapport à la même chose en SQL (important!)
  • vous pouvez potentiellement ignorer l'ensemble du serveur d'applications, car vous pouvez concevoir vos documents pour qu'ils soient récupérés directement par le navigateur à l'aide d'AJAX et ajouter un peu de polissage JavaScript avant qu'ils ne s'affichent au format HTML. (ÉNORME!!)

Pour les applications Web normales, les bases de données basées sur des documents / JSON sont une victoire massive, et les inconvénients des requêtes moins flexibles et du code supplémentaire pour la validation des données semblent un petit prix à payer.

Vous êtes-vous cogné la tête contre tout ce qui semble impossible?

Pas encore. Mapper / réduire comme moyen d'interroger une base de données n'est pas familier et nécessite beaucoup plus de réflexion que d'écrire du SQL. Il existe un nombre assez restreint de primitives, donc obtenir les résultats dont vous avez besoin est avant tout une question de créativité dans la façon dont vous spécifiez les clés.

Il existe une limitation en ce que les requêtes ne peuvent pas consulter deux documents ou plus en même temps - pas de jointures ou d'autres types de relations multi-documents, mais rien jusqu'à présent n'a été insurmontable.

À titre d'exemple, les comptages et les sommes sont faciles, mais les moyennes ne peuvent pas être calculées par une vue / requête CouchDB. Correction: retournez la somme et comptez séparément et calculez la moyenne sur le client.

Avez-vous comblé le fossé avec des modèles de conception, par exemple pour traduire de l'un à l'autre?

Je ne suis pas sûr que ce soit faisable. Il s'agit plus d'une refonte complète, comme la traduction d'un programme de style fonctionnel en un style orienté objet. En général, il y a beaucoup moins de types de documents que de tables SQL et plus de données dans chaque document.

Une façon d'y penser est de regarder votre SQL pour les insertions et les requêtes courantes: quelles tables et colonnes sont mises à jour lorsqu'un client passe une commande, par exemple? Et lesquels pour les rapports de ventes mensuels? Cette information devrait probablement figurer dans le même document.

C'est-à-dire: Un document pour la commande, contenant l'ID client et les ID produit, avec des champs répliqués si nécessaire pour simplifier les requêtes. Tout ce qui se trouve dans un document peut être interrogé facilement, tout ce qui nécessite des références croisées entre la commande et le client doit être fait par le client. Donc, si vous voulez un rapport sur les ventes par région, vous devriez probablement mettre un code de région dans la commande.

Faites-vous même des modèles de données explicites maintenant (par exemple en UML)?

Désolé, je n'ai jamais fait beaucoup d'UML avant les DB de document :)

Mais vous avez besoin d'une sorte de modèle indiquant quels champs appartiennent à quels documents et quels types de valeurs ils contiennent. À la fois pour votre propre référence plus tard et pour vous assurer que chaque élément utilisant la base de données connaît les conventions. Étant donné que vous n'obtenez plus d'erreur si vous stockez une date dans un champ de texte, par exemple, et que n'importe qui peut ajouter ou supprimer n'importe quel champ de son choix, vous avez besoin à la fois d'un code de validation et de conventions pour prendre le relais. Surtout si vous travaillez avec des ressources externes.

Vous manquez l'un des principaux services supplémentaires fournis par les SGBDR?

Nan. Mais mon expérience est développeur d'applications Web, nous ne traitons les bases de données que dans la mesure où nous devons :)

Une entreprise pour laquelle je travaillais a créé un produit (une application Web) conçu pour fonctionner sur des bases de données SQL de plusieurs fournisseurs, et les «services supplémentaires» sont si différents d'une base de données à l'autre qu'ils ont dû être implémentés séparément pour chaque base de données. Il nous a donc fallu moins de travail pour déplacer la fonctionnalité hors du SGBDR. Cela s'est même étendu à la recherche de texte intégral.

Donc, quoi que j'abandonne, c'est quelque chose que je n'ai jamais vraiment eu en premier lieu. Évidemment, votre expérience peut différer.


Une mise en garde: ce sur quoi je travaille actuellement, c'est une application Web pour les données financières, les cotations boursières et autres. C'est un très bon match pour un document DB, de mon point de vue, j'obtiens tous les avantages d'un DB (persistance et requêtes) sans aucun tracas.

Mais ces données sont assez indépendantes les unes des autres, il n'y a pas de requêtes relationnelles complexes. Obtenez les dernières citations par ticker, obtenez des citations par ticker et par plage de dates, obtenez des méta-informations sur l'entreprise, c'est à peu près tout. Un autre exemple que j'ai vu était une application de blog, et les blogs ne sont pas non plus caractérisés par des schémas de base de données extrêmement compliqués.

Ce que j'essaie de dire, c'est que toutes les applications réussies des bases de données de documents que je connais ont été avec des données qui n'avaient pas beaucoup d'interrelations au départ: documents (comme dans la recherche Google), articles de blog, articles de presse, données financières .

Je m'attends à ce qu'il y ait des ensembles de données qui correspondent mieux à SQL qu'au modèle de document, donc j'imagine que SQL survivra.

Mais pour ceux d'entre nous qui veulent juste un moyen simple de stocker et de récupérer des données - et je soupçonne que nous sommes nombreux - les bases de données de documents (comme dans CouchDB) sont une aubaine.

jg-faustus
la source
9
Très utile. Surtout "SQL a des données inflexibles et des requêtes flexibles, les DB de documents sont l'inverse" et l'absence de jointures.
j_random_hacker
2
+1, c'était très perspicace.
Mas
2
Tellement vrai, je voterais plus d'une fois si possible.
Octavian A. Damiean
C'était toujours extrêmement utile en 2014, ce serait formidable si vous pouviez ajouter ce que vous avez appris depuis 2010 ou un lien vers des informations que vous pourriez avoir ailleurs.
Maggie
11

Je réponds à cela avec CouchDB dans le fond de mon esprit, mais je suppose que la plupart serait vrai pour d'autres bases de données également. Nous avons envisagé d'utiliser CouchDB, mais avons finalement décidé de ne pas le faire car notre accès aux données n'est pas connu à l'avance et l'évolutivité n'est pas le problème.

Plus fort:

  • Il faut repenser au niveau conceptuel, donc c'est «plus difficile» car c'est juste différent. Étant donné que vous devez connaître à l'avance vos modèles d'accès aux données, aucune traduction automatique ne peut être appliquée. Vous devrez au moins ajouter le modèle d'accès.
  • La cohérence n'est pas gérée par la base de données mais doit être traitée dans l'application. Moins de garanties signifie une migration plus facile, un basculement et une meilleure évolutivité au prix d'une application plus compliquée. Une application doit gérer les conflits et les incohérences.
  • Les liens qui traversent des documents (ou clé / valeur) doivent également être traités au niveau de l'application.
  • Les bases de données de type SQL ont des IDE qui sont beaucoup plus matures. Vous obtenez beaucoup de bibliothèques de support (bien que la superposition de ces bibliothèques rend les choses beaucoup plus complexes que nécessaire pour SQL).

Plus facile:

  • Plus rapide si vous connaissez vos modèles d'accès aux données.
  • La migration / basculement est plus facile pour la base de données car aucune promesse ne vous est faite en tant que programmeur d'application. Bien que vous obteniez une cohérence éventuelle. Probablement. Finalement. Un jour.
  • Une clé / valeur est beaucoup plus facile à comprendre qu'une ligne d'une table. Toutes les relations (arborescentes) sont déjà présentes et des objets complets peuvent être reconnus.

La modélisation doit être à peu près la même, mais vous devez faire attention à ce que vous mettez dans un document: UML peut également être utilisé à la fois pour la modélisation OO et la modélisation DB, qui sont déjà deux bêtes différentes.

J'aurais aimé voir une bonne base de données ouverte OO bien intégrée avec C # / Silverlight. Juste pour rendre le choix encore plus difficile. :)

Rutger Nijlunsing
la source
1

Les fichiers plats ont longtemps été considérés comme obscurs et peu pratiques pour un ensemble de données de toute taille. Cependant, des ordinateurs plus rapides avec plus de mémoire permettent de charger un fichier en mémoire et de le trier en temps réel, au moins pour les applications n raisonnablement petites et locales, mono-utilisateur.

Par exemple, vous pouvez généralement lire un fichier de 10 000 enregistrements ET le trier sur un champ en moins d'une demi-seconde, un temps de réponse acceptable.

Bien sûr, il y a des raisons d'utiliser une base de données au lieu d'un fichier plat - opérations relationnelles, intégrité des données, capacité multi-utilisateur, accès à distance, plus grande capacité, standardisation, etc., mais l'augmentation de la vitesse de l'ordinateur et de la capacité de mémoire a entraîné une manipulation en mémoire de données plus pratiques dans certains cas.

xpda
la source
1

Les bases de données relationnelles que je vois dans la vie réelle ont tendance à ne pas être très bien normalisées du tout, contrairement à ce que vous prétendez. Lorsqu'on leur a demandé, les concepteurs me disent que c'est principalement à cause des performances. Les RDBM ne sont pas bons pour la jonction, donc les tables ont tendance à être beaucoup trop larges du point de vue de la normalisation. Les bases de données orientées objet ont tendance à être bien meilleures à cet égard.

Un autre point où les RDBM ont des problèmes est la gestion des clés dépendant de l'historique / du temps.

Stéphan Eggermont
la source
3
Stephan - vous avez raison de dire que les systèmes du monde réel manquent souvent dans le département de normalisation. Mais il n'est pas exact de dire que les RDBMs ne sont "pas bons pour se joindre"; la plupart des produits commerciaux (comme Oracle, MS SQL Server, etc.) ont des optimiseurs de requêtes extrêmement avancés et peuvent exécuter une grande variété d'algorithmes de jointure physique différents, bien plus rapidement que les mêmes opérations pourraient être effectuées dans le code d'application. (MySQL est une exception à cela, d'après ce que je comprends). D'après mon expérience, la dénormalisation prématurée est, comme toute autre optimisation prématurée, souvent le signe de mauvais développeurs.
Ian Varley
2
Poursuivant cette réflexion: de mauvaises jointures sont le résultat d'une mauvaise indexation et de mauvaises statistiques. Si l'optimiseur n'a rien avec quoi travailler ou si les informations sur ce qu'il possède sont obsolètes, il fera de mauvais choix. Beaucoup confondent cela avec une «mauvaise adhésion». Les systèmes RDBM modernes ont un auto-réglage qui masque la nécessité d'utiliser votre cerveau lors de la configuration de l'indexation et des statistiques. De plus, les gens confondent le schéma logique (cinquième forme normale) et le schéma physique (souvent dénormalisé en troisième normale). Ce n'est pas parce que la base de données que vous voyez est "large" qu'elle a été mal conçue logiquement.
Godeke