Question

J'entends souvent dénigrement ORM pour être inflexible et une « abstraction qui fuit », mais vous ne vraiment entend pas pourquoi ils sont problématiques. Lorsqu'ils sont utilisés correctement, quels sont exactement les défauts de ORM? Je demande cela parce que je travaille sur un ORM PHP et je voudrais que pour résoudre des problèmes que beaucoup d'autres ORM échouons, telles que le chargement paresseux et l'absence de sous-requêtes.

S'il vous plaît être précis avec vos réponses. Afficher un code ou de décrire un schéma de base de données où une lutte ORM. Peu importe la langue ou l'ORM.

Était-ce utile?

La solution

L'un des plus gros problèmes que je l'ai remarqué avec tous les ORM j'ai utilisé la mise à jour est seulement quelques champs sans récupérer l'objet premier.

Par exemple, dire que j'ai un objet de projet cartographié dans ma base de données avec les champs suivants: Id, nom, description, owning_user. Dis, par ajax, je veux mettre à jour tout le champ de description. Dans la plupart des ORM la seule façon pour moi de mettre à jour la table de base de données tout en ayant seulement une valeur d'identification et la description est soit récupérer l'objet du projet à partir de la base de données, définissez la description et envoyer l'objet à la base de données (ce qui nécessite deux opérations de base de données juste pour une simple mise à jour) ou de mettre à jour via des procédures stockées (qui est la méthode que je suis actuellement en utilisant).

Autres conseils

vraiment sont des objets et des documents de base de données pas du tout semblable. Ils ont tapé emplacements que vous pouvez stocker des choses, mais c'est à ce sujet. Les bases de données ont une notion complètement différente de l'identité que les langages de programmation. Ils ne peuvent pas manipuler des objets composites, donc vous devez utiliser des tables et des clés étrangères supplémentaires à la place. La plupart ont aucune notion d'héritage de type. Et la façon naturelle de naviguer dans un réseau d'objets (suivre quelques-uns des pointeurs dans un objet, obtenir un autre objet, et déréférencer à nouveau) est beaucoup moins efficace lors de la projection au monde de base de données, parce que vous avez à faire des allers-retours multiples et récupérer beaucoup des données que vous ne se soucient pas.

En d'autres termes: l'abstraction ne peut pas être très bon en premier lieu; il n'est pas les outils ORM qui sont mauvais, mais la métaphore qu'ils mettent en œuvre. Au lieu d'un parfait isomorphisme est seulement une ressemblance superficielle, de sorte que la tâche elle-même est pas une très bonne abstraction. (Il est encore beaucoup plus utile que d'avoir à comprendre les bases de données intimement, cependant. Le mépris des outils ORM viennent principalement de CBM regardant vers le bas sur de simples programmeurs.)

ORM peut également écrire du code qui n'est pas efficace. Étant donné que la performance de base de données est essentielle pour la plupart des systèmes, ils peuvent causer des problèmes qui auraient pu être évités si un être humain a écrit le code (mais qui pourrait ne pas avoir été mieux si l'homme en question ne comprend pas l'optimisation des performances de base de données). Cela est particulièrement vrai lorsque l'interrogation devient complexe.

Je pense que mon plus gros problème avec eux est bien qu'en faisant abstraction des détails, les programmeurs juniors obtiennent moins de compréhension de la façon d'écrire des requêtes dont ils ont besoin pour être en mesure de gérer les cas de pointe et les endroits où l'ORM écrit vraiment mauvais code. Il est vraiment difficile d'apprendre les choses avancées quand on n'a jamais eu à comprendre les bases. Un ORM entre les mains de quelqu'un qui comprend et rejoint le groupe par et d'interrogation avancées est une bonne chose. Dans les mains de quelqu'un qui ne comprend pas l'algèbre booléenne et rejoint et un tas d'autres concepts SQL de base, il est une très mauvaise chose résultant dans la conception très mauvaise base de données et les requêtes.

Bases de données relationnelles ne sont pas des objets et ne doivent pas être traités comme tels. Essayer de faire un aigle dans un sac à main en soie est généralement pas réussi. Il vaut bien mieux d'apprendre ce que l'aigle est bon et pourquoi et laisser l'aigle voler que d'avoir une mauvaise bourse et un aigle mort.

La façon dont je le vois est comme ça. Pour utiliser un ORM, vous devez empiler généralement plusieurs fonctions php, puis vous connecter à une base de données et essentiellement encore exécuter une requête MySQL ou quelque chose de similaire.

Pourquoi tous l'abstraction entre le code et la base de données? Pourquoi ne pouvons-nous utiliser tout ce que nous savons déjà? Généralement, un dev web connaît leur langue backend, leur langue db (une sorte de SQL), et une sorte de langues frontend, comme html, css, js, etc ...

En substance, nous essayons d'ajouter une couche d'abstraction qui comprend de nombreuses fonctions (et nous savons tous fonctions php peut être plus lent que l'attribution d'une variable). Oui, c'est un calcul micro, mais encore, il ajoute.

Non seulement nous avons maintenant plusieurs fonctions à traverser, mais nous devons aussi apprendre la façon dont fonctionne ORM, donc il y a un certain temps perdu là-bas. Je pensais que l'idée de la séparation du code a été de garder votre code distinct à tous les niveaux. Si vous êtes dans le monde LAMP, il suffit de créer votre requête (vous devez savoir MySQL) et utiliser la fonctionnalité php déjà existant pour les commandes préparées. FAIT!

WAY LAMP:

  • Créer une requête (string);
  • utiliser mysqli préparé les états et récupérer des données dans un tableau.

ORM WAY:

  • exécuter une fonction qui obtient l'entité
  • qui exécute une requête MySQL
  • exécuter une autre fonction qui ajoute une condition
  • exécuter une autre fonction qui ajoute une autre condition
  • exécuter une autre fonction qui rejoint
  • exécuter une autre fonction qui ajoute conditionals sur la jointure
  • exécuter une autre fonction qui prépare
  • exécute une autre requête MySQL
  • exécuter une autre fonction qui va chercher les données
  • exécute une autre MySQL Query

Quelqu'un d'autre a un problème avec la pile ORM? Pourquoi sommes-nous devenions ces développeurs paresseux? Ou si créatif que nous nuire à notre code? Si ce n'est pas cassé ne le répare pas. À son tour, fixer votre équipe de développement pour comprendre les bases de dev web.

ORM tentent de résoudre un problème très complexe. Il y a des cas bord à gogo et des grands compromis de conception sans solutions claires ou évidentes. Lorsque vous optimisez une conception ORM pour la situation A, vous faites par nature il est gênant pour résoudre la situation B.

Il y a ORM qui gèrent le chargement paresseux et les sous-requêtes d'une manière « assez bon », mais il est presque impossible d'obtenir de « assez bon » à « excellent ».

Lors de la conception de votre ORM, vous devez avoir une assez bonne sur toute la base de données maladroite possible conçoit votre ORM sera appelé à gérer. Vous devez faire explicitement des compromis dans quelles situations vous êtes prêt à gérer gauchement.

Je ne regarde pas ORM inflexibles ou plus qui fuient que votre abstraction complexe moyenne. Cela dit, certains ORM sont mieux que d'autres à ces égards.

Bonne chance de réinventer la roue.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top