Pregunta ¿Qué es un marco de mapeo relacional de objetos? [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Como dice el título; ¿Qué es un marco ORM y para qué sirve?


74
2017-07-20 08:25


origen


Respuestas:


Desde wikipedia:

Mapeo objeto-relacional (ORM, O / RM,   y mapeo O / R) en software   es una técnica de programación para   convertir datos entre incompatibles   escriba sistemas en bases de datos relacionales   y programación orientada a objetos   idiomas. Esto crea, en efecto, un   "base de datos de objetos virtuales" que puede ser   utilizado desde dentro de la programación   idioma. Hay tanto gratuitos como   paquetes comerciales disponibles que   realizar mapeo relacional de objetos,   aunque algunos programadores optan por   crea sus propias herramientas ORM.

Es bueno abstraer el almacén de datos (archivo plano / SQL / lo que sea) para proporcionar una interfaz que pueda usarse en su código. Por ejemplo, (en rieles) en lugar de construir SQL para encontrar el primer usuario en una tabla de usuarios, podríamos hacer esto:

User.first

Lo que nos devolvería una instancia de nuestro modelo de usuario, con los atributos del primer usuario en la tabla de usuarios.


46
2017-07-20 08:27



Una respuesta simple es que envuelve sus tablas o procedimientos almacenados en clases en su lenguaje de programación, de modo que en lugar de escribir sentencias SQL para interactuar con su base de datos, utilice métodos y propiedades de objetos.

En otras palabras, en lugar de algo como esto:

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

haces algo como esto:

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

o código similar (muchas variaciones aquí.) Algunos frameworks también ponen mucho del código como métodos estáticos en las clases, lo que significa que podría hacer algo como esto en su lugar:

Person p = Person.Get(10);

Algunos también implementan sistemas de consulta complejos, por lo que podría hacer esto:

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

El marco es lo que hace posible este código.

Ahora, beneficios. En primer lugar, oculta el SQL de su código lógico. Esto tiene el beneficio de permitirle soportar más fácilmente más motores de base de datos. Por ejemplo, MS SQL Server y Oracle tienen diferentes nombres en funciones típicas y diferentes formas de hacer cálculos con fechas, por lo que una consulta para "obtenerme a todas las personas editadas las últimas 24 horas" podría implicar una sintaxis SQL diferente solo para esos dos motores de base de datos . Esta diferencia puede separarse de su código lógico.

Además, puede enfocarse en escribir la lógica, en lugar de tener todo el SQL correcto. El código también será más legible, ya que no contiene todas las "tuberías" necesarias para hablar con la base de datos.


226
2017-07-20 08:29



Las bases de datos generalmente trabajan en un modelo relacional: tienes tablas (simplificadoras: como una hoja de cálculo) y relaciones entre ellas: uno a uno, uno a muchos, muchos a muchos, etc., lo que significa, por ejemplo, que un registro en la tabla A tiene muchos registros relacionados en la tabla B. Puede recuperar datos de ellos como filas (colección de valores que representan filas de la tabla / tablas) Más en wikipedia.

Los lenguajes de programación modernos usan el modelo de objetos. Los objetos tienen métodos, atributos (simples o complejos), etc.

El software ORM hace una transición entre esos modelos. Por ejemplo, coloca todos los registros relacionados de la tabla B en un atributo del objeto A. Este tipo de software facilita el uso de bases de datos relacionales (el tipo más popular) con lenguajes de programación de objetos.


8
2017-07-20 08:32



Siempre que vaya con ORM (Object Relational Mapper) encontrará DBAL (Capa de abstracción de la base de datos) uno al lado del otro. Por lo tanto, es necesario saber cuáles son, a fin de obtener una buena idea de lo que está utilizando y cuáles son las ventajas que obtendrá.

DBAL (capa de abstracción de la base de datos) 

Actúa como una capa entre su código y la base de datos. Independientemente de cuál sea su base de datos, el código escrito funcionará bien con ajustes menores.

Suponga que para el proyecto actual, el uso de MySQL una vez que ha madurado completamente y recibe mucho tráfico, su equipo planea cambiar la base de datos a Oracle por algún motivo, entonces el código que ha escrito en MySQL debe reescribirse a consultas basadas en Oracle. Y volver a escribir las consultas para todo el proyecto es una tarea tediosa.

En cambio, si usa cualquier biblioteca DBAL, puede cambiar la configuración de la base de datos y asegurarse de que su proyecto estará en funcionamiento dentro de un día (puede ser con algunos ajustes menores).

ORM (Object Relational Mapper)

La Correlación relacional de objetos (ORM) es una técnica (Patrón de diseño) para acceder a una base de datos relacional desde un lenguaje orientado a objetos.

Si ha utilizado algún tipo de frameworks como Symfony (si proviene de PHP) / Hibernate (Java), entonces estará familiarizado con estos. No es más que Entidades.

Para acceder a la base de datos en el contexto orientado a objetos y la interfaz es necesario traducir la lógica del objeto, esta interfaz se denomina ORM. Es la composición del objeto que da acceso a los datos y mantiene las reglas de negocio consigo mismos.

P.ej.

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);

P.ej. Doctrina, Impulsar, Frijol rojo


5
2017-09-17 08:15



ORM es:

Una abstracción y, como cualquier abstracción, te hace la vida más fácil.


2
2017-07-20 08:32



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

La asignación relacional de objetos (ORM, O / RM y mapeo O / R) en el software de computadora es una técnica de programación para convertir datos entre sistemas de tipos incompatibles en bases de datos relacionales y lenguajes de programación orientados a objetos. Esto crea, en efecto, una "base de datos de objetos virtuales" que se puede usar desde el lenguaje de programación. Existen paquetes gratuitos y comerciales disponibles que realizan mapeo relacional de objetos, aunque algunos programadores optan por crear sus propias herramientas ORM.

Pros y contras ORM a menudo reduce la cantidad de código necesario para escribir, lo que hace que el software sea más robusto (mientras menos sean las líneas de código en un programa, menos errores habrá dentro de ellos). [1].

Hay costos y beneficios para usar el mapeo O / R. Por ejemplo, algunas herramientas de mapeo O / R no funcionan bien durante las eliminaciones masivas de datos. Los procedimientos almacenados pueden tener un mejor rendimiento pero no son portátiles.


0
2017-07-20 08:27



Te permite hacer cosas como esta (este es el código de Doctrine):

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

0
2017-07-20 08:30



Las bibliotecas de mapeo relacional de objetos (ORM) proporcionan esta asignación de tablas de bases de datos a clases de objetos de dominio.


0
2018-02-12 07:55