web-dev-qa-db-fra.com

Qu'est-ce qu'un cadre de correspondance objet-relationnel?

Comme le titre l'indique; qu'est-ce qu'un cadre ORM et à quoi sert-il?

80
RCIX

De wikipedia :

Le mappage relationnel-objet (mappage ORM, O/RM et O/R) dans les logiciels informatiques est une technique de programmation pour convertir des données entre des systèmes de type incompatibles dans des bases de données relationnelles et des langages de programmation orientés objet. Cela crée, en effet, une "base de données d'objets virtuels" qui peut être utilisée à partir du langage de programmation. Il existe des packages gratuits et commerciaux qui effectuent le mappage relationnel-objet, bien que certains programmeurs choisissent de créer leurs propres outils ORM.

C'est bon pour extraire le magasin de données (fichier plat/SQL/quoi que ce soit) afin de fournir une interface qui peut être utilisée dans votre code. Par exemple, (dans Rails) au lieu de construire SQL pour trouver le premier utilisateur dans une table d'utilisateurs, nous pourrions faire ceci:

User.first

Ce qui nous retournerait une instance de notre modèle utilisateur, avec les attributs du premier utilisateur dans la table des utilisateurs.

47
Codebeef

Une réponse simple est que vous encapsulez vos tables ou procédures stockées dans des classes de votre langage de programmation, de sorte qu'au lieu d'écrire des instructions SQL pour interagir avec votre base de données, vous utilisez des méthodes et des propriétés d'objets.

En d'autres termes, au lieu de quelque chose comme ça:

String sql = "SELECT ... FROM persons WHERE id = 10"
DbCommand cmd = new DbCommand(connection, sql);
Result res = cmd.Execute();
String name = res[0]["FIRST_NAME"];

vous faites quelque chose comme ça:

Person p = repository.GetPerson(10);
String name = p.FirstName;

ou du code similaire (beaucoup de variantes ici.) Certains frameworks mettent également une grande partie du code en tant que méthodes statiques sur les classes elles-mêmes, ce qui signifie que vous pouvez faire quelque chose comme ceci à la place:

Person p = Person.Get(10);

Certains implémentent également des systèmes de requête complexes, vous pouvez donc le faire:

Person p = Person.Get(Person.Properties.Id == 10);

Le cadre est ce qui rend ce code possible.

Maintenant, des avantages. Tout d'abord, vous cachez le SQL loin de votre code logique. Cela a l'avantage de vous permettre de prendre en charge plus facilement plus de moteurs de base de données. Par exemple, MS SQL Server et Oracle ont des noms différents sur les fonctions typiques et différentes façons de faire des calculs avec des dates, donc une requête pour "me faire éditer toutes les personnes au cours des dernières 24 heures" pourrait impliquer une syntaxe SQL différente uniquement pour ces deux moteurs de base de données . Cette différence peut être supprimée de votre code logique.

De plus, vous pouvez vous concentrer sur l'écriture de la logique, au lieu d'obtenir le bon SQL. Le code sera généralement plus lisible également, car il ne contient pas toute la "plomberie" nécessaire pour parler à la base de données.

251

Les bases de données fonctionnent généralement sur un modèle relationnel: vous avez des tables (simplifiant: comme une feuille de calcul), et les relations entre elles - un à un, un à plusieurs, plusieurs à plusieurs, etc., ce qui signifie par exemple qu'un enregistrement dans le tableau A a de nombreux enregistrements associés dans le tableau B. Vous pouvez en extraire des données sous forme de lignes (collection de valeurs représentant les lignes du tableau/des tableaux) Plus dans wikipedia .

Les langages de programmation modernes utilisent un modèle objet. Les objets ont des méthodes, des attributs (simples ou complexes), etc.

Le logiciel ORM effectue une transition entre ces modèles. Par exemple, il place tous les enregistrements liés de la table B dans un attribut de l'objet A. Ce type de logiciel facilite l'utilisation des bases de données relationnelles (type le plus populaire) avec les langages de programmation d'objets.

9
leafnode

