web-dev-qa-db-fra.com

Pourquoi pas d'amour pour SQL?

J'ai entendu beaucoup de choses ces derniers temps que SQL est un langage terrible, et il semble que chaque framework sous Sun est pré-packagé avec une couche d'abstraction de base de données.

D'après mon expérience, SQL est souvent le moyen le plus facile, le plus polyvalent et le plus convivial pour les programmeurs de gérer l'entrée et la sortie des données. Chaque couche d'abstraction que j'ai utilisée semble être une approche nettement limitée sans réel avantage.

Qu'est-ce qui rend SQL si terrible et pourquoi les couches d'abstraction de base de données sont-elles précieuses?

114
Travis

C'est en partie subjectif. Voici donc mon avis:

SQL a un style pseudo-langage naturel. Les inventeurs pensaient pouvoir créer une langue comme l'anglais et que les requêtes de base de données seront très simples. Une terrible erreur. SQL est très difficile à comprendre, sauf dans des cas triviaux.

SQL est déclaratif. Vous ne pouvez pas dire à la base de données comment elle doit faire les choses, juste ce que vous voulez comme résultat. Ce serait parfait et très puissant - si vous n'aviez pas à vous soucier des performances. Vous finissez donc par écrire SQL - lire des plans d'exécution - reformuler SQL en essayant d'influencer le plan d'exécution, et vous vous demandez pourquoi vous ne pouvez pas écrire le plan d'exécution vous-même.

Un autre problème du langage déclaratif est que certains problèmes sont plus faciles à résoudre de manière impérative. Vous devez donc l'écrire dans une autre langue (vous aurez besoin de SQL standard et probablement d'une couche d'accès aux données) ou en utilisant des extensions de langage spécifiques au fournisseur, par exemple en écrivant procédures stockées et autres. Ce faisant, vous constaterez probablement que vous utilisez l'une des pires langues que vous ayez jamais vues - car elle n'a jamais été conçue pour être utilisée comme langue impérative.

SQL est très ancien. SQL a été standardisé, mais trop tard, de nombreux fournisseurs ont déjà développé leurs extensions de langage. SQL s'est donc retrouvé dans des dizaines de dialectes. C'est pourquoi les applications ne sont pas portables et l'une des raisons d'avoir une couche d'abstraction DB.

Mais c'est vrai - il n'y a pas d'alternatives possibles. Nous allons donc tous utiliser SQL pour les prochaines années.

129
Stefan Steinegger

Mis à part tout ce qui a été dit, ne technologie ne doit pas nécessairement être mauvaise pour valoriser une couche d'abstraction.

Si vous faites un script ou une application très simple, vous pouvez vous permettre de mélanger les appels SQL dans votre code où vous le souhaitez. Cependant, si vous utilisez un système complexe, isoler les appels de base de données dans des modules distincts est une bonne pratique et isoler ainsi votre code SQL. Il améliore la lisibilité, la maintenabilité et la testabilité de votre code. Il vous permet d'adapter rapidement votre système aux modifications du modèle de base de données sans casser tous les éléments de haut niveau, etc.

SQL est génial. Des couches d'abstraction dessus le rendent encore plus grand!

58
Miguel Ventura

Un point des couches d'abstraction est le fait que les implémentations SQL ont tendance à être plus ou moins incompatibles les unes avec les autres, car la norme est légèrement ambiguë, et aussi parce que la plupart des fournisseurs y ont ajouté leurs propres extras (non standard). C'est-à-dire que SQL écrit pour une base de données MySQL peut ne pas fonctionner de manière assez similaire avec, disons, une base de données Oracle - même si cela "devrait".

Je suis d'accord, cependant, que SQL est bien meilleur que la plupart des couches d'abstraction. Ce n'est pas la faute de SQL s'il est utilisé pour des choses pour lesquelles il n'a pas été conçu.

53
Joonas Pulakka

SQL est malmené à partir de plusieurs sources:

  • Des programmeurs qui ne sont à l'aise avec rien d'autre qu'un langage impératif.
  • Des consultants qui doivent gérer quotidiennement de nombreux produits SQL incompatibles
  • Les fournisseurs de bases de données non relationnelles tentent de briser l'emprise des fournisseurs de bases de données relationnelles sur le marché
  • Des experts en bases de données relationnelles comme Chris Date qui considèrent les implémentations actuelles de SQL comme insuffisantes

