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:
Réponses:
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 :
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 .
la source
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:
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%:
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.
la source
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:
Plus facile:
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. :)
la source
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.
la source
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.
la source