À l'aide d'un ORM ou de la plaine SQL?
Pour certaines des applications que j'ai développées (ensuite procédé à l'oublier), j'ai écrit plaine SQL, principalement pour MySQL. Si j'ai utilisé Orm en python comme SQLAlchemy, je ne colle pas avec eux pour longtemps. Généralement, c'était soit de la documentation ou de la complexité (de mon point de vue) me retient.
Je le vois comme ceci: utiliser un ORM pour la portabilité, la plaine SQL si c'est juste aller à l'aide d'un type de base de données. Je suis vraiment à la recherche pour obtenir des conseils sur quand utiliser un ORM ou SQL lors du développement d'une application qui a besoin de soutien de base de données.
De réflexion à ce sujet, il serait de loin préférable d'utiliser un léger wrapper pour gérer les incohérences de la base de données au lieu d'utiliser un ORM.
- La normalisation, de la sécurité, de la maintenabilité, la langue de l'abstraction, SEC, etc.
- Performance avec ORM peut être près de SQL, dépend si vous l'utilisez correctement et avec les paramètres corrects... Voir ho pour faire EF6.x 5x plus rapide: linkedin.com/pulse/...
- Pour l'ORM de l'architecture et de la procédure (à éviter), voici mon lien: linkedin.com/pulse/...
Vous devez vous connecter pour publier un commentaire.
Orm ont quelques fonctionnalités intéressantes. Ils peuvent manipuler la plupart du chien de travail de la copie de la base de données des colonnes de champs d'objet. Ils ont l'habitude de manipuler la conversion de la langue, de la date et de l'heure des types de base de données approprié type. Ils prennent généralement en charge d'un-à-plusieurs liens assez élégamment ainsi par l'instanciation des objets imbriqués. J'ai trouvé, si vous la conception de votre base de données avec les forces et les faiblesses de l'ORM à l'esprit, il permet d'économiser beaucoup de travail dans l'obtention des données de la base de données. (Vous aurez envie de savoir comment il gère le polymorphisme et plusieurs-à-plusieurs liens si vous avez besoin de la carte ces. Ce sont ces deux domaines qui fournissent la plupart de l' 'adaptation d'impédance" qui donne à certains l'appellent ORM le "vietnam de l'informatique'.)
Pour les applications transactionnelles, c'est à dire vous faites une demande, obtenir des objets, de les traverser pour obtenir certaines données et l'afficher sur une page Web, le rendement de l'impôt est faible, et dans de nombreux cas, ORM peut être plus rapide, car il cache les objets qu'il a vus avant, qui, autrement, aurait interrogé la base de données à de multiples reprises.
Pour les applications de reporting-lourds, ou de traiter avec un grand nombre de lignes de la base de données par demande, l'ORM de l'impôt est beaucoup plus lourd, et la mise en cache qu'ils ne se transforme en gros, inutile de la mémoire-monopolisant fardeau. Dans ce cas, de simples SQL cartographie (LinQ ou iBatis) ou codés à la main des requêtes SQL dans une mince couche DAL est le chemin à parcourir.
Que j'ai trouvé pour toute application à grande échelle, vous trouverez vous-même en utilisant les deux approches. (ORM pour la simple CRUD et SQL/mince DAL pour le reporting).
Parlant comme quelqu'un qui a passé un peu de temps de travail avec JPA (Java Persistence API), en gros le normalisée ORM API pour Java/J2EE/EJB), qui comprend Hibernate, EclipseLink, Toplink, OpenJPA et les autres, je vais partager certaines de mes observations.
Il y a un autre problème qui prend un peu plus d'explication.
Le modèle traditionnel d'une application Web est d'avoir une couche de persistance et d'une couche de présentation (éventuellement avec un des services ou d'autres couches entre les deux mais ce sont les deux grands pour cette discussion). Orm force rigide à partir de votre couche de persistance jusqu'à la couche de présentation (c'est à dire votre entités).
L'un des critiques de plus de matières premières SQL méthodes est que vous vous retrouvez avec tous ces VOs (des objets de valeur) ou de l'Otd (objets de transfert de données) qui sont utilisés par tout simplement une requête. C'est présenté comme un avantage de l'Orm parce que vous vous débarrasser de cela.
Chose, c'est que ces problèmes ne disparaissent pas avec le Orm, ils ont simplement se déplacer jusqu'à la couche de présentation. Au lieu de créer VOs/Otd pour les requêtes, vous créez des objets de présentation, habituellement un pour chaque vue. Comment est-ce mieux? À mon humble avis il n'est pas.
J'ai écrit à ce sujet dans L'ORM ou SQL: Sommes-nous encore là?.
Mon persistance de la technologie de choix (en Java) ces jours-ci est ibatis. C'est un assez mince wrapper autour de SQL qui fait 90%+ de ce JPA peut le faire (il peut même effectuer le chargement différé des relations bien que ses pas bien documenté), mais avec beaucoup moins de frais généraux (en termes de complexité et de code).
Ce est venu l'année dernière dans une application GWT j'ai écrit. Beaucoup de traductions à partir de EclipseLink à la présentation des objets dans la mise en œuvre des services. Si nous étions à l'aide de ibatis, il aurait été beaucoup plus simple de créer des objets avec ibatis, puis à les transmettre à tous le chemin vers le haut et le bas de la pile. Certains puristes diront ce qui est Mauvais™. Peut-être (en théorie), mais je peux vous dire qu': il aurait conduit à simplifier le code, une simple pile et plus de productivité.
Je dis plaine SQL pour Reads, ORM pour CUD.
La Performance est quelque chose que je suis toujours inquiète, spécialement dans les applications web, mais aussi code de la maintenabilité et de la lisibilité. Pour répondre à ces questions, j'ai écrit SqlBuilder.
ORM n'est pas seulement la portabilité (qui est un peu difficile à atteindre, même avec l'Orm, d'ailleurs). Ce qu'il vous donne est au fond une couche d'abstraction au-dessus d'un magasin persistant, lorsqu'un outil ORM vous libère de l'écriture standard des requêtes SQL (choisit par PK ou par des prédicats, des insertions, des mises à jour et suppressions) et vous permet de vous concentrer sur le domaine du problème.
Toute respectable design auront besoin d'un peu d'abstraction de la base de données, juste pour gérer la différence d'impédance. Mais le plus simple de la première étape (et suffisant pour la plupart des cas) je m'attends à ce serait un DAL, pas un poids lourd de l'ORM. Vos seules options ne sont pas ceux aux extrémités du spectre.
MODIFIER en réponse à un commentaire me demandant de décrire comment je distingue DAL de l'ORM:
Un DAL est ce que vous écrivez vous-même, peut-être à partir d'une classe qui simplement encapsule un tableau et les cartes de ses champs de propriétés. Un ORM est un code que vous n'avez pas à écrire ou mécanismes d'abstraction déduit à partir d'autres propriétés de votre sgbd schéma, surtout PKs et FKs. (C'est là que vous trouvez si la détection automatique des abstractions de commencer à se qui fuit ou pas. Je préfère les informer de manière intentionnelle, mais c'est peut être juste ma préférence personnelle).
Chaque outil a son but et la vision. J'ai créé http://www.jooq.org/ exactement à vos besoins, mais iBatis est sans doute une bonne solution pour vous.
jOOQ a base ORM de fonctionnalités, mais il se concentre principalement sur les choses que je suppose que la plupart des développeurs ont le plus besoin, en essayant de trouver le meilleur ORM pour répondre à leurs besoins:
Mais souvent ils vont trop loin et de fournir autant d'abstraction, vous ne pensez pas qu'ils sont en cours d'exécution contre un SGBDR. D'autre part, vous avez choisi un SGBDR, précisément parce
jOOQ adresses exactement ces points. Il effectuera ainsi que JDBC, mais sans la douleur.
La clé qui fait mon ORM utiliser vraiment mouche a été la génération de code. Je suis d'accord que l'ORM itinéraire n'est pas le plus rapide, dans le code du rendement. Mais quand vous avez un de taille moyenne à grande équipe, la DB est en train de changer rapidement la capacité de régénérer les classes et les mappages de la DB en tant que partie du processus de création est quelque chose de brillant pour les yeux, surtout lorsque vous utilisez l'IC. Si votre code ne peuvent pas être les plus rapides, mais votre code sera - je sais que je prendrais dans la plupart des projets.
Ma recommandation est de développer à l'aide d'un ORM, tandis que le Schéma est toujours fluide, l'utilisation de profilage pour trouver les goulots d'étranglement, puis régler les zones qui en ont besoin à l'aide de matières Sql.
Une autre pensée, la mise en cache intégré dans Hibernate peut souvent faire une énorme performance des améliorations, si utilisé dans le droit chemin. Pas plus revenir à la bd à lire les données de référence.
Dilemme de savoir si l'utilisation d'un cadre ou pas, c'est assez courant à l'époque moderne, le développement de logiciels scénario.
Ce qui est important à comprendre est que chaque cadre ou la méthode a ses avantages et inconvénients - par exemple, dans notre expérience, nous avons constaté que l'ORM est utile pour le traitement des transactions c'est à dire insérer/mettre à jour/supprimer des opérations - mais quand il s'agit de récupérer les données avec des résultats complexes, il devient important d'évaluer les performances et l'efficacité de l'outil ORM.
Il est également important de comprendre qu'il n'est pas obligatoire de sélectionner un cadre ou d'une démarche et de mettre en œuvre tout ce que. Ce que nous voulons dire par là c'est que nous pouvons avoir de mélange de l'ORM et natif du langage de requête. De nombreux frameworks ORM donner des points d'extension pour plugin en SQL natif. Nous devrions essayer de ne pas trop utiliser un framework ou une approche. Nous pouvons combiner certains cadres ou des approches et venir avec la solution appropriée.
Vous pouvez utiliser l'ORM quand il s'agit de l'insertion, mise à jour, suppression, gestion des versions avec un haut niveau de simultanéité et vous pouvez utiliser SQL Natif de génération de rapport et la longue liste
Il n'y a pas "un-outil-fits-all solution, et c'est aussi vrai pour la question" dois-je utiliser un ou/m ou pas ? '.
Je dirais: si vous devez écrire une demande/un outil qui est très "données", sans beaucoup de logique, alors que je 'd utiliser du SQL, depuis SQL est le domaine spécifique de la langue pour ce genre d'applications.
D'autre part, si je devais écrire une entreprise/entreprise de l'application qui contient beaucoup de "domaine" de la logique, alors je ferais un riche modèle de classe qui pourrait exprimer ce domaine dans le code. Dans de tels cas, une OU/M mappeur pourrait être très utile pour réussir à le faire, comme il prend beaucoup de code de plomberie de vos mains.
Je sais que cette question est très vieux, mais j'ai pensé que je poste une réponse dans le cas où quelqu'un vient à travers comme moi. Orm ont parcouru un long chemin. Certains d'entre eux vous offrir le meilleur des deux mondes: rendre le développement plus productif et le maintien de la performance.
Regardez de Données SQL (http://sqldata.codeplex.com). C'est un très léger ORM pour c# qui couvre toutes les bases.
Pour info, je suis l'auteur de Données SQL.
L'une des applications que j'ai développé est un bot IRC écrit en python. Les modules qu'il utilise exécuter dans des threads séparés, mais je n'ai pas trouvé un moyen de gérer le filetage lors de l'utilisation de sqlite. Cependant, que peut-être mieux pour une question distincte.
Faut vraiment que j'ai juste reformulé de manière à la fois le titre et la question. Je ne l'ai jamais utilisé un DAL avant, dans n'importe quelle langue.
Utiliser un ORM qui fonctionne comme SQL, mais fournit des contrôles de compilation et de sécurité de type. Comme mon préféré: Données Objets De Connaissance (divulgation: je l'ai écrit)
Par exemple:
En streaming. Facile à mettre en place (pas de mappages à définir - lit dans vos schémas existants). Prend en charge les jointures, les transactions, l'intérieur des requêtes, l'agrégation, etc. À peu près tout, vous pouvez le faire en SQL. Et il a été prouvé que d'énormes ensembles de données (séries temporelles financières) tout le chemin vers le bas pour trivial (Android).
Je voudrais ajouter ma voix au chœur de réponses que de dire "Il y a un juste milieu!".
À un programmeur d'application, le SQL est un mélange de choses que vous pourriez vouloir de contrôle et de choses que vous avez presque certainement ne voulez pas être dérangé contrôle.
Ce que j'ai toujours voulu une couche (appelons-DAL, ORM, ou micro-ORM, je n'ai pas l'esprit) qui en aura la charge de l'complètement prévisible des décisions (comment orthographier les mots-clés SQL, où les parenthèses aller, quand à inventer des alias de colonnes, les colonnes pour créer une classe qui contient les deux flotteurs et un int ...), tout en me laissant en charge de la hausse du niveau des aspects du SQL, c'est à dire comment arranger les Jointures, côté serveur de calculs DISTINCTs, GROUPE de Voitures, des sous-requêtes scalaires, etc.
J'ai donc écrit quelque chose qui fait cela: http://quince-lib.com/
C'est pour le C++: je ne sais pas si c'est la langue que vous utilisez, mais tout de même il pourrait être intéressant de voir ce prendre sur ce qu'est un "terrain d'entente" pourrait ressembler.