web-dev-qa-db-fra.com

Quand ne devriez-vous pas utiliser une base de données relationnelle?

Outre le scénario Google/Bigtable, lorsque vous ne devriez-vous pas utiliser une base de données relationnelle? Pourquoi pas, et que devriez-vous utiliser? (avez-vous appris "la dure de la manière"?)

67
Stephen

Dans mon expérience, vous ne devriez pas utiliser une base de données relationnelle lorsque l'un de ces critères est vrai:

  • vos données sont structurées comme une hiérarchie ou un graphique (réseau) de profondeur arbitraire,
  • le modèle d'accès typique met l'accent sur la lecture par écrit, ou
  • il n'y a aucune obligation pour les requêtes ad-hoc.

Les hiérarchies profondes et les graphiques ne se traduisent pas bien vers des tables relationnelles. Même avec l'aide d'extensions exclusives comme l'oracle CONNECT BY, la poursuite des arbres est une douleur puissante en utilisant SQL.

Les bases de données relationnelles ajoutent beaucoup de frais généraux pour un accès simple en lecture. L'intégrité transactionnelle et référentielle est puissante, mais une excédente pour certaines applications. Donc, pour la plupart des applications, une métaphore de fichier est assez bonne.

Enfin, vous n'avez tout simplement pas besoin d'une base de données relationnelle avec sa langue de requête pleine épousée s'il n'y a pas de requêtes inattendues prévues. S'il n'y a pas de costumes posant des questions comme "Combien de widgets bleu de 5% à 5%, avons-nous vendu sur la côte est regroupée par le vendeur?" Et il n'y aura jamais, alors vous, monsieur, peut vivre libre de DB.

36
yukondude

Le paradigme de base de données relationnelle rend certaines hypothèses sur l'utilisation des données.

  • Une relation consiste en un ensemble de lignes non ordonnées.
  • Toutes les lignes d'une relation ont le même ensemble de colonnes.
  • Chaque colonne a un nom fixe et un type de données et un sens sémantique sur toutes les lignes.
  • Les lignes d'une relation sont identifiées par des valeurs uniques dans la ou les colonnes de clé primaire.
  • etc.

Ces hypothèses soutiennent la simplicité et la structure, au coût de la flexibilité. Toutes les tâches de gestion des données ne correspondent pas à ce type de structure. Les entités avec des attributs complexes ou des attributs variables ne sont pas, par exemple. Si vous avez besoin de flexibilité dans les zones où une solution de base de données relationnelle ne le prend pas en charge, vous devez utiliser un type de solution différent.

Il existe d'autres solutions pour la gestion de données avec différentes exigences. La technologie Web sémantique, par exemple, permet à chaque entité de définir ses propres attributs et d'être auto-décrivant, en traitant des métadonnées comme des attributs comme des données. Ceci est plus flexible que la structure imposée par une base de données relationnelle, mais cette flexibilité vient avec un coût propre.

Dans l'ensemble, vous devez utiliser le bon outil pour chaque travail.

Voir aussi mon autre réponse à " les bases de données suivantes ."

20
Bill Karwin

