Diferencia entre revisiones de «Active record»
Sin resumen de edición |
|||
(No se muestran 10 ediciones intermedias de 7 usuarios) | |||
Línea 1: | Línea 1: | ||
En [[Ingeniería de software]], '''active record''' es un patrón de arquitectura encontrado en aplicaciones que almacenan sus datos en [[Base de datos relacional|Bases de datos relacionales]]. Fue llamado así por [[Martin Fowler]] en su libro ''Patterns of Enterprise Application Architecture''.<ref>{{cita libro |apellidos=Fowler |nombre=Martin |título=Patterns of enterprise application architecture |editorial=Addison-Wesley |año=2003 |isbn=978-0-321-12742-6 |url=http://books.google.com/books?id=FyWZt5DdvFkC&lpg=PA1&dq=Patterns%20of%20Enterprise%20Application%20Architecture%20by%20Martin%20Fowler&pg=PT187#v=onepage&q=active%20record&f=false }}</ref> La interfaz de un cierto objeto debe incluir funciones como por ejemplo insertar (INSERT), actualizar (UPDATE), eliminar (DELETE) y propiedades que correspondan de cierta manera directamente a las columnas de la base de datos asociada. |
En [[Ingeniería de software]], '''active record''' es un patrón de arquitectura (actualmente considerado como un [[antipatrón de diseño]])<ref>[https://www.oreilly.com/library/view/sql-antipatterns/9781680500073/f_0159.html Antipattern: The Model Is an Active Record]</ref><ref>[https://www.mehdi-khalili.com/orm-anti-patterns-part-1-active-record ORM anti-patterns - Part 1: Active Record]</ref><ref>[http://misko.hevery.com/2009/05/05/the-problem-with-active-record/ The problem with Active Record]</ref><ref>[https://softwareengineering.stackexchange.com/questions/119352/does-the-activerecord-pattern-follow-encourage-the-solid-design-principles Does the ActiveRecord pattern follow/encourage the SOLID design principles?]</ref> encontrado en aplicaciones que almacenan sus datos en [[Base de datos relacional|Bases de datos relacionales]]. Fue llamado así por [[Martin Fowler]] en su libro ''Patterns of Enterprise Application Architecture''.<ref>{{cita libro |apellidos=Fowler |nombre=Martin |título=Patterns of enterprise application architecture |editorial=Addison-Wesley |año=2003 |isbn=978-0-321-12742-6 |url=http://books.google.com/books?id=FyWZt5DdvFkC&lpg=PA1&dq=Patterns%20of%20Enterprise%20Application%20Architecture%20by%20Martin%20Fowler&pg=PT187#v=onepage&q=active%20record&f=false }}</ref> La interfaz de un cierto objeto debe incluir funciones como por ejemplo insertar (INSERT), actualizar (UPDATE), eliminar (DELETE) y propiedades que correspondan de cierta manera directamente a las columnas de la base de datos asociada. |
||
Active record es un enfoque para acceso de datos en una [[base de datos]]. Una tabla de la base de datos o vista (view) está envuelta en una clase. Por lo tanto, una instancia de un objeto está ligada a un único registro (tupla) en la tabla. Después de crear y grabar un objeto, un nuevo registro es adicionado a la tabla. Cualquier objeto cargado obtiene su información a partir de la base de datos. Cuando un objeto es actualizado, un registro correspondiente en la tabla también es actualizado. Una clase de envoltura implementa los métodos de acceso (setter e getter) o propiedades para cada columna en la tabla o vista. |
Active record es un enfoque para acceso de datos en una [[base de datos]]. Una tabla de la base de datos o vista (view) está envuelta en una clase. Por lo tanto, una instancia de un objeto está ligada a un único registro (tupla) en la tabla. Después de crear y grabar un objeto, un nuevo registro es adicionado a la tabla. Cualquier objeto cargado obtiene su información a partir de la base de datos. Cuando un objeto es actualizado, un registro correspondiente en la tabla también es actualizado. Una clase de envoltura implementa los métodos de acceso (setter e getter) o propiedades para cada columna en la tabla o vista. |
||
Línea 18: | Línea 18: | ||
Creará un nuevo registro en la tabla <code>productos</code> con los valores proporcionados lo cual vendría siendo equivalente al comando SQL: |
Creará un nuevo registro en la tabla <code>productos</code> con los valores proporcionados lo cual vendría siendo equivalente al comando SQL: |
||
< |
<syntaxhighlight lang="sql"> |
||
INSERT INTO productos (nombre, valor) VALUES ('Producto ejemplo', 123.45); |
INSERT INTO productos (nombre, valor) VALUES ('Producto ejemplo', 123.45); |
||
</syntaxhighlight> |
|||
</source> |
|||
De la misma forma, una clase puede ser usada para consultar una BD: |
De la misma forma, una clase puede ser usada para consultar una BD: |
||
Línea 28: | Línea 28: | ||
Este código creará un nuevo objeto de tipo <code>Producto</code> basado en el primer registro encontrado de la tabla <code>productos</code> donde la columna <code>nombre</code> contiene un valor "televisor". El comando SQL equivalente puede ser similar al siguiente (dependiendo de los detalles de la implementación SQL de la base de datos): |
Este código creará un nuevo objeto de tipo <code>Producto</code> basado en el primer registro encontrado de la tabla <code>productos</code> donde la columna <code>nombre</code> contiene un valor "televisor". El comando SQL equivalente puede ser similar al siguiente (dependiendo de los detalles de la implementación SQL de la base de datos): |
||
< |
<syntaxhighlight lang="sql"> |
||
SELECT * FROM productos WHERE nombre = 'televisor' LIMIT 1; -- MySQL o PostgreSQL |
SELECT * FROM productos WHERE nombre = 'televisor' LIMIT 1; -- MySQL o PostgreSQL |
||
</syntaxhighlight> |
|||
</source> |
|||
== Pruebas de software == |
== Pruebas de software == |
||
Debido al acople entre la base de datos y la lógica de la aplicación cuando se usa el patrón Active Record, las pruebas unitarias sin una base de datos son difíciles de realizar. Los efectos negativos al realizarle pruebas pueden disminuirse usando [[objetos simulados]] o ''frameworks'' de [[inyección de dependencias]] para sustituir los datos reales con los simulados. |
Debido al acople entre la base de datos y la lógica de la aplicación cuando se usa el patrón Active Record, las pruebas unitarias sin una base de datos son difíciles de realizar. Los efectos negativos al realizarle pruebas pueden disminuirse usando [[objetos simulados]] o ''frameworks'' de [[inyección de dependencias]] para sustituir los datos reales con los simulados. |
||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
*[http://www.phpactiverecord.org/ Implementación en PHP] (en inglés) |
|||
⚫ | |||
== Referencias == |
== Referencias == |
||
{{listaref}} |
{{listaref}} |
||
* http://en.wikipedia.org/wiki/Active_record_pattern |
|||
* http://pt.wikipedia.org/wiki/Active_record |
|||
⚫ | |||
{{boceto-ingeniería-de-software}} |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
{{Control de autoridades}} |
|||
[[pt:Active Record#]] |
|||
[[Categoría:Patrones de arquitectura (informática)]] |
|||
[[en:Active Record Pattern#]] |
|||
⚫ |
Revisión actual - 23:01 19 sep 2024
En Ingeniería de software, active record es un patrón de arquitectura (actualmente considerado como un antipatrón de diseño)[1][2][3][4] encontrado en aplicaciones que almacenan sus datos en Bases de datos relacionales. Fue llamado así por Martin Fowler en su libro Patterns of Enterprise Application Architecture.[5] La interfaz de un cierto objeto debe incluir funciones como por ejemplo insertar (INSERT), actualizar (UPDATE), eliminar (DELETE) y propiedades que correspondan de cierta manera directamente a las columnas de la base de datos asociada.
Active record es un enfoque para acceso de datos en una base de datos. Una tabla de la base de datos o vista (view) está envuelta en una clase. Por lo tanto, una instancia de un objeto está ligada a un único registro (tupla) en la tabla. Después de crear y grabar un objeto, un nuevo registro es adicionado a la tabla. Cualquier objeto cargado obtiene su información a partir de la base de datos. Cuando un objeto es actualizado, un registro correspondiente en la tabla también es actualizado. Una clase de envoltura implementa los métodos de acceso (setter e getter) o propiedades para cada columna en la tabla o vista.
Este patrón suele ser utilizado por herramientas de persistencia de objetos en el mapeo objeto-relacional. Generalmente las relaciones de llave foránea serán expuestas como una instancia de objeto de tipo apropiado por medio de una propiedad.
Implementación
[editar]Su implementación puede ser encontrada en varios frameworks para diversos ambientes de programación.
Por ejemplo, si una base de datos
posee una tabla productos
con las columnas nombre
(tipo String) y valor
(tipo Number) y un patrón de proyecto Active Record es implementado en la clase Producto
, el pseudo-código:
producto = new Producto() producto.nombre = "Producto ejemplo" producto.valor = 123.45 producto.guardar()
Creará un nuevo registro en la tabla productos
con los valores proporcionados lo cual vendría siendo equivalente al comando SQL:
INSERT INTO productos (nombre, valor) VALUES ('Producto ejemplo', 123.45);
De la misma forma, una clase puede ser usada para consultar una BD:
b = Producto.find_first("nombre", "televisor")
Este código creará un nuevo objeto de tipo Producto
basado en el primer registro encontrado de la tabla productos
donde la columna nombre
contiene un valor "televisor". El comando SQL equivalente puede ser similar al siguiente (dependiendo de los detalles de la implementación SQL de la base de datos):
SELECT * FROM productos WHERE nombre = 'televisor' LIMIT 1; -- MySQL o PostgreSQL
Pruebas de software
[editar]Debido al acople entre la base de datos y la lógica de la aplicación cuando se usa el patrón Active Record, las pruebas unitarias sin una base de datos son difíciles de realizar. Los efectos negativos al realizarle pruebas pueden disminuirse usando objetos simulados o frameworks de inyección de dependencias para sustituir los datos reales con los simulados.
Referencias
[editar]- ↑ Antipattern: The Model Is an Active Record
- ↑ ORM anti-patterns - Part 1: Active Record
- ↑ The problem with Active Record
- ↑ Does the ActiveRecord pattern follow/encourage the SOLID design principles?
- ↑ Fowler, Martin (2003). Patterns of enterprise application architecture. Addison-Wesley. ISBN 978-0-321-12742-6.
Enlaces externos
[editar]- Implementación en Java (en inglés)
- Implementación en .NET (en inglés)
- Implementación en Ruby (en inglés)
- Página del Proyecto AIR Active Record (en inglés)