web-dev-qa-db-fra.com

Qu'est-ce qu'un ORM, comment ça marche et comment dois-je en utiliser un?

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 son contenu ou son fonctionnement.

Quelqu'un peut-il m'expliquer brièvement ce qu'est un ORM, comment il fonctionne et comment commencer à l'utiliser?

230
Ryan

Introduction

Object-Relational Mapping (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ù la phrase "un ORM".

Une bibliothèque ORM est une bibliothèque complètement ordinaire écrite dans la langue de votre choix et qui encapsule le code nécessaire à la manipulation des données, de sorte que vous n'utilisez plus le code 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 une classe de livre, vous voulez 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 traitée automatiquement via la bibliothèque ORM.

Avantages et inconvénients

L'utilisation de ORM permet de gagner beaucoup de temps car:

  • DRY : vous écrivez votre modèle de données à un seul endroit et il est plus facile de mettre à jour, de maintenir et de réutiliser le code.
  • Beaucoup de choses sont effectuées automatiquement, de la gestion de la base de données à I18N .
  • Cela vous oblige à écrire MVC code, ce qui rend finalement votre code un peu plus propre.
  • Vous n'êtes pas obligé d'écrire du SQL mal formé (la plupart des programmeurs Web sont vraiment nuls, car SQL est traité comme un langage "secondaire", alors qu'en réalité, il s'agit d'un langage très puissant et complexe).
  • Assainissement; L'utilisation d'instructions ou de transactions préparées est aussi simple que d'appeler une méthode.

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

  • Cela correspond à votre façon naturelle de coder (c'est votre langue!).
  • Il résume le système de base de données pour que vous puissiez le changer quand vous voulez.
  • Le modèle est faiblement lié au reste de l'application, vous pouvez donc le modifier ou l'utiliser n'importe où.
  • Il vous permet d’utiliser OOP goodness comme un héritage de données sans mal de tête.

Mais 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 acceptables pour les requêtes usuelles, mais un maître SQL fera toujours mieux avec son propre code SQL pour les grands projets.
  • Il résume la DB. Bien que vous puissiez savoir ce qui se passe en coulisse est acceptable, c'est un piège pour les nouveaux programmeurs qui peuvent écrire des déclarations très gourmandes, comme un gros coup dans une boucle for.

Comment apprendre l'ORM?

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

Si vous souhaitez essayer une bibliothèque ORM en programmation Web, vous feriez mieux d'utiliser une pile de structure complète telle que:

  • 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. C'est un travail gigantesque, et les anciens ont pris beaucoup de temps et de travail avant de devenir fiables.

483
e-satis

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 gestion de base de données relationnelle (une base de données existante). Il existe d'autres types de bases de données, mais la plus populaire est relationnelle (vous connaissez les tables, les colonnes, les fichiers 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 structure ORM, vous le faites à la main. L'utilisation d'un cadre ORM vous permettrait de réduire le nombre de passions nécessaires pour créer la solution.

Alors disons 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'une structure ORM vous permettrait de mapper cet objet avec un enregistrement de base de données automatiquement et d'écrire quelque chose comme:

   emp = Employee("Ryan")

   orm.save( emp )

Et avoir l'employé inséré dans la base de données.

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

50
OscarRyz

Un ORM (Object Relational Mapper) est une pièce/couche de logiciel qui permet de mapper vos objets de code sur votre base de données.

Certains traitent plus d'aspects que d'autres ... mais le but est de supprimer une partie du poids de la couche de données des épaules du développeur.

Voici un bref extrait de Martin Fowler (Data Mapper):

Modèles de mappeurs de données d'architecture d'application d'entreprise

17
Justin Niessner

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

4
Alex Martelli

Le modèle d'objet concerne les trois concepts suivants Héritage de l'encapsulation d'abstraction de données Le modèle relationnel utilisait le concept de base d'une relation ou d'une table. Les produits de mappage OR (Object-Relational Mapping) intègrent les capacités du langage de programmation objet aux bases de données relationnelles.

2
Hamza Riaz

Storm est une excellente option pour ceux qui utilisent python.

2

C'est un sujet énorme. Procurez-vous un bon livre d'hibernation et il devrait expliquer ORM en détail avant de passer à la matière hibernate Nitty Gritty.

https://www.hibernate.org/

2
Stefan Kendall

DALMP http://code.google.com/p/dalmp/ pourrait convenir à php/mysql, qui gère actuellement de nombreux caches dorsaux comme redis/memcache/apc

1
tareco