Está en la página 1de 9

Universidad del Valle de Guatemala

Modelado de Bases de Datos

Investigacin ODMS: ZODB o

Alejandra Canahui

09-303

25 de agosto de 2012

Indice
1. Resumen 2. Introduccin o 3. Zope Object DataBase 3.1. Generalidades . . . . . . . . . 3.2. Transacciones . . . . . . . . . 3.3. Opciones de almacenamiento 3.4. Otras caracter sticas . . . . . 3.5. Ejemplo . . . . . . . . . . . . 3.5.1. Clases Persistentes . . 4. Conclusiones 5. Anexos 2 2 3 3 3 3 4 4 5 6 7

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

. . . . . .

1.

Resumen

El gestor seleccionado para la investigacin fue ZODB, un ODMS en lenguao je Python desarrollado para uso con el web framework ZOPE, que tambin se e puede usar fuera del mismo. ZODB es muy fcil de integrar a la lgica de aplicaa o ciones Python, ya que requiere pocas (si es que requiere alguna) modicaciones. En esta investigacin, se introducir el concepto de Bases de Datos Orieno a tadas a Objetos y se mencionarn las caracter a sticas bsicas de ZODB, junto a con un ejemplo simple pero demostrativo de su funcionamiento.

2.

Introduccin o

Histricamente, las Bases de Datos Orientadas a Objetos (OODBs, por sus o sus siglas en ingls) se desarrollaron inicialmente como un intento de agregar e persistencia a lenguajes de programacin orientados a objetos. En respuesta a o el desarrollo de OODBs, la comunidad de Bases de Datos Relacionales tambin desarroll Bases de Datos Objeto-Relacionales, que extienden el modelo e o relacional con soporte para muchos conceptos orientados a objetos. El objetivo de una OODB es proveer soporte tanto para la persistencia de objetos como para las caracter sticas esperadas en un sistema de bases de datos, tales como el manejo eciente de persistencia, transacciones, concurrencia, recuperacin de datos y un lenguaje de consultas.[2] o Zope es un servidor de aplicaciones web escrito en Python. A diferencia de otros frameworks web, Zope alienta el uso de una Base de Datos Orientada a Objetos para su persistencia, en vez de la t pica Base de Datos Relacional. La base de datos utilizada por Zope es ZODB (Z Object DataBase).[1] ZODB provee una base de datos orientada a objetos para Python altamente transparente. Entre otras ventajas, se puede utilizar en aplicaciones sin necesidad de realizar muchos (o algn) cambio a la lgica de la misma.[3] u o

3.
3.1.

Zope Object DataBase


Generalidades

Hay dos caracter sticas de ZODB que llaman la atencin a aquellos unicao mente con experiencia en el modelo relacional. Primero, que en ZODB los objetos se almacenan jerrquicamente; y segundo, que los objetos no siguen un a esquema como tal, as que pueden ganar o perder atributos de instancia en cualquier momento. Todos los objetos de una base de datos ZODB son parte de una jerarqu que a empieza con el objeto raiz - un contenedor genrico creado por el manejador e para contener todos los dems objetos de la base de datos. Acta como un a u diccionario de Python que permite que los objetos se coloquen (o eliminen) identicados por cadenas. Por otro lado, un objeto en una base de datos ZODB puede tener cualquier coleccin de atributos de instancia. Se pueden agregar y eliminar en el objeto o conforme se desee. No se aplican restricciones de tipos, aparte de la restriccin o bsica en la que ZODB slo soporta valores de atributos que estn compuestos a o a de combinaciones de tipos de Python serializables con el mdulo Pickle, como o nmeros, cadenas, tuplas, listas y diccionarios. Este comportambiento concuerda u muy bien con Python, aunque constrasta muy fuertemente con la prctica en a lenguajes de tipos estticos.[4] a

3.2.

Transacciones