Si vous vous en tenez à un seul produit SGBD, je suis définitivement d'accord pour dire que les bases de données SQL sont plus polyvalentes et de meilleure qualité que leurs concurrents, au moins jusqu'à ce que vous atteigniez une barrière d'évolutivité intrinsèque au modèle. Mais essayez-vous vraiment d'écrire le prochain Twitter, ou essayez-vous simplement de garder certaines données comptables organisées et cohérentes?

La critique de SQL est souvent un standin pour les critiques des SGBDR. Ce que les critiques des SGBDR semblent ne pas comprendre, c'est qu'ils résolvent assez bien une énorme classe de problèmes informatiques, et qu'ils sont là pour nous faciliter la vie, pas plus dur.

S'ils voulaient sérieusement critiquer SQL lui-même, ils appuieraient des efforts comme Tutorial D et Dataphor.

36
Steven Huwig

Ce n'est pas si terrible. C'est une fâcheuse tendance dans cette industrie de mettre à mal la technologie fiable précédente lorsqu'un nouveau "paradigme" sort. À la fin de la journée, ces cadres utilisent très probablement SQL pour communiquer avec la base de données, alors comment peut-il être si mauvais? Cela dit, le fait d'avoir une couche d'abstraction "standard" signifie qu'un développeur peut se concentrer sur le code de l'application et non sur le code SQL. Sans une telle couche standard, vous écririez probablement une couche légère à chaque fois que vous développez un système, ce qui est une perte d'effort.

22
Trevor Tippins

SQL est conçu pour la gestion et l'interrogation de données basées sur SET. Il est souvent utilisé pour en faire plus et les cas Edge conduisent parfois à la frustration.

L'UTILISATION réelle de SQL peut être SO affectée par la conception de la base de données de base que le SQL peut ne pas être le problème, mais la conception peut - et lorsque vous lancez le code hérité associé à une mauvaise conception, les changements sont plus percutants et coûteux à implémenter (personne n'aime revenir en arrière et "réparer" des choses qui "fonctionnent" et qui atteignent les objectifs)

Les charpentiers peuvent marteler des clous avec des marteaux, scier du bois avec des scies et des planches lisses avec des avions. Il IS possible de "scier" en utilisant des marteaux et des avions, mais dang c'est frustrant.

16
Mark Schultheiss

Je ne dirai pas que c'est terrible. Cela ne convient pas à certaines tâches. Par exemple: vous ne pouvez pas écrire un bon code procédural avec SQL. J'ai été une fois forcé de travailler avec la manipulation des ensembles avec SQL. Il m'a fallu un week-end entier pour comprendre cela.

SQL a été conçu pour l'algèbre relationnelle - c'est là qu'il devrait être utilisé.

11
Nikolay R

J'ai beaucoup entendu dernièrement que SQL est un langage terrible, et il semble que chaque framework sous le Sun soit pré-packagé avec une couche d'abstraction de base de données.

Notez que ces couches convertissent simplement leurs propres trucs en SQL. Pour la plupart des fournisseurs de bases de données, SQL est le seul moyen de communiquer avec le moteur.

D'après mon expérience, SQL est souvent la manière la plus simple, la plus polyvalente et la plus conviviale pour les programmeurs de gérer l'entrée et la sortie des données. Chaque couche d'abstraction que j'ai utilisée semble être une approche nettement limitée sans réel avantage.

… Raison pour laquelle je viens de décrire ci-dessus.

Les couches de base de données ne ajoutent rien, elles ne font que limiter vous. Ils rendent les requêtes incontestablement plus simples mais jamais plus efficaces.

Par définition, il n'y a rien dans les couches de base de données qui ne soit pas dans SQL.

Qu'est-ce qui rend SQL si terrible, et pourquoi les couches d'abstraction de base de données sont-elles précieuses?

SQL est une langue agréable, cependant, il faut un peu de cerveau pour travailler avec.

En théorie, SQL est déclaratif, c'est-à-dire que vous déclarez ce que vous voulez obtenir et que le moteur le fournit de la manière la plus rapide possible.