Chaque fois que vous allez avec ORM (Object Relational Mapper), vous trouverez côte à côte DBAL (Database Abstraction Layer). Il est donc nécessaire de savoir de quoi il s'agit, afin d'avoir une bonne idée de ce que vous utilisez et quels sont les avantages que vous obtiendrez.

DBAL (Database Abstraction Layer)

Il agit comme une couche entre votre code et votre base de données. Quelle que soit votre base de données, le code écrit fonctionnera correctement avec des ajustements mineurs.

Supposons que pour le projet actuel, vous utilisez MySQL une fois qu'il est complètement arrivé à maturité et qu'il génère un trafic énorme, votre équipe prévoit de basculer la base de données vers Oracle pour une raison quelconque, alors le code que vous avez écrit dans MySQL doit être réécrit dans des requêtes basées sur Oracle. Et réécrire les requêtes pour l'ensemble du projet est une tâche fastidieuse.

Au lieu de cela, si vous utilisez des bibliothèques DBAL, vous pouvez changer la configuration de la base de données et vous assurer que votre projet sera opérationnel dans la journée (peut être avec quelques ajustements mineurs).

ORM (Object Relational Mapper)

Le mappage relationnel objet (ORM) est une technique (Design Pattern) permettant d'accéder à une base de données relationnelle à partir d'un langage orienté objet.

Si vous avez utilisé n'importe quel type de frameworks comme Symfony (si vous venez de PHP background)/Hibernate (Java), alors vous êtes familier avec ceux-ci. Ce n'est rien Entités .

Afin d'accéder à la base de données dans un contexte orienté objet et qu'une interface traduisant la logique d'objet est nécessaire, cette interface est appelée ORM. Sa composition de l'objet qui donne accès aux données et garde les règles métier avec elles-mêmes.

Par exemple.

class User{
    private $email;

    private $password;

    public function setEmail($email){
        $this->email = $email;
        return $this;
    }

    public function getEmail(){
        return $this->email;
    }


    public function setPassword($password){
        $this->password = $password;
        return $this;
    }

    public function getPassword(){
        return $this->password;
    }
}

/* To save User details you would do something like this */
$userObj = new User();
$userObj->setEmail('sanitizedEmail');
$userObj->setPassword('sanitizedPassword');
$userObj->save();

/* To fetch user details you would do something like this */
$userObj = new User();
$userDetails = $userObj->find($id);

Par exemple. Doctrine , Propel , RedBean

6
Channaveer Hakari

ORM est:

Une abstraction et comme toute abstraction, elle vous facilite la vie.

2
Chris Nicol

De Wikipedia: http://en.wikipedia.org/wiki/Object-relational_mapping

Le mappage relationnel-objet (mappage ORM, O/RM et O/R) dans les logiciels informatiques est une technique de programmation pour convertir des données entre des systèmes de type incompatibles dans des bases de données relationnelles et des langages de programmation orientés objet. Cela crée, en effet, une "base de données d'objets virtuels" qui peut être utilisée à partir du langage de programmation. Il existe des packages gratuits et commerciaux qui effectuent le mappage relationnel-objet, bien que certains programmeurs choisissent de créer leurs propres outils ORM.

Avantages et inconvénients L'ORM réduit souvent la quantité de code à écrire, ce qui rend le logiciel plus robuste (moins il y a de lignes de code dans un programme, moins il y a d'erreurs contenues) [1].

Il existe des coûts ainsi que des avantages pour l'utilisation de la cartographie O/R. Par exemple, certains outils de mappage O/R ne fonctionnent pas bien lors des suppressions en masse de données. Les procédures stockées peuvent avoir de meilleures performances mais ne sont pas portables.

0
chikak

Il vous permet de faire des choses comme ça (c'est Doctrine):

$activeUsers = Doctrine::getTable('User')->createQuery('u')->addWhere('u.active = false');
foreach($activeUsers as $user)
{
   $user->active = true;
   $user->save();
}
0
miguelSantirso

Les bibliothèques de mappage relationnel-objet (ORM) fournissent ce mappage des tables de base de données aux classes d'objets de domaine.

0
Nanhe Kumar