Qu'est-ce qu'un cadre de cartographie Objet-Relationnel? [dupliquer]

cette question a déjà une réponse ici:

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

74
orm
demandé sur RCIX 2009-07-20 12:25:15

8 réponses

de wikipedia :

mapping Objet-relationnel (ORM, O/RM, et O / R mapping) dans les logiciels informatiques est une technique de programmation pour conversion de données entre incompatibles tapez les systèmes dans les bases de données relationnelles et la programmation orientée objet langue. Cela crée, en effet, un "base de données d'objets virtuels" qui peut être utilisé dans la programmation langue. Il y a à la fois libre et logiciels commerciaux disponible effectuer un mappage objet-relationnel, bien que certains programmeurs opter pour créer leurs propres outils ORM.

il est bon pour l'Abstraction du datastore (fichier plat / SQL / machin chose) dehors afin de fournir une interface qui peut être utilisée dans votre code. Par exemple, (dans les rails) au lieu de construire SQL pour trouver le premier utilisateur dans une table d'utilisateurs, nous pourrions faire ceci:

User.first

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

47
répondu Codebeef 2009-07-20 08:27:34

une réponse simple est que vous enveloppez vos tables ou procédures stockées dans des classes dans votre langage de programmation, de sorte qu'au lieu d'écrire des déclarations 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 ceci:

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 code similaire (beaucoup de variations ici.) Certains cadres mettent aussi beaucoup 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 aussi des systèmes de requête complexes, donc vous pouvez faire ceci:

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

le cadre est ce qui rend ce code possible.

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

en outre, vous pouvez vous concentrer sur l'écriture de la logique, au lieu d'obtenir tout le droit SQL. Le code sera généralement plus lisible aussi bien, puisqu'il ne contient toute la "plomberie" nécessaire pour parler à la base de données.

230
répondu Lasse Vågsæther Karlsen 2009-07-20 08:29:23

les bases de données fonctionnent habituellement sur le modèle relationnel: vous avez des tables (simplifiant: comme une feuille de calcul), et les relations entre eux - un-à-un, un-à-plusieurs, plusieurs-à-plusieurs, etc, ce qui signifie par exemple qu'un enregistrement dans le tableau A a beaucoup d'enregistrements liés dans le tableau B. Vous pouvez extraire des données d'eux sous forme de lignes (collection de valeurs représentant des lignes de la table/tables) plus dans wikipedia .

langages de programmation Modernes utilisation du modèle objet. Les objets ont méthodes, attributs (simples ou complexes), etc.

ORM software effectue une transition entre ces modèles. Par exemple, il place tous les enregistrements liés du tableau B dans un attribut de l'objet A. Ce genre de logiciel rend plus facile d'utiliser des bases de données relationnelles (type le plus populaire) avec des langages de programmation d'objet.

8
répondu leafnode 2009-07-20 08:32:16

chaque fois que vous allez avec ORM (Object Relational Mapper) vous trouverez DBAL (Database Abstraction Layer) côte à côte. Il est donc nécessaire de savoir ce que ce sont, afin d'obtenir une bonne compréhension de ce que vous utilisez et quels sont les avantages que vous obtiendrez.

DBAL (Couche d'Abstraction de Base)

il agit comme une couche entre votre code et la base de données. Quelle que soit votre base de données, le code écrit fonctionnera fine avec de légers ajustements.

supposons que pour le projet en cours votre utilisation MySQL une fois son a pleinement mûri et obtient un trafic énorme Votre équipe prévoit de passer la base de données à Oracle pour une raison quelconque, puis le code que vous avez écrit dans MySQL doit être réécrit à des requêtes basées Oracle. Et réécrire les requêtes pour l'ensemble du projet est une tâche fastidieuse.

à la place si vous utilisez des bibliothèques DBAL, vous pouvez changer la configuration de la base de données et faire bien sûr, votre projet sera opérationnel dans la journée (peut-être avec quelques retouches mineures).

ORM (Object Relational Mapper)

Mapping Objet Relationnel (ORM) est une technique (Design Pattern) d'accéder à une base de données relationnelle à partir d'un langage orienté objet.

si vous avez utilisé N'importe quel type de cadres comme Symfony (si vous venez de PHP background)/Hibernate (Java), alors votre familier avec ceux-ci. Son Rien mais entités .

pour accéder à la base de données dans le contexte orienté objet et l'interface traduire la logique objet est nécessaire, cette interface est appelée ORM. Sa composition de l'objet qui donne accès aux données et de garder les règles d'entreprise eux-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 , Propulser , RedBean

5
répondu Channaveer Hakari 2016-09-17 08:15:25

ORM is:

une abstraction et comme toute abstraction, elle rend la vie plus facile pour vous.

2
répondu Chris Nicol 2009-07-20 08:32:10

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

mapping Objet-relationnel (ORM, O/RM, et de mappage O/R) dans le logiciel informatique est une technique de programmation pour la conversion de données entre incompatible type de systèmes de bases de données relationnelles et les langages de programmation orientée 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 y a à la fois libre et il existe des paquets commerciaux qui effectuent des mappages objets-relationnels, bien que certains programmeurs choisissent de créer leurs propres outils ORM.

pour et contre 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).[1].

l'utilisation de la cartographie O/R comporte des coûts et des avantages. Par exemple, certains outils de cartographie O/R ne fonctionnent pas bien. lors de suppressions massives de données. Les procédures stockées peuvent avoir un meilleur rendement, mais elles ne sont pas portables.

0
répondu chikak 2009-07-20 08:27:50

il vous permet de faire des choses comme ceci (ceci est le code de Doctrine):

$activeUsers = Doctrine::getTable('User')->createQuery('u')->addWhere('u.active = false');
foreach($activeUsers as $user)
{
   $user->active = true;
   $user->save();
}
0
répondu miguelSantirso 2009-07-20 08:30:31

mapping Objet-relationnel (ORM), les bibliothèques offrent cette cartographie des tables de base de données de domaine de classes d'objets.

0
répondu Nanhe Kumar 2013-02-12 07:55:39