Pourquoi, oh pourquoi, est l'industrie, de sorte attaché à cette catastrophe d'un concept? Aucune des réponses précédentes de manière adéquate les adresses @johnny préoccupations. Ils sont tous à moitié cuit à la main en agitant les justifications qui steer claire des problèmes concrets, en face de la base de données programmeurs.
@TheTXI la réponse est typique des réponses que je reçois quand vous posez la même question: la séparation des couches. Qu'est ce que ça veut dire? Pourquoi ai-je envie de séparer mes couches? Ou, plus précisément, comment peut-elle m'être utile pour créer une couche supplémentaire qui est différente de la structure relationnelle de la couche et qui pourtant est censé être une représentation canonique de la cartographie à partir de cette couche?
En outre, (@johhny's encore sans réponse point) comment est-ce à nous protéger de changement? Si les modifications de base de données, la couche ORM va presque certainement à suivre. En fait, la valeur par défaut en matière de modélisation des tables de jointure au niveau de l'objet cela rend encore pire, parce que quand la table s'accroît inévitablement certaines colonnes supplémentaires, vous n'avez pas seulement ajouter quelques champs supplémentaires dans le modèle objet, mais vous pouvez également changer sa topologie et de la force d'un tas de réécriture du code! C'est une catastrophe pour la gestion du changement et est un exemple classique de la façon dont une vision erronée de relations (en pensant qu'ils représentent des objets) tribunaux de catastrophe. Ce ne serait tout simplement pas eu lieu si vous venez de connecter la base de données relationnelle directement dans l'harmonie des notions en langage de programmation (pensez à LINQ-to-SQL, et pas de LINQ-to-EF).
La plus grande question sans réponse dans cet espace — l'éléphant dans la pièce — est: ce problème est ORM censé être des problèmes? Et ne pas dire un "objet-relationnelles, d'adaptation d'impédance". C'est juste un autre à la main en agitant fob-off. Expliquer pourquoi il y a une différence d'impédance, et pourquoi il devrait être à la base de données qui vient de la langue plutôt que de la langue va de la base de données. Mon explication est que la plupart des langages de programmation sucer à exprimer et à travailler avec des données relationnelles, mais que c'est une réalité historique qui est en train de glisser loin (LINQ-to-SQL a été le premier bébé-étape dans cette direction), pas un principe fondamental sur lequel la base de son architecture.
Il ya une raison que les Orm sont devenues tellement complexes, avec lazy-loading, la mise en cache, un nombre ahurissant de la persistance et de la sémantique de propriété, etc. Et il ya une raison que pour le pilonnant sur le clavier, ils ne parviennent toujours pas à résoudre efficacement les problèmes de base comme, "où des paires de membres partagent plus d'un groupe?" Le modèle relationnel a été conçu à une époque où le réseau et hiérarchique modèles de flambement à genoux sous le poids de ces problèmes; c'était une bouffée d'air frais. Maintenant que nous semblons tous aspirent à revenir à notre ancien bac à sable plein de chat-pipi, et nous pensons que nous avons inventé quelque chose de nouveau (tant que nous nous accrochons notre nez).
(Je m'attends à être généreusement bas-voté sur cette réponse. Mais s'il vous plaît laissez un commentaire lorsque vous le faites. Je n'ai pas l'esprit dit que je me trompe, tant que je sais pourquoi.)
EDIT: Merci @Chris pour prendre le temps de commenter. Il me donne quelques points concrets à l'adresse... (Note que bien que j'ai souvent l'adresse @Chris-dessous, je n'essaie pas de le prendre à tâche spécifique; ses réponses sont typiques de ce genre de commentaires que j'entends tout le temps au moment de discuter de ce sujet. Donc j'espère qu'il ne prend pas mes critiques comme un affront personnel; ils ne sont pas conçus de cette façon, et je n'ai vraiment apprécier le temps qu'il a fallu pour répondre.)
Tout d'abord, permettez-moi de dissiper certaines idées fausses évident dans @Chris de commentaires et de répondre.
- Je ne préconise pas de raw SQL dans le code, pour les raisons évidentes, et certains ne sont pas si évidents (par exemple, SQL est ni l'algèbre, ni d'un calcul, ce qui rend la décomposition fonctionnelle pratiquement impossible).
- Je ne préconise pas monolithique de la conception de l'application. Les couches sont, en général, une bonne chose.
- Je ne préconise pas de polluer les modèles d'objet avec beaucoup de bruit sur la ligne, comme les champs, les méthodes et attributs. Franchement, cependant, c'est un strawman, depuis de domaine/objet de modèles n'existent que dans l'ORM univers. Maintenant, je sais que LINQ-to-SQL a toutes ces classes avec beaucoup de noisy bits en eux, mais ils sont juste derrière-le-scènes de la plomberie, vous n'avez pas modifier ce code, et en général, vous ne devriez même pas le regarder.
Maintenant quelques objections les objections:
- L'affirmation que les applications peuvent être construits de façon indépendante de la base de données n'est pas fondé. En gros, les Formulaires sont à seulement canonique de la cartographie sur la couche de données (Tables de Foo et Bar deviennent des classes de Foo et Bar et d'une table de FooBar devient une sorte de torride aventure entre les classes Foo et Bar). Il n'y a pas beaucoup de marge de manœuvre dans ce travail de cartographie, de sorte que tout changement dans le modèle de données sera presque certainement besoin d'un changement correspondant au modèle de l'objet. C'est une bonne chose de mon point de vue, comme un objet qui a radicalement écartée de la base de données correspondante modèle serait rien de plus qu'un entretien supplémentaire des maux de tête pour tous les intéressés.
- Une fois l'illusion que l'Orm engendrer de données-le modèle d'indépendance est rejetée, toutes les protestations sur les maux de couplage direct pour le modèle de données devient sans objet. Mais j'aimerais poursuivre un peu plus loin que de simplement le faire disparaître. Le couplage est une caractéristique essentielle de la conception du système. À un certain point, les décisions et les hypothèses doivent être faites. Vous ne pouvez pas programmer tout en utilisant un seul "Choses" de la table. Vous devez décider que votre domaine contient certains des concepts spécifiques et ensuite créer des schémas et code que le respect de ces concepts, de les traiter comme des citoyens de première classe, le code en dur. L'idée que les demandes doivent être indépendants de la base de données est erronée. La base de données est (ou devrait être) la plus pure représentation de l'entreprise connaissance (je sais que ce n'est pas toujours le cas, et je vais aborder ce sujet plus tard). Le couplage de cette représentation, il faudrait fournir la meilleure garantie de résilience, car un tel modèle de données ne changeront que lorsque l'entreprise elle-même subit quelques changement intrinsèque. En bref, le couplage à un schéma de base de données est une très bonne chose.
- La superposition n'est pas une fin en soi. Il est bon parce qu'il a atteint un objectif. Les développements qui précèdent montrent que la superposition entre la base de données et l'application dans la voie de l'ORM n'est ni efficace, ni nécessaire pour atteindre le but réel de la résilience au changement. Ceci est réalisé grâce à une bonne conception de base de données.
- @Chris affirme que la location de la base de données de dicter les choses contrecarre OO design. C'est assez vrai, mais c'est seulement intéressant si OO conception est la meilleure façon de modéliser la connaissance. L'échec quasi complet de la OODBMSs dans le marché des indices que ce n'est pas le cas. Le modèle relationnel, avec son prédicat logique de fondation, possède le même pouvoir d'expression que OO conception sans encourir la théorie des graphes complexités de OO modèles.
- @Chris nourrissait à l'encontre du modèle relationnel au motif qu'il ne résout pas les problèmes d'aujourd'hui (d'où le mouvement NoSQL) est complètement à côté de la marque. NoSQL signifie "Pas de SQL", non, "Pas de modèle relationnel". Malheureusement, même les partisans de partisans du mouvement NoSQL semblent être tout à fait ignorant en la matière. SQL a de graves défauts, beaucoup de ce qui peut être suivie jusqu'à sa rupture radicale avec le modèle relationnel. Pour dire que nous devons abandonner le modèle relationnel, SQL suce, c'est assez flagrant à jeter le bébé avec l'eau du bain.
- La non-utilisation d'un ORM n'est pas le triple de l'effort de construction d'une application. C'est d'un ridicule demande, et même @Chris semble se tenant l'arrière de la porte ouverte avec un compliment détourné de la codegen alternative. Codegen des outils tels que LINQ-to-SQL sqlmetal sont une solution parfaite pour n'importe qui qui n'est pas attaché à l'dogme que l'application du modèle de données doit absolument être différents à la base de données du modèle de données.
Ma propre expérience avec l'Orm a été qui ils travaillent beaucoup dans les tutoriels et causer de la douleur sans fin et de la frustration dans le monde réel. Avec LINQ-to-SQL de fixation nombre de problèmes qui ont motivé les Orm, en premier lieu, je ne vois aucune raison de me mettre à travers ce genre de torture.
Un problème majeur demeure: la culture actuelle des bases de données SQL n'offre pas significative le degré de contrôle sur la séparation des couches physiques et logiques. La cartographie à partir d'une table de trucs sur le disque est en grande partie fixe et entièrement sous le contrôle de la SQL SGBD. Ce n'était pas une partie du plan pour le modèle relationnel, qui stipule explicitement que la séparation entre les deux, et a permis la définition d'une cohérence logique de représentation de données pouvant être stockées sur le disque dans une structure très différente que ce qui était suggéré par le modèle logique. Par exemple, un système (ou dba) serait libre physiquement denormalise — pour des raisons de performances hautement normalisé modèle logique. Parce que SQL moteurs ne permettent pas cette séparation des préoccupations, il est courant de denormalise ou autrement, la torture, le modèle logique par pure nécessité. En conséquence, les modèles logiques ne peuvent pas toujours être exactement comme ils le devraient, et donc, l'idéal de l'utilisation de la base de données la plus pure représentation de la connaissance ne peut être pleinement réalisé. Dans la pratique, cependant, les concepteurs généralement s'en tenir à un canoniques de cartographie de base de données de modèle de domaine de toute façon, parce que tout le reste est tout simplement trop difficile à maintenir.