2009-09-10 31 views
10

Estoy retocando con CodeIgniter y me he topado con Active Records por primera vez. Al principio lo descarté como algo para las personas que realmente no saben cómo escribir SQL. Ahora me doy cuenta de que mi análisis era defectuoso y los registros activos son bastante prominentes, especialmente en Rails.¿Cuál es el propósito de Active Records?

¿Pero para qué sirve Active Records? Es abstraerse de las diferentes individualidades de RDBMS. Si es así, pensé que no es eso lo que SQL debe hacer. Además, ¿cuál es la mejor práctica? ¿Debería usar esto?

Gracias de antemano

Respuesta

5

El "Active Record" se está convirtiendo en una parte fundamental de la mayoría de los marcos de programación. Hace que las tareas más simples de CRUD (Crear, Actualizar, Leer, Eliminar) sean más rápidas de lograr. Por ejemplo, en lugar de tener que escribir muchos SQL para Insertar, Actualizar y Eliminar muchos objetos de datos comunes y simples, le permite simplemente asignar los valores al objeto de datos y ejecutar un comando, p. $ object-> save(), el SQL se compila y ejecuta para usted.

La mayoría de los marcos también implementan relaciones de datos dentro de sus respectivos modelos de registro activo que pueden simplificar enormemente el acceso a los datos relacionados con su objeto. Por ejemplo, en CodeIgniter, si especificó que una Categoría "tiene muchos" Productos, luego de cargar el objeto Categoría de la base de datos, puede enumerar sus productos secundarios con una línea de código simple.

foreach ($category->products as $product) { 
    echo $product->name; 
} 

Otro beneficio de Active Record es, como usted dice, que hace que su código fácilmente portable a diferentes plataformas de bases de datos (siempre que el marco que está utilizando tiene un controlador para la base de datos elegida) y aunque esto no es probable que parezca importante en este momento, ¡tengo más valor en una fecha posterior si su aplicación se vuelve popular!

Espero que esto haya ayudado. Wikipedia describe bien el Registro activo (http://en.wikipedia.org/wiki/Active_record_pattern) y los documentos CodeIgniter también lo harán. Personalmente, utilizo KohanaPHP (http://www.kohanaphp.com), que es un fork PHP5 de CodeIgniter y creo que sus modelos ORM son muy útiles.

8

Active Record es un patrón de diseño para el acceso a los datos ...

Por el momento hay dos patrones principales de diseño que parece venir a través, relativo al acceso de datos: ActiveRecord y el patrón Repositorio

Active Record

sus objetos contienen métodos para persistir su estado a una base de datos (u otro mecanismo de persistencia) para:

Puede tener un objeto Cliente.

El objeto del cliente tendrá varios métodos como Customer.Save() ;, Customer.Get (int id); y otros.

Estos métodos realmente no tienen nada que ver con un cliente en el mundo real. Realmente se trata de la infraestructura de su aplicación.

patrón Repositorio

en el patrón de repositorio, el objeto de cliente habría un POCO, o un objeto mudo. Sólo se dispone de métodos y propiedades que lo que realmente necesita para representar a un cliente (cosas como nombre, dirección de correo electrónico, órdenes de lista, etc.)

Cuando se desea mantener al cliente - simplemente pasarlo a su repositorio

Repository.Save (MyCustomer).

El patrón de registro activo es rápido y fácil de trabajar. Lamentablemente, complica su modelo de dominio con estos métodos que en realidad no tienen nada que ver con un cliente. Esto hace que sea un poco más difícil mantener su modelo de dominio a lo largo del tiempo.

Para muchas situaciones, es muy apropiado utilizar un patrón de registro activo. Por ejemplo, si estoy escribiendo una aplicación bastante simple que probablemente no va a cambiar demasiado, probablemente active SubSonic y genere un registro activo DAL. Codificaría mi código de negocio en 20 minutos y ya se han solucionado todas las cuestiones de DB.

Si, por el contrario, estoy modelando un dominio particularmente complejo, con alta susceptibilidad a cambiar, prefiero mantener mis modelos de dominio limpia, e implementar un modelo de repositorio con NHibernate o similares ...

Ha pasado mucho tiempo desde que implementé mi propio acceso a datos usando ADO.Net, y realmente no lo recomiendo ahora que hay tantas herramientas de acceso a datos disponibles.

+0

1. Muy buena explicación –

0

Active Record es un ORM - ¿Ha echado un vistazo a la técnica de asignación de relación de objetos? Creo que si entiendes ORM, comenzarás a ver los beneficios.

+0

Ha habido ORM que tienen "Registro activo" en el nombre, pero Active Record es más correctamente un patrón de diseño de la aplicación empresarial. Mira el libro de Martin Fowler en mi respuesta, es un gran libro para aclarar estas cosas. – Ash

+0

Hola Ash, gracias por eso, tomaré una lectura ... – JonB

2

Podría dar mi propia opinión sobre este patrón, pero la mejor cobertura de Active Record (y muchos otros) es Patterns of Enterprise Application Architecture por Martin Fowler.

Desde el capítulo 10:

Active Record

Un objeto que envuelve una fila en una tabla de base de datos o vista, encapsula el acceso a la base de datos, y añade dominio lógica en esos datos.

Un objeto lleva datos y comportamiento de . Gran parte de esta información es persistente y debe almacenarse en una base de datos . Active Record utiliza el enfoque más obvio de , poniendo lógica de acceso a los datos en el objeto de dominio. De esta forma toda la gente sabe cómo leer y escribir sus datos ay desde la base de datos.

...

cuándo usarlo

Active Record es una buena opción para lógica de dominio que no es demasiado complejo, como crea, lee, actualizaciones y eliminaciones. Las derivaciones y las validaciones basadas en un solo registro funcionan bien en esta estructura.

...

Active Record tiene la principal ventaja de la simplicidad . Es fácil crear Active Records, y son fáciles de entender. Su problema principal es que funcionan bien solo si los objetos del registro activo corresponden directamente a las tablas de la base de datos: un esquema isomorfo .

Si la lógica de negocio es compleja, pronto quiere uso directo las relaciones de su objeto, colecciones, herencia, y así sucesivamente. Estos no se asignan fácilmente en Active Record, y agregándolos poco a poco se vuelve muy complicado. Eso es lo que le llevará a utilizar los datos Mapper lugar

1

En todo caso, facilita la escritura de consultas. Encuentro que la sintaxis normal de MySQL es propensa a errores de sintaxis (sin culpa mía) y con la sintaxis del registro activo de CI esto rara vez me pasa.

Active Record es una de las características más interesantes en mi humilde opinión CI

Cuestiones relacionadas