Il existe trois modèles de données principaux (c.j.date, e.f.codd) et j'ajoute un fichier plat à ceci:

  • fichiers plats (Structure varie - du texte plat "stupide" aux fichiers conformes aux grammaires qui couplés à des outils intelligents, les compilateurs de réflexion et ce qu'ils peuvent faire, une application étroite dans la modélisation de nouvelles choses)
  • hiérarchique (arbres, ensembles imbriqués - Exemples: XML et autres langages de balisage, registre, graphiques organisationnels, etc. Tout peut être modélisé, mais les règles d'intégrité ne sont pas faciles à exprimer et à la récupération sont difficiles à optimiser automatiquement, Une certaine récupération est rapide et certaines sont très lentes)
  • résea (réseaux, graphiques - Exemples: Bases de données de navigation, hyperliens, Semantic Web, à nouveau presque tout ce qui peut être modélisé mais l'optimisation automatique de la récupération est un problème)
  • relationnel (Logique de prédicat de premier ordre - Exemple: bases de données relationnelles, optimisation automatique de la récupération)

Hiérarchique et réseau peuvent être représentés en relationnel et relationnel peuvent être exprimés dans les deux autres.

La raison pour laquelle la relation relationnelle est considérée comme "meilleure" est la nature déclarative et la normalisation sur non seulement la langue de récupération de données, mais également sur la langue de définition de données, y compris la forte intégrité des données déclaratives, sauvegardée avec stable , évolutive. , système de gestion multi-utilisateurs.

Les avantages sont à un coût, que la plupart des projets trouvent constituent un bon rapport pour les systèmes (multi-applications) qui stockent des données à long terme dans un de ceux qui seront utilisables dans un avenir prévisible.

Si vous ne construisez pas un système, mais une seule application, peut-être pour un seul utilisateur, et vous êtes assez certain que vous ne voudriez pas plusieurs applications à l'aide de vos données, ni plusieurs utilisateurs, à tout moment, vous trouverez probablement des approches plus rapides. .

De plus, si vous ne savez pas quel type de données vous souhaitez stocker et comment le modeler que les forces du modèle relationnel sont gaspillées dessus.

Ou si vous ne vous souciez tout simplement pas de l'intégrité de vos données dont beaucoup (ce qui peut aller bien).

Toutes les structures de données sont optimisées pour un certain type d'utilisation, uniquement relationnelle si elle est correctement modélisée tente de représenter la "réalité" de manière sémantiquement impartiale. Les personnes qui avaient une mauvaise expérience avec des bases de données relationnelles ne réalisent généralement pas que leur expérience aurait été bien pire avec d'autres types de modèles de données. Des implémentations horribles sont possibles, et en particulier avec des bases de données relationnelles, où il est relativement facile de construire des modèles complexes, vous pourriez vous retrouver avec un monstre assez facile sur vos mains. Je me sens toujours toujours mieux quand j'essaie d'imaginer le même monstre en XML.

Un exemple de la qualité du modèle relationnel est un ratio de complexité vs déséquilibre des questions que vous trouverez qui impliquent SQL.

13
Unreason

Je vous suggère de visiter le Blog d'évolutivité élevé , qui traite de ce sujet presque quotidiennement et comporte de nombreux articles sur des projets qui ont choisi des hachages distribués, etc. sur RDMBS.

La réponse rapide (mais très incomplète) est que toutes les données ne se traduisent pas bien aux tables de manière efficace. Par exemple, si vos données sont essentiellement un grand dictionnaire, il existe probablement beaucoup plus de solutions de remplacement plus rapides que les OLD Old OldBMs. Ayant déclaré que, c'est surtout une question de performance et si la performance n'est pas une préoccupation énorme dans un projet, la stabilité, la cohérence et la fiabilité, par exemple, je ne vois donc pas beaucoup de point dans ces technologies lorsque RDBMS est un système beaucoup plus mature et bien développé, avec support dans toutes les langues et toutes les plateformes et un énorme ensemble de solutions à choisir.

12
Assaf Lavie

Il y a quinze ans, je travaillais sur un système de risque de crédit (essentiellement un grand système de marche d'arbres). Nous utilisions Sybase sur HPUX & Solaris et EXPERTNCE vous tuait. Nous avons embauché dans des consultants directement de Sybase qui a déclaré que cela ne pouvait pas être fait. Ensuite, nous avons changé de OO Database (Store de l'objet dans ce cas) et a obtenu une augmentation de la performance de 100x (et le code était d'environ 100 fois plus facile à écrire).

Mais de telles situations sont assez rares - une base de données relationnelle est un bon choix.

9
anon

Lorsque votre schéma varie beaucoup, vous aurez du mal à des bases de données relationnelles. C'est là que les bases de données XML ou les bases de données de paires de valeurs de clé fonctionnent mieux. Ou vous pouvez utiliser IBM DB2 et avoir à la fois des données relationnelles et des données XML gérées par un seul moteur de base de données.

7
Leon Katsnelson

Il y a environ 7 à 8 ans, j'ai travaillé sur un site Web qui a grandi en popularité au-delà de nos attentes initiales et nous avons eu des problèmes de performance. Étant donné que nous étions tous relativement inexpérimentés dans des projets Web, il a posé une souche importante sur ce qu'il faut faire au-delà de la séparation de la base de données habituelle sur un serveur séparé, un équilibrage de charge, etc.

Un jour, j'ai pensé à quelque chose de très simple. Depuis que le site était basé sur les utilisateurs, leurs profils ont été stockés dans une table de base de données la manière habituelle que quelqu'un le ferait - ID utilisateur, de nombreuses variables d'informations et des trucs similaires - ce qui apparaîtrait en tant que page de profil d'utilisateurs que d'autres utilisateurs pourraient rechercher . J'ai rougé toutes ces données dans un simple fichier HTML, déjà préparé en tant que page de profil d'utilisateurs et obtenu un boost significatif - essentiellement un cache. J'ai même fait un système que lorsque l'utilisateur a modifié leurs informations de profil, il parsait le fichier HTML d'origine, le mettre en place pour édition, puis rincez HTML dans le système de fichiers - obtenu encore plus de boost.

J'ai fait quelque chose de simillar avec les utilisateurs de messages envoyés les uns aux autres. En gros, où que je puisse créer un système de dérangement une base de données, évitez d'insertion ou de mise à jour, j'ai un coup de pouce significatif. Cela peut sembler comme un bon sens, mais c'était un moment éclairant. Ce n'est pas une évasion de la configuration relationnelle en soi, mais c'est une évitement de la base de données tout à fait - KISS.

1
Keyframe