En pratique, il existe de nombreuses façons de formuler une requête correcte (c'est-à-dire la requête qui renvoie des résultats corrects).

Les optimiseurs sont capables de construire un château Lego à partir d'algorithmes prédéfinis (oui, ils sont multiples), mais ils ne peuvent tout simplement pas créer de nouveaux algorithmes. Il faut toujours un développeur SQL pour les aider.

Cependant, certaines personnes s'attendent à ce que l'optimiseur produise "le meilleur plan possible", et non "le meilleur plan disponible pour cette requête avec une implémentation donnée du moteur SQL".

Et comme nous le savons tous, lorsque le programme informatique ne répond pas aux attentes des gens, c'est le programme qui est blâmé, pas les attentes.

Dans la plupart des cas, cependant, reformuler une requête peut produire un meilleur plan possible. Il y a des tâches quand c'est impossible, cependant, avec les améliorations nouvelles et croissantes de SQL ces cas deviennent de moins en moins nombreux.

Ce serait bien, cependant, si les fournisseurs fournissaient un accès de bas niveau aux fonctions comme "obtenir la plage d'index", "obtenir une ligne par rowid" etc., comme C les compilateurs vous permettent d'incorporer l'assembly directement dans la langue.

J'ai récemment écrit un article à ce sujet dans mon blog:

9
Quassnoi

Je dirais qu'une couche d'abstraction de base de données incluse avec un framework est une bonne chose car elle résout deux problèmes très importants:

  1. Il garde le code distinct. En plaçant le SQL dans une autre couche, qui est généralement très mince et ne devrait faire que les bases de l'interrogation et du transfert des résultats (de manière standardisée), vous gardez votre application libre de l'encombrement de SQL. C'est la même raison pour laquelle les développeurs Web (devraient) mettre CSS et Javascript dans des fichiers séparés. Si vous pouvez l'éviter, ne mélangez pas vos langues.

  2. De nombreux programmeurs sont tout simplement mauvais à utiliser SQL. Pour une raison quelconque, un grand nombre de développeurs (en particulier les développeurs Web) semblent très, très mauvais à utiliser SQL, ou RDBMS en général. Ils traitent la base de données (et SQL par extension) comme le petit intermédiaire crasseux qu'ils doivent traverser pour accéder aux données. Cela conduit à des bases de données extrêmement mal pensées sans index, à des tables empilées au-dessus des tables de manières douteuses et à des requêtes très mal écrites. Ou pire, ils essaient d'être trop généraux (système expert, n'importe qui?) Et ne peuvent raisonnablement relier les données de manière significative.

Malheureusement, parfois la façon dont quelqu'un essaie de résoudre un problème et les outils qu'il utilise, que ce soit en raison de l'ignorance, de l'entêtement ou de tout autre trait, sont en opposition directe les uns avec les autres, et bonne chance pour essayer de le convaincre. En tant que tel, en plus d'être une bonne pratique, je considère qu'une couche d'abstraction de base de données est une sorte de filet de sécurité, car elle garde non seulement le SQL hors des yeux du pauvre développeur, mais elle facilite considérablement la refactorisation de leur code, car toutes les requêtes sont au même endroit.

7
Dereleased

Je suis un grand défenseur de l'ORM et je crois toujours que SQL est très utile, bien qu'il soit certainement possible de faire des choses terribles avec lui (comme n'importe quoi d'autre). .

Je considère SQL comme un langage super efficace qui n'a pas de réutilisation de code ou de maintenabilité/refactorisation comme priorités.

Le traitement ultra-rapide est donc la priorité. Et c'est acceptable. Il suffit d'être conscient des compromis, qui sont considérables pour moi.

D'un point de vue esthétique, en tant que langue, je pense qu'il manque certaines choses car il n'a pas OO concepts et ainsi de suite - cela ressemble à un code de procédure très old school pour moi Mais c'est de loin le moyen le plus rapide de faire certaines choses, et c'est un créneau puissant!

7
Brian MacKay

SQL est excellent pour certains types de tâches, notamment la manipulation et la récupération de sets de données.

Cependant, SQL manque (ou n'implémente que partiellement) plusieurs outils importants pour gérer le changement et la complexité:

  • Encapsulation : Les mécanismes d'encapsulation de SQL sont grossiers. Lorsque vous écrivez du code SQL, vous devez tout savoir sur la mise en œuvre de vos données. Cela limite la quantité d'abstraction que vous pouvez atteindre.

  • Polymorphisme : si vous souhaitez effectuer la même opération sur différentes tables, vous devez écrire le code deux fois. (On peut atténuer cela avec une utilisation imaginative des vues.)

  • Contrôle de visibilité : il n'y a pas de mécanisme SQL standard pour masquer des morceaux de code les uns des autres ou les regrouper en unités logiques, donc chaque table, procédure, etc. est accessible à partir de tous les autres, même lorsqu'il n'est pas souhaitable.

  • Modularité et Versioning

Enfin, le codage manuel des opérations CRUD en SQL (et l'écriture du code pour le connecter au reste de l'application) est répétitif et sujet aux erreurs.

Une couche d'abstraction moderne fournit toutes ces fonctionnalités et nous permet d'utiliser SQL là où il est le plus efficace tout en masquant les détails d'implémentation perturbateurs et répétitifs. Il fournit des outils pour aider à surmonter l'inadéquation de l'impédance relationnelle-objet qui complique l'accès aux données dans le développement logiciel orienté objet.

6
Jeff Sternal

IMO, le problème que je vois que les gens ont avec SQL n'a rien à voir avec la conception relationnelle ni le langage SQL lui-même. Cela a à voir avec la discipline de modélisation de la couche de données qui, à bien des égards, est fondamentalement différente de la modélisation d'une couche métier ou d'une interface. Les erreurs de modélisation au niveau de la couche de présentation sont généralement beaucoup plus faciles à corriger qu'au niveau de la couche de données où plusieurs applications utilisent la base de données. Ces problèmes sont les mêmes que ceux rencontrés dans la modélisation d'une couche de service dans les conceptions SOA où vous devez tenir compte des consommateurs actuels de votre service et des contrats d'entrée et de sortie.

SQL a été conçu pour interagir avec des modèles de bases de données relationnelles. Il existe d'autres modèles de données qui existent depuis un certain temps, mais la discipline concernant la conception correcte de la couche de données existe indépendamment du modèle théorique utilisé et donc, les difficultés que les développeurs rencontrent généralement avec SQL sont généralement liées aux tentatives d'imposer une relation non relationnelle. modèle de données sur un produit de base de données relationnelle.

5
Thomas

SQL est basé sur Set Theory, tandis que la plupart des langages de haut niveau sont orientés objet de nos jours. Les programmeurs d'objets aiment généralement penser dans les objets et doivent faire un changement mental pour utiliser des outils basés sur Set pour stocker leurs objets. En général, il est beaucoup plus naturel (pour le OO programmeur) de simplement couper le code dans la langue de son choix et de faire quelque chose comme object.save ou object.delete dans le code d'application au lieu d'avoir à écrire des requêtes SQL et appeler la base de données pour obtenir le même résultat.

Bien sûr, parfois pour des choses complexes, SQL est plus facile à utiliser et plus efficace, il est donc bon de maîtriser les deux types de technologie.

5
Peter Bailey

Entendu beaucoup récemment? J'espère que vous ne confondez pas cela avec le mouvement NoSql. Pour autant que je sache, il s'agit principalement d'un groupe de personnes qui utilisent NoSql pour des applications Web à haute évolutivité et semblent avoir oublié que SQL est un outil efficace dans un scénario d'application "non à haute évolutivité".

L'activité de la couche d'abstraction consiste à trier la différence entre le code orienté objet et le code basé sur un ensemble de tables tel que SQL aime parler. Habituellement, cela se traduit par l'écriture de nombreuses plaques de chaudière et un code de transition terne entre les deux. ORM automatise cela et permet ainsi de gagner du temps pour les gens d'affaires objectifs.

4
Quibblesome

D'une part, ils rendent trivial l'utilisation de requêtes paramétrées, vous protégeant des attaques par injection SQL. L'utilisation de SQL brut, de ce point de vue, est plus risquée, c'est-à-dire plus facile de se tromper du point de vue de la sécurité. Ils présentent également souvent une perspective orientée objet sur votre base de données, vous évitant d'avoir à faire cette traduction.

4
tvanfosson

Pour un programmeur SQL expérimenté, les mauvais côtés sont

  • Verbosité
  • Comme beaucoup l'ont dit ici, SQL est déclaratif, ce qui signifie que l'optimisation n'est pas directe . C'est comme le rallye par rapport à la course sur circuit.
  • Cadres qui tentent de traiter tous les dialectes possibles et ne prennent en charge aucun raccourci
  • Pas de contrôle de version facile.

Pour d'autres, les raisons sont que

  • certains programmeurs sont mauvais en SQL. Probablement parce que SQL fonctionne avec des ensembles, tandis que les langages de programmation fonctionnent dans un paradigme objet ou fonctionnel. Penser en ensembles (union, produit, intersection) est une question d'habitude que certaines personnes n'ont pas.
  • certaines opérations ne sont pas explicites: c'est-à-dire qu'au début, il n'est pas clair que et ayant filtre différents ensembles.
  • il y a trop de dialectes

L'objectif principal des frameworks SQL est de réduire votre frappe. Ils le font en quelque sorte, mais trop souvent seulement pour des requêtes très simples. Si vous essayez de faire quelque chose de complexe, vous devez utiliser des chaînes et taper beaucoup. Les cadres qui essaient de gérer tout ce qui est possible, comme SQL Alchemy, deviennent trop énormes, comme un autre langage de programmation.

[mise à jour du 26.06.10] J'ai récemment travaillé avec module Django ORM . C'est le seul framework SQL digne que j'ai vu. Et celui-ci fait beaucoup travailler avec des trucs. Les agrégats complexes sont cependant un peu plus difficiles.

4
culebrón

SQL est un très bon langage pour la manipulation de données. Du point de vue du développeur, ce que je n'aime pas, c'est que le changement de la base de données ne casse pas votre code au moment de la compilation ... J'utilise donc l'abstraction qui ajoute cette fonctionnalité au prix des performances et peut-être de l'expressivité du langage SQL , car dans la plupart des applications, vous n'avez pas besoin de tout ce que SQL possède.

L'autre raison pour laquelle SQL est détesté, c'est à cause des bases de données relationnelles.

Le CAP Théorème devient populaire:

Quels objectifs souhaiteriez-vous d'un système de données partagées?

  • Forte cohérence: tous les clients voient la même vue, même en présence de mises à jour
  • Haute disponibilité: tous les clients peuvent trouver une réplique des données, même en présence de pannes
  • Tolérance de partition: les propriétés du système tiennent même lorsque le système est partitionné

Le théorème stipule que vous ne pouvez toujours avoir que deux des trois propriétés CAP en même temps

Adresse de base de données relationnelle Forte cohérence et tolérance de partition.

Ainsi, de plus en plus de personnes réalisent que la base de données relationnelle n'est pas la solution miracle, et de plus en plus de personnes commencent à la rejeter en faveur de la haute disponibilité, car la haute disponibilité facilite la mise à l'échelle horizontale. La mise à l'échelle horizontale gagne en popularité car nous avons atteint la limite de la loi de Moore , donc la meilleure façon de mettre à l'échelle est d'ajouter plus de machine.

Si la base de données relationnelle est rejetée, SQL est également rejeté.

3
Nicolas Dorier

SQL a de nombreux défauts, comme l'ont souligné d'autres affiches ici. Pourtant, je préfère de loin utiliser SQL sur de nombreux outils que les gens proposent comme alternatives, car les "simplifications" sont souvent plus compliquées que ce qu'elles étaient censées simplifier.

Ma théorie est que SQL a été inventé par un groupe de skieurs bleus à tour d'ivoire. L'ensemble de la structure non procédurale. Ça a l'air génial: dites-moi ce que vous voulez plutôt que comment vous voulez le faire. Mais en pratique, il est souvent plus facile de simplement donner les étapes. Cela ressemble souvent à essayer de donner des instructions d'entretien de la voiture en décrivant comment la voiture devrait fonctionner lorsque vous avez terminé. Oui, vous pourriez dire: "Je veux que la voiture obtienne à nouveau 30 miles par gallon et qu'elle fonctionne avec ce bruit de ronflement comme ça ... hmmmm ... et, etc." Mais ne serait-il pas plus facile pour tout le monde de dites simplement: "Remplacez les spark plugs"? Et même lorsque vous savez comment exprimer une requête complexe en termes non procéduraux, le moteur de base de données propose souvent un plan d'exécution très inefficace Je pense que SQL serait beaucoup amélioré par l'ajout de moyens standardisés pour lui dire quelle table lire en premier et quel index utiliser.

Et la gestion des nulls me rend fou! Oui, théoriquement, cela a dû sonner bien quand quelqu'un a dit: "Hé, si null signifie inconnu, alors ajouter une valeur inconnue à une valeur connue devrait donner une valeur inconnue. Après tout, par définition, nous n'avons aucune idée de ce qu'est la valeur inconnue . " Théoriquement, absolument vrai. Dans la pratique, si nous avons 10 000 clients et que nous savons exactement combien d’argent 9 999 nous devons, mais la question du montant dû par le dernier nous est posée et la direction dit: "Quels sont nos comptes clients totaux?", Oui, mathématiquement correct. la réponse est "je ne sais pas". Mais la réponse pratique est "nous calculons 4 327 287,42 $ mais un compte est en question, donc ce nombre n'est pas exact". Je suis sûr que la direction préfère de loin obtenir un chiffre proche, sinon certain, qu'un regard vide. Mais SQL insiste sur cette approche mathématiquement vierge, donc à chaque opération que vous effectuez, vous devez ajouter du code supplémentaire pour vérifier les valeurs nulles et les gérer de manière spéciale.

Cela dit, je préférerais toujours utiliser SQL plutôt qu'une couche construite sur SQL, cela crée juste un autre ensemble de choses que j'ai besoin d'apprendre, puis je dois savoir qu'en fin de compte, cela sera traduit en SQL, et parfois Je peux simplement lui faire confiance pour faire la traduction correctement et efficacement, mais quand les choses deviennent complexes, je ne peux pas, alors maintenant je dois connaître la couche supplémentaire, je dois encore connaître SQL, et je dois savoir comment ça va se traduire à je peux tromper la couche en incitant SQL à faire la bonne chose. Arggh.

3
Jay

SQL n'est pas un langage terrible, il ne joue tout simplement pas très bien avec les autres parfois.

Si, par exemple, si vous avez un système qui souhaite représenter toutes les entités en tant qu'objets dans un langage OO ou autre), la combinaison de ceci avec SQL sans aucune sorte de couche d'abstraction peut devenir assez lourde. Il n'y a pas moyen facile de mapper une requête SQL complexe sur le monde OO. Pour atténuer la tension entre ces mondes, des couches d'abstraction supplémentaires sont insérées (un OR-Mapper par exemple).

3
Joachim Sauer

• Chaque fournisseur étend la syntaxe SQL à ses besoins. Donc, sauf si vous faites des choses assez simples, votre code SQL n'est pas portable.

• La syntaxe de SQL n'est pas orthogonale; Par exemple, les instructions select, insert, update, et delete ont toutes une structure syntaxique complètement différente.

3
David R Tribble

Si vous n'avez pas trop utilisé SQL, je pense que le problème majeur est le manque de bons outils de développement.

Si vous avez beaucoup d'expérience avec SQL, vous aurez, à un moment ou à un autre, été frustré par le manque de contrôle sur le plan d'exécution. Il s'agit d'un problème inhérent à la façon dont SQL a été spécifié aux fournisseurs. Je pense que SQL doit devenir un langage plus robuste pour vraiment exploiter la technologie sous-jacente (qui est très puissante).

2
Jeff Meatball Yang

Rapide, écrivez-moi SQL pour paginer un ensemble de données qui fonctionne dans MySQL, Oracle, MSSQL, PostgreSQL et DB2.

Oh, c'est vrai, SQL standard ne définit aucun opérateur pour limiter le nombre de résultats qui reviennent et à quelle ligne commencer.

2
Powerlord

Je suis d'accord avec vos points, mais pour répondre à votre question, une chose qui rend SQL si "terrible" est le manque de standardisation complète de T-SQL entre les fournisseurs de bases de données (Sql Server, Oracle, etc.), ce qui rend le code SQL peu probable complètement portable. Les couches d'abstraction de base de données résolvent ce problème, mais avec un coût de performance (parfois très sévère).

2
MusiGenesis

Vivre avec du SQL pur peut vraiment être un enfer pour la maintenance. Pour moi, le plus grand avantage des ORM est la possibilité de refactoriser le code en toute sécurité sans procédures fastidieuses de "refactoring DB". Il existe de bons cadres de tests unitaires et des outils de refactorisation pour les langues OO, mais je n'ai pas encore vu l'homologue de Resharper pour SQL, par exemple.

Tous les DAL ont toujours SQL en arrière-plan, et vous devez toujours le savoir pour comprendre ce qui se passe dans votre base de données, mais le travail quotidien avec une bonne couche d'abstraction devient plus facile.

2
ovolko

Il n'y a pas d'amour pour SQL car SQL est mauvais en syntaxe, en sémantique et en utilisation courante. Je vais t'expliquer:

  • sa syntaxe est un shrapnel cobol, toute la critique cobol s'applique ici (dans une moindre mesure, pour être juste). Essayer d'être un langage naturel comme sans essayer d'interpréter le langage naturel crée une syntaxe arbitraire (est-ce DROP TABLE ou DROP, UPDATE TABLE, UPDATE ou UPDATE IN, DELETE ou DELETE FROM ...) et des monstruosités syntaxiques comme SELECT (combien de pages ça remplit?)
  • la sémantique est également profondément imparfaite, Date l'explique en détail, mais il suffira de noter qu'une logique booléenne à trois valeurs ne correspond pas vraiment à une algèbre relationnelle où une ligne ne peut faire ou ne faire partie que d'une table
  • avoir un langage de programmation comme interface principale (et souvent uniquement) vers les bases de données s'est avéré être un très mauvais choix et a créé une nouvelle catégorie de failles de sécurité
2
stupito

Bien que SQL fasse le travail, il a certainement des problèmes ...


  • il essaie d'être simultanément l'abstraction de haut niveau et de bas niveau , et c'est ... = impair. Peut-être aurait-il fallu deux normes ou plus à différents niveaux.
  • c'est un énorme échec en standard . Beaucoup de choses tournent mal lorsqu'une norme remue tout, demande trop d'implémentations, demande trop peu ou, pour une raison quelconque, n'atteint pas l'objectif partiellement social de motiver les fournisseurs et les implémenteurs à produire des implémentations complètes interopérables strictement conformes. Vous ne pouvez certainement pas dire que SQL a fait tout cela. Examinez quelques autres normes et notez que le succès ou l'échec de la norme est clairement un facteur de la coopération utile atteinte:
    • RS-232 (mauvais, pas assez spécifié, même quelle broche transmet et quelle broche reçoit est facultative, sheesh. Vous pouvez vous conformer mais ne rien faire. Chance d'interopérabilité réussie: vraiment faible jusqu'à ce que le PC IBM fait de facto une norme utile.)
    • IEEE 754-1985 virgule flottante (mauvais, dépassement: pas un seul supercalculateur ou poste de travail scientifique ou microprocesseur RISC ne l'a jamais adopté, bien que finalement après 20 ans, nous ayons pu l'implémenter correctement en HW. le monde a fini par y grandir.)
    • C89, C99, PCI, USB, Java (Good, que ce soit standard ou spec, ils ont réussi à motiver une stricte conformité de presque tout le monde, et cette conformité a abouti à une interopération réussie) .)
  • il n'a pas été sélectionné pour sans doute la base de données la plus importante du monde . Bien qu'il s'agisse davantage d'un point de données que d'une raison, le fait que Google Bigtable ne soit pas SQL et non relationnel est une sorte d'anti-réussite pour SQL.
1
DigitalRoss

Je suis d'accord avec la plupart des articles ici que le débat sur l'utilité de SQL est principalement subjectif, mais je pense qu'il est plus subjectif dans la nature des besoins de votre entreprise.

Les langues déclaratives, comme l'a souligné Stefan Steinegger, sont bonnes pour spécifier ce que vous voulez, pas comment vous voulez le faire. Cela signifie que vos différentes implémentations de SQL sont décentes d'un point de vue de haut niveau: c'est-à-dire que si tout ce que vous voulez est d'obtenir des données et que rien d'autre ne compte, vous pouvez vous contenter d'écrire des requêtes relativement simples et de choisir l'implémentation de SQL. cela vous convient.

Si vous travaillez à un niveau beaucoup "inférieur" et que vous devez optimiser tout cela vous-même, c'est loin d'être idéal. L'utilisation d'une couche d'abstraction supplémentaire peut aider, mais si ce que vous essayez vraiment de faire est de spécifier les méthodes d'optimisation des requêtes, etc., il est un peu contre-intuitif d'ajouter un intermédiaire lorsque vous essayez d'optimiser.

Le plus gros problème que j'ai avec SQL est comme les autres langages "standardisés", il y a très peu de standards réels. Je préférerais presque avoir à apprendre un tout nouveau langage entre Sybase et MySQL pour ne pas confondre les deux conventions.

1
NateDSaint

Je n'aime pas SQL, mais je ne veux pas non plus l'écrire dans le cadre de ce que je développe. Le DAL ne concerne pas la rapidité de mise sur le marché - en fait, je n'ai jamais pensé qu'il y aurait une implémentation DAL qui serait plus rapide que les requêtes directes à partir du code. Mais le but du DAL est de résumé. L'abstraction a un coût, et c'est là qu'elle prendra plus de temps à mettre en œuvre.

Cependant, les avantages sont énormes. Écrire des tests natifs autour du code, en utilisant des classes expressives, des ensembles de données fortement typés, etc. Nous utilisons une sorte de "DAL", qui est une implémentation DDD pure utilisant des génériques en C #. Nous avons donc des référentiels génériques, des implémentations d'unité d'oeuvre (transactions basées sur le code) et une séparation logique. Nous pouvons faire des choses comme simuler nos ensembles de données avec peu d'effort et réellement développer avant les implémentations de base de données. Il y avait un coût initial dans la construction d'un tel cadre, mais il est très agréable que la logique commerciale soit à nouveau la star de l'émission. Nous consommons maintenant les données en tant que ressource et les traitons dans le langage que nous utilisons nativement dans le code. Un avantage supplémentaire de cette approche est la séparation claire qu'elle offre. Par exemple, je ne vois plus de requête de base de données dans une page Web. Oui, cette page a besoin de données. Oui, la base de données est impliquée. Mais maintenant, peu importe d'où je tire des données, il y a un (et un seul) endroit où aller dans le code et le trouver. Peut-être pas grand-chose sur des projets plus petits, mais lorsque vous avez des centaines de pages dans un site ou des dizaines de fenêtres dans une application de bureau, vous pouvez vraiment l'apprécier.

En tant que développeur, j'ai été embauché pour mettre en œuvre les exigences de l'entreprise en utilisant mes compétences logiques et analytiques - et notre mise en œuvre du cadre me permet d'être plus productif maintenant. En tant que manager, je préférerais que mes développeurs utilisent leurs compétences logiques et analytiques pour résoudre des problèmes plutôt que pour écrire du SQL. Le fait que nous puissions construire une application entière qui utilise la base de données sans l'avoir jusqu'à la fin du cycle de développement est une belle chose. Il n'est pas destiné à frapper les professionnels des bases de données. Parfois, une implémentation de base de données est plus complexe que la solution. SQL (et dans notre cas, les vues et les processus stockés en particulier) sont un point d'abstraction où le code peut consommer des données en tant que service. Dans les magasins où il y a une séparation nette entre les équipes de données et de développement, cela aide à éliminer le fait de rester assis dans un modèle d'attente en attendant la mise en œuvre et les modifications de la base de données. Les développeurs peuvent se concentrer sur le domaine problématique sans survoler un DBA et le DBA peut se concentrer sur la mise en œuvre correcte sans qu'un développeur en ait besoin en ce moment.

0
Joseph Ferris

De nombreux articles ici semblent soutenir que SQL est mauvais car il n'a pas de fonctionnalités "d'optimisation de code" et que vous n'avez aucun contrôle sur les plans d'exécution.

Les moteurs SQL sont bons pour proposer un plan d'exécution pour une instruction écrite, orienté vers le données, le réel conten. Si vous souhaitez jeter un coup d'œil au-delà de la programmation, vous constaterez qu'il y a plus de données que d'octets transmis entre les niveaux d'application.

0
adriaan