ZODB tiene soporte para transacciones. Las transacciones proveen control de concurrencia y atomicidad. Las transacciones se ejecutan como si tuvieran acceso exclusivo a los datos, para que el programador no tenga que ocuparse con threading. No obstante, no hay nada que prevenga dos peticiones simultneas en a conicto, as que se realizan chequeos a la hora de hacer commit, para asegurar consistencia. ZODB provee todas las propiedades ACID. Desde Zope 2.8, ZODB ha implementado Control de Concurrencia MultiVersin, lo cual signica que cada transaccin puede leer cualquier objeto tal y o o como era cuando la transaccin empez.[6] o o

3.3.

Opciones de almacenamiento

ZODB tambin soporta particionamiento, permitiendo al programador e distribuir la data en mltiples almacenamientos.[6] u Opciones del tipo de almacenamiento:[6] FileStorage es la opcin predeterminada. Todo se guarda en un gran o archivo Data.fs, que es esencialmente un log de transacciones. DirectoryStorage almacena un archivo por revisin de objeto. o

RelStorage almacena pickles 1 en una base de datos relacional. Se soportan PostgreSQL, MySQL y Oracle.

3.4.

Otras caracter sticas

1. Savepoints (anteriormente sub-transacciones) permiten control de errores granular y garbage collection durante una transaccin, economizando o memoria. 2. BLOBs son nuevos en ZODB 3.8 / ZOPE 2.11, y permiten un soporte eciente para archivos largos. Util para aplicaciones de administracin de o documentos. 3. Packing elimina revisiones viejas de objetos. Similar al Routine Vacuuming de PostgreSQL.

3.5.

Ejemplo

El primer paso es crear una conexin para la base de datos deseada. ZOBD o crea la base de datos de ser necesario.
1 2 3 4 5 6 7 8 from ZODB import F i l e S t o r a g e , DB s t o r a g e = F i l e S t o r a g e . F i l e S t o r a g e ( m y d a t a b a s e . fs ) db = DB( s t o r a g e ) c o n n e c t i o n = db . open ( ) root = connection . root () root >>> {}

Aqu se ha creado la base de datos llamada mydatabase, y obtenido su objeto raiz, el cual por el momento se parece a un diccionario vac Agregar o. objetos a la base es fcil. Slo se debe tomar en cuenta que los cambios no se a o hacen permantentes hasta que se hace commit.
1 2 3 4 5 6 r o o t [ e m p l o y e e s ] = [ Mary , Jo , Bob ] import t r a n s a c t i o n t r a n s a c t i o n . commit ( ) connection . close ()

Se puede ver que hubo persistencia ya que al acceder al objeto root desde otra sesin cualquiera, los datos aparecen como se ingresaron. o
1 2 3 4 5 6 7 8 from ZODB import F i l e S t o r a g e , DB s t o r a g e = F i l e S t o r a g e . F i l e S t o r a g e ( m y d a t a b a s e . fs ) db = DB( s t o r a g e ) c o n n e c t i o n = db . open ( ) root = connection . root () root . items () >>> [ ( e m p l o y e e s , [ M a r y , J o , B o b ] ) ]

1 pickle es un mdulo de serializacin de Python. Ms info: http://docs.python.org/ o o a library/pickle.html

3.5.1.

Clases Persistentes

Para hacer que una clase persista en la base de datos, esta se debe crear extendiendo la clase Persistent
1 2 3 4 5 6 7 import ZODB from P e r s i s t e n c e import P e r s i s t e n t c l a s s Employee ( P e r s i s t e n t ) : def setName ( s e l f , name ) : s e l f . name = name

Ahora se pueden ingresar objetos de la clase Employee en la base de datos.[5]


1 2 3 4 5 6 7 employees = [ ] f o r name in [ M a r y , J o e , B o b ] : employee = Employee ( ) employee . setName ( name ) e m p l o y e e s . append ( employee ) r o o t [ e m p l o y e e s ]= e m p l o y e e s t r a n s a c t i o n . commit ( )

4.

Conclusiones

1. Las Bases de Datos Orientadas a Objetos surgen para hacer ms fcil la a a persistencia de datos de un programa programado en un Lenguaje Orientado a Objetos. 2. ZODB es el ODMS utilizado por el framework web ZOPE. Ambos estn a hechos en lenguaje Python. 3. ZODB cumple con las caracter sticas ACID, por lo que es apto para concurrencia y transacciones. 4. La integracin de ZODB a una aplicacin Python es fcil, ya que aparte o o a de extender la clase Persistent y operaciones de guardado, no se deber a hacer muchos cambios ms. a 5. En un proyecto de lenguaje Python, recomendar utilzar ZODB, ya que a es un proyecto activo y apoyado por ZOPE, aparte de su facilidad de uso y lo completas que son sus caracter sticas.

Referencias
[1] Carlos de la Guardia and the Zope community. Zodb book 1. http://www. zodb.org/zodbbook/outline.html, 2010. [2] Suzanne W. Dietrich and Susan D. Urban. Fundamentals of Object Databases. Morgan & Claypool, 2011. [3] Jim Fulton. Introduction to the zope object database. http://www.python. org/workshops/2000-01/proceedings/papers/fulton/zodb3.html. [4] Noah Gift and Brandon C. Rhodes. Example-driven zodb. http://www. ibm.com/developerworks/aix/library/au-zodb/, Abril 2008. [5] Michael Pelletier. Introduction to the zodb. documentation/articles/ZODB1.html. http://www.zodb.org/

[6] Laurence Rowe. An overview of the zodb. http://www.zodb.org/ documentation/articles/ZODB-overview.html, 2007.

5.

Anexos
Ejemplo Completo de uso de ZODB[5]

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

from ZODB import DB from ZODB. F i l e S t o r a g e import F i l e S t o r a g e from ZODB. P e r s i s t e n t M a p p i n g import P e r s i s t e n t M a p p i n g from P e r s i s t e n c e import P e r s i s t e n t import t r a n s a c t i o n c l a s s Employee ( P e r s i s t e n t ) : An employee def init ( s e l f , name , manager=None ) : s e l f . name=name s e l f . manager=manager

# setup the database s t o r a g e=F i l e S t o r a g e ( " e m p l o y e e s . f s " ) db=DB( s t o r a g e ) c o n n e c t i o n=db . open ( ) r o o t=c o n n e c t i o n . r o o t ( ) # g e t t h e employees mapping , c r e a t i n g an empty mapping i f # necessary i f not r o o t . h a s k e y ( " e m p l o y e e s " ) : r o o t [ " e m p l o y e e s " ] = {} e m p l o y e e s=r o o t [ " e m p l o y e e s " ]

def l i s t E m p l o y e e s ( ) : i f l e n ( e m p l o y e e s . v a l u e s ( ) ) ==0: print " T h e r e a r e n o e m p l o y e e s . " print return f o r employee in e m p l o y e e s . v a l u e s ( ) : print " N a m e : %s " % employee . name i f employee . manager i s not None : print " M a n a g e r s n a m e : %s " % employee . manager . name print def addEmployee ( name , manager name=None ) : i f e m p l o y e e s . h a s k e y ( name ) : print " T h e r e i s a l r e a d y a n e m p l o y e e w i t h t h i s n a m e . " return i f manager name : try : manager=e m p l o y e e s [ manager name ] except KeyError : print print " N o s u c h m a n a g e r " print return e m p l o y e e s [ name]= Employee ( name , manager ) else : e m p l o y e e s [ name]= Employee ( name ) r o o t [ e m p l o y e e s ] = e m p l o y e e s # r e a s s i g n t o change t r a n s a c t i o n . commit ( ) print " E m p l o y e e %s a d d e d . " % name print

if

n a m e ==" _ _ m a i n _ _ " : while 1 : c h o i c e=r a w i n p u t ( " P r e s s L t o l i s t e m p l o y e e s , A t o a d d " " an employee , or Q to quit : " )

64 65 66 67 68 69 70 71 72 73 74 75

c h o i c e=c h o i c e . l o w e r ( ) i f c h o i c e==" l " : listEmployees () e l i f c h o i c e==" a " : name=r a w i n p u t ( " E m p l o y e e n a m e : " ) manager name=r a w i n p u t ( " M a n a g e r n a m e : " ) addEmployee ( name , manager name ) e l i f c h o i c e==" q " : break # close database connection . close ()

También podría gustarte