114 votes

Conception de base de données non relationnelles

Je suis intéressé à entendre parler de la conception des stratégies que vous avez utilisées avec des non-relationnelle "nosql" bases de données - qui est, la (surtout les nouveaux) classe de banques de données qui ne sont pas traditionnelles et relationnelle de la conception ou SQL (comme Hypertable, CouchDB, SimpleDB, Google App Engine banque de données, Voldemort, Cassandra, SQL Services de Données, etc.). Ils sont également souvent désigné comme "clé/valeur "magasins", et à la base, ils agissent comme géant distribué persistante des tables de hachage.

Plus précisément, je veux apprendre les différences dans conceptuel des données de conception avec ces nouvelles bases de données. Quoi de plus facile, ce qui est plus difficile, ce qui ne peut pas être fait du tout?

  • Avez-vous venir avec des designs alternatifs qui fonctionnent beaucoup mieux dans le non-monde relationnel?

  • Avez-vous frapper votre tête contre quelque chose qui semble impossible?

  • Avez-vous a comblé l'écart avec n'importe quel des modèles de conception, par exemple, de traduire à partir de l'une à l'autre?

  • Avez-vous même n'explicite des modèles de données du tout (par exemple, en UML) ou avez-vous chucked entièrement en faveur de semi-structuré / document de données orientée objets blob?

  • Ne vous manquez l'un des principaux services supplémentaires que RDBMSes fournir, comme l'intégrité relationnelle, arbitrairement complexes soutien à la transaction, triggers, etc?

Je viens d'une relationnelle SQL DB arrière-plan, de sorte que la normalisation est dans mon sang. Cela dit, je reçois les avantages de la non-bases de données relationnelles pour des raisons de simplicité et de mise à l'échelle, et mon petit doigt me dit qu'il y a à être plus riche du chevauchement des fonctions de conception. Qu'avez-vous fait?

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

79voto

j-g-faustus Points 4315

J'ai seulement commencé avec les non-relationnelles DBs, et je suis encore à essayer d'envelopper ma tête autour de lui et comprendre ce que le meilleur modèle serait. Et je ne peux parler que pour CouchDB.

Encore, j'ai quelques conclusions préliminaires:

Avez-vous venir avec des designs alternatifs qui fonctionnent beaucoup mieux dans le non-monde relationnel?

La conception focus: déplacements de La conception du modèle de document (correspondant à DB tables) devient presque hors de propos, alors que tout dépend de la conception de la vue (correspondant à des requêtes).

Le document DB sorte de swaps de la complexité: SQL a inflexible de données et des requêtes flexibles, document DBs sont dans l'autre sens.

Le CouchDB est un modèle de la collection des "documents JSON" (en gros, imbriqués les tables de hachage). Chaque document possède un IDENTIFIANT unique, et peut être trivialement récupérées par ID. Pour toute autre question, vous écrivez "points de vue", qui sont nommées ensembles de map/reduce fonctions. Le point de vue de retourner un résultat comme une liste de paires clé/valeur.

Le truc, c'est que vous n'avez pas de requête de la base de données dans le sens d'une requête sur une base de données SQL: Les résultats de l'exécution de la fonction d'affichage sont stockées dans un index, et que l'index peut être interrogé. (Comme "tout obtenir", "clé" ou "obtenir les clés de la gamme".)

L'analogie la plus proche dans le monde SQL serait si vous pouviez seulement requête de la DB à l'aide de procédures stockées - chaque requête que vous souhaitez à l'appui doivent être prédéfinies.

La conception de ces documents est extrêmement flexible. J'ai trouvé seulement deux contraintes:

  • Conserver des données ensemble dans le même document, car il n'en est rien, correspondant à une jointure.
  • Ne faites pas les documents de si grands qu'ils sont mis à jour trop souvent (comme mettre toutes les ventes de l'entreprise pour l'année dans le même document), car à chaque mise à jour du document déclenche une ré-indexation.

Mais tout dépend de la conception que de la vue.

L'autre dessins, j'ai trouvé que le travail ordres de grandeur mieux avec CouchDB que n'importe quelle base de données SQL sont au niveau du système plutôt que le niveau de stockage. Si vous avez quelques données et que vous souhaitez les servir à une page web, la complexité de l'ensemble du système est réduite d'au moins 50%:

  • pas de concevoir des tables DB (problème mineur)
  • pas de ODBC/JDBC couche intermédiaire, toutes les requêtes et transactions sur http (problème modéré)
  • simple DB-objet de mappage de JSON, qui est presque négligeable par rapport à la même dans SQL (important!)
  • vous pouvez éventuellement passer la totalité de serveur d'applications, que vous pouvez concevoir vos documents peuvent être récupérées directement par le navigateur à l'aide d'AJAX et d'ajouter un peu de JavaScript polissage avant ils sont affichés au format HTML. (ÉNORME!!)

Normal webapps, document/basé sur JSON DBs sont une énorme victoire, et les inconvénients de moins en moins flexibles requêtes et un certain code supplémentaire pour la validation des données semble être un petit prix à payer.

Avez-vous frapper votre tête contre quelque chose qui semble impossible?

Pas encore de. Map/reduce comme un moyen d'interrogation d'une base de données est inconnu, et demande beaucoup plus de réflexion que d'écrire du SQL. Il y a un assez petit nombre de primitives, afin d'obtenir les résultats que vous avez besoin est avant tout une question d'être créatif avec la façon dont vous spécifiez les touches.

Il y a une limitation en ce que les requêtes ne peuvent pas regarder deux ou plusieurs documents en même temps - pas de joints ou d'autres types de multi-document de relations, mais rien n'a été jusqu'ici impossible.

Comme un exemple de limitation, les chiffres et les montants sont faciles, mais les moyennes ne peut pas être calculé par une vue CouchDB/requête. Corrigé: renvoie la somme et le nombre séparément et de calculer la moyenne sur le client.

Avez-vous a comblé l'écart avec n'importe quel des modèles de conception, par exemple, de traduire à partir de l'une à l'autre?

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

Une façon de penser, il est de regarder votre SQL pour les insertions et les requêtes communes: les tables et les colonnes sont mis à jour lorsqu'un client passe une commande, par exemple? Et ceux qui pour des rapports de ventes mensuels? Cette info devrait probablement aller dans le même document.

Que est: Un document pour l'Ordre, contenant l'ID du client et de l'Id de produit, avec répliqué de champs que nécessaire de simplifier les requêtes. Quoi que ce soit dans un document peut être consulté facilement, chose qui nécessite un croisement entre les dire de l'Ordre et le Client doit être effectué 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 l'ordre.

Avez-vous même n'explicite des modèles de données du tout (par exemple, en UML)?

Désolé, n'a jamais fait beaucoup UML avant de document DBs :)

Mais vous besoin d'une sorte de modèle de dire quels sont les champs appartiennent à qui les documents et quels types de valeurs qu'ils contiennent. À la fois pour votre propre référence, plus tard, et assurez-vous que everybod à l'aide de la DB connaît les conventions. Puisque vous n'avez plus obtenez un message d'erreur si vous stockez une date dans un champ de texte, par exemple, et n'importe qui peut ajouter ou supprimer n'importe quel champ qu'ils en ont envie, vous avez besoin d'un code de validation et de conventions de prendre le relais. Surtout si vous travaillez avec des ressources externes.

Ne vous manquez l'un des principaux services supplémentaires que RDBMSes fournir?

Nope. Mais mon fond est développeur d'applications web, nous travaillons avec des bases de données que dans la mesure où il faut :)

Une entreprise que j'ai l'habitude de travailler pour un produit (une webapp) qui a été conçue pour fonctionner sur les bases de données SQL à partir de plusieurs fournisseurs, et les "services supplémentaires" sont très différentes de DB DB qu'ils devaient être mises en œuvre séparément pour chaque DB. Il était donc moins de travail pour nous afin de déplacer les fonctionnalités des SGBD. Cette même recherche fulltext.

Donc, tout ce que je donne 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 que je suis en train de travailler sur maintenant est une webapp pour les données financières, les cours de la bourse et la comme. C'est un très bon match pour un document DB, de mon point de vue-je obtenir tous les avantages d'un DB (persistance et requêtes) sans tous les tracas.

Mais ces données sont assez indépendants les uns des autres, il n'y a aucun complexe des requêtes relationnelles. Recevez les dernières cotations par téléscripteur, obtenez des devis par symbole et la date gamme de, obtenir de la société meta-info, qui est à peu près tout. Un autre exemple que j'ai vu était une application de blog et les blogs ne sont pas caractérisés par massivement compliqué schémas de base de données.

Ce que j'essaie de dire, c'est que le succès de toutes les applications de document DBs je connais ont été avec des données qui n'ont pas beaucoup d'interrelations, en premier lieu: les Documents (comme lors d'une recherche Google), des articles de blog, des articles, des données financières.

J'attends qu'il existe des ensembles de données que la carte mieux SQL que pour le modèle de document, donc j'imagine SQL va survivre.

Mais pour ceux d'entre nous qui veulent juste un moyen simple de stocker et récupérer des données - et je soupçonne qu'il y a beaucoup de nous - document de bases de données (comme dans CouchDB) sont une aubaine.

55voto

nawroth Points 3695

Je pense que vous avez à considérer que la non-SGBD relationnel diffèrent beaucoup quant à leur modèle de données et, par conséquent, le conceptuel des données de conception varient aussi beaucoup. Dans le fil de Conception de Données dans des Bases de données Non Relationnelles de la NOSQL groupe Google les différents paradigmes sont classés comme ceci:

  1. Bigtable de systèmes (HBase, Hypertable, etc)
  2. Clé-valeur de magasins (Tokyo, Voldemort, etc)
  3. Document de bases de données (CouchDB, MongoDB, etc)
  4. Graphique de bases de données (AllegroGraph, Neo4j, Sésame, etc)

Je suis la plupart du temps dans le graphique de bases de données, et l'élégance de conception de données à l'aide de ce paradigme, ce qui m'a amené là, fatigué des lacunes de SGBDR. J'ai mis quelques exemples de conception de données à l'aide d'un graphique de la base de données sur cette page de wiki et il y a un exemple de modèle de la base IMDB film/acteur/rôle des données.

Les diapositives de la présentation (slideshare) Graphique de Bases de données et l'Avenir de la Grande Échelle de la Gestion des Connaissances par Marko Rodriguez contient une très belle introduction à la conception de données à l'aide d'un graphique de la base de données.

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

Autre conception: ajout de relations entre différents types d'entités sans aucun soucis ou d'un besoin de prédéfinir les entités qui peuvent se connecter.

Combler le fossé: j'ai tendance à faire ce différent pour chaque cas, en se fondant sur le domaine lui-même, comme je ne veux pas d'une "table-graphe orienté" et ainsi de suite. Cependant, voici quelques informations sur la traduction automatique, à partir de SGBDR graphdb.

Explicite des modèles de données: je fais cela tout le temps (tableau blanc style), puis utilisez le modèle tel qu'il est dans la DB.

Manquer de SGBDR monde: des moyens faciles pour créer des rapports. Mise à jour: peut-être que ce n'est pas que dur pour créer des rapports à partir d'un graphique de la base de données, voir la Création d'un Rapport pour un Exemple de Base de données Neo4J.

11voto

Rutger Nijlunsing Points 3051

Je vais répondre à cette avec CouchDB dans le dos de mon esprit, mais je présume que la plupart pourrait être vrai pour d'autres DBs aussi. Nous avons regardé avec CouchDB, mais ont finalement décidé contre elle depuis notre accès aux données n'est pas connue à l'avance et l'évolutivité n'est pas la question.

Plus difficile:

  • Faut repenser niveau conceptuel il est donc plus difficile', car il est juste différent. Puisque vous connaissez vos données, les modèles d'accès à l'avance, pas de la traduction automatique peut être appliquée. Vous devez ajouter le modèle de l'accès au moins.
  • La cohérence n'est pas traitée par la base de données, mais doivent être traitées dans l'application. Moins garantit des moyens plus faciles de la migration, du fail-over et une meilleure évolutivité au prix d'une plus compliqué application. Une application pour gérer les conflits et les contradictions.
  • Liens qui de la croix documents (ou de la clé/valeur) doivent être traités au niveau de l'application également.
  • Type SQL de bases de données ont des IDEs qui sont beaucoup plus matures. Vous obtenez beaucoup de bibliothèques de prise en charge (bien que la superposition de ces bibliothèques rendre les choses beaucoup plus complexe que nécessaire pour SQL).

Plus facile:

  • Plus rapide si vous savez que votre accès aux données des modèles.
  • La Migration et le Fail-over est plus facile pour la base de données depuis pas de promesses sont faites pour vous en tant que programmeur de l'application. Bien que vous obtenez la cohérence des résultats. Probablement. Enfin. Un certain temps.
  • Une clé / valeur est beaucoup plus facile à comprendre qu'une ligne d'une table. Tous les (arbre) les relations sont déjà en, et des objets peuvent être reconnus.

La modélisation doit être la même, mais vous devez être prudent sur ce que vous mettez dans un document: UML peut également être utilisé pour les deux OO de la modélisation ainsi que DB modélisation, qui sont deux bêtes déjà.

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

1voto

xpda Points 8417

Fichiers plats ont longtemps été considérés comme des arcanes et peu pratique pour un ensemble de données de toute taille. Cependant, des ordinateurs plus rapides avec plus de mémoire rendre possible de charger un fichier dans la mémoire et le tri en temps réel, au moins pour raisonnablement petit n et locales, les applications mono-utilisateur.

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

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

1voto

Stephan Eggermont Points 11224

Les bases de données relationnelles, que je vois dans la vraie vie ont tendance à être normalisées ne pas très bien du tout, contrairement à votre affirmation. Interrogés, les concepteurs dire moi, c’est surtout à cause de la performance. SGBDR n’est pas bonnes à rejoindre, tables ont tendance à être beaucoup trop large d’un point de vue de normalisation. Bases de données orientées objet ont tendance à être beaucoup mieux à cela.

Un autre point où les SGBDR ont des problèmes s’occupe des touches de fonction du temps/histoire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X