Qu'est-ce qu'un ORM, comment fonctionne-t-il et comment dois-je en utiliser un? [fermé]


230

Quelqu'un m'a suggéré d'utiliser un ORM pour un projet que je conçois, mais j'ai du mal à trouver des informations sur ce qu'il est ou comment il fonctionne.

Quelqu'un peut-il me donner une brève explication de ce qu'est un ORM et comment il fonctionne et comment je devrais commencer à en utiliser un?


8
J'ai trouvé cette question mais elle date de 2009 et je ne sais pas si vous maîtrisez déjà ORM mais recherchez Entity Framework dans CodePlex C # ( entityframework.codeplex.com ) Voici le code source dont vous pouvez tirer des leçons. Vous pouvez également lire ceci. ( dbtechnet.org/labs/dae_lab/Orm.pdf )
Maximus Decimus

1
Je veux juste souligner que la came ORM est également liée à la modélisation de rôle d' objet en.wikipedia.org/wiki/Object-role_modeling
O-9

1
C'est une question utile et les votes pour la meilleure réponse semblent le confirmer. Une brève description de ce qu'est l'ORM ne nécessite pas d'opinion. Juste parce que l'utilisateur demande un lien pour commencer, la question est signalée hors sujet. Je pense que c'est une sur-réaction fréquente des modérateurs.
NeilG

3
@NeilG Une question fermée signifie que la question est hors sujet. Il pourrait y avoir des informations utiles dans les réponses, mais cela ne rend pas la question sur le sujet. De plus, il ne sera pas supprimé, il restera ici, mais nous devons toujours garder le SO propre et sur le sujet pour qu'il fonctionne au mieux. Donc, pour répondre à votre premier commentaire: Ce n'est pas une question utile, il y a des réponses utiles.
M--

1
@NeilG Le problème est que la question comprend une demande de ressources (à la fois dans le titre et dans la question). De telles demandes sont hors sujet, en grande partie parce que les gens ne font que publier un lien vers leur ressource préférée, comme cela s'est produit dans plusieurs des réponses ici. La suppression de la demande de ressources de la question invaliderait certaines réponses existantes. En tant qu'utilisateurs réguliers, nous ne sommes pas autorisés à modifier la question pour invalider les réponses. Il devrait donc être fermé. Si la question est restée sans réponse, elle pourrait être modifiée pour supprimer ces demandes et laissée ouverte.
Makyen

Réponses:


483

introduction

Le mappage relationnel objet (ORM) est une technique qui vous permet d'interroger et de manipuler les données d'une base de données à l'aide d'un paradigme orienté objet. Quand on parle d'ORM, la plupart des gens font référence à une bibliothèque qui implémente la technique de mappage relationnel-objet, d'où l'expression "un ORM".

Une bibliothèque ORM est une bibliothèque tout à fait ordinaire écrite dans la langue de votre choix qui encapsule le code nécessaire pour manipuler les données, donc vous n'utilisez plus SQL; vous interagissez directement avec un objet dans la même langue que vous utilisez.

Par exemple, voici un cas complètement imaginaire avec un pseudo langage:

Vous avez un cours de lecture, vous souhaitez récupérer tous les livres dont l'auteur est "Linus". Manuellement, vous feriez quelque chose comme ça:

book_list = new List();
sql = "SELECT book FROM library WHERE author = 'Linus'";
data = query(sql); // I over simplify ...
while (row = data.next())
{
     book = new Book();
     book.setAuthor(row.get('author');
     book_list.add(book);
}

Avec une bibliothèque ORM, cela ressemblerait à ceci:

book_list = BookTable.query(author="Linus");

La partie mécanique est prise en charge automatiquement via la bibliothèque ORM.

Avantages et inconvénients

L'utilisation d'ORM fait gagner beaucoup de temps car:

  • SEC : Vous écrivez votre modèle de données en un seul endroit et il est plus facile de mettre à jour, de maintenir et de réutiliser le code.
  • Beaucoup de choses se font automatiquement, de la gestion de la base de données à l' I18N .
  • Cela vous oblige à écrire du code MVC , ce qui rend finalement votre code un peu plus propre.
  • Vous n'avez pas besoin d'écrire du SQL mal formé (la plupart des programmeurs Web sont vraiment nulles, car SQL est traité comme un "sous" langage, alors qu'en réalité c'est un langage très puissant et complexe).
  • Désinfection; utiliser des relevés ou des transactions préparés est aussi simple que d'appeler une méthode.

L'utilisation d'une bibliothèque ORM est plus flexible car:

  • Il s'inscrit dans votre façon naturelle de coder (c'est votre langue!).
  • Il résume le système DB, vous pouvez donc le modifier quand vous le souhaitez.
  • Le modèle est faiblement lié au reste de l'application, vous pouvez donc le modifier ou l'utiliser ailleurs.
  • Il vous permet d'utiliser la qualité OOP comme l'héritage de données sans mal de tête.

Mais l'ORM peut être une douleur:

  • Vous devez l'apprendre, et les bibliothèques ORM ne sont pas des outils légers;
  • Vous devez le configurer. Même problème.
  • Les performances sont bonnes pour les requêtes habituelles, mais un maître SQL fera toujours mieux avec son propre SQL pour les grands projets.
  • Il résume la DB. Bien que ce soit correct si vous savez ce qui se passe derrière la scène, c'est un piège pour les nouveaux programmeurs qui peuvent écrire des déclarations très gourmandes, comme un coup lourd dans une forboucle.

Comment en savoir plus sur ORM?

Eh bien, utilisez-en un. Quelle que soit la bibliothèque ORM que vous choisissez, elles utilisent toutes les mêmes principes. Il y a beaucoup de bibliothèques ORM ici:

Si vous voulez essayer une bibliothèque ORM en programmation Web, vous feriez mieux d'utiliser une pile de framework entière comme:

  • Symfony (PHP, utilisant Propel ou Doctrine).
  • Django (Python, utilisant un ORM interne).

N'essayez pas d'écrire votre propre ORM, sauf si vous essayez d'apprendre quelque chose. Il s'agit d'un travail gigantesque, et les anciens ont pris beaucoup de temps et de travail avant de devenir fiables.


50

Quelqu'un peut-il me donner une brève explication ...

Sûr.

ORM signifie "Object to Relational Mapping" où

  • La partie Object est celle que vous utilisez avec votre langage de programmation (python dans ce cas)

  • La partie relationnelle est un système de gestionnaire de bases de données relationnelles (une base de données qui existe), il existe d'autres types de bases de données, mais la plus populaire est relationnelle (vous connaissez les tables, les colonnes, le pk fk, etc., par exemple Oracle MySQL, MS-SQL)

  • Et enfin, la partie Mapping est l'endroit où vous faites un pont entre vos objets et vos tables.

Dans les applications où vous n'utilisez pas de framework ORM, vous le faites à la main. L'utilisation d'un cadre ORM vous permettrait de réduire le passe-partout nécessaire pour créer la solution.

Disons donc que vous avez cet objet.

 class Employee:
      def __init__( self, name ): 
          self.__name = name

       def getName( self ):
           return self.__name

       #etc.

et la table

   create table employee(
          name varcar(10),
          -- etc  
    )

L'utilisation d'un cadre ORM vous permettrait de mapper cet objet avec un enregistrement db automatiquement et d'écrire quelque chose comme:

   emp = Employee("Ryan")

   orm.save( emp )

Et faites insérer l'employé dans la BD.

Oups, ce n'était pas si bref, mais j'espère que c'est assez simple pour attraper d'autres articles que vous lisez.



4

Comme tous les acronymes, il est ambigu, mais je suppose qu'ils signifient un mappeur objet-relationnel - un moyen de couvrir vos yeux et de faire croire qu'il n'y a pas de SQL en dessous, mais plutôt que ce sont tous des objets ;-). Pas vraiment vrai, bien sûr, et non sans problèmes - le toujours coloré Jeff Atwood a décrit ORM comme le Vietnam de CS ;-). Mais, si vous connaissez peu ou pas de SQL, et avez un problème assez simple / à petite échelle, ils peuvent vous faire gagner du temps! -)


2

Le modèle objet s'intéresse aux trois concepts suivants Héritage d'encapsulation d'abstraction de données Le modèle relationnel a utilisé le concept de base d'une relation ou d'une table. Les produits de mappage relationnel objet (OR mapping) intègrent les capacités du langage de programmation objet aux bases de données relationnelles.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.