Tp1 db avanz-v1.1
Upcoming SlideShare
Loading in...5
×

Like this? Share it with your network

Share

Tp1 db avanz-v1.1

  • 827 views
Uploaded on

Un poco sobre postgreSQL (instrucciones de instalación, stored procedures, Data Base)

Un poco sobre postgreSQL (instrucciones de instalación, stored procedures, Data Base)

More in: Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
827
On Slideshare
827
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
9
Comments
0
Likes
1

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. UNIVERSIDAD TECNOLÓGICA NACIONAL F A C U LTA D R E G I O N A L T U C U M Á N Base de Datos Avanzados 5º Nivel - I.S.I. Trabajo Práctico N°1 Grupo: Javier Alejandro Caniparoli Luis Pablo Cardozo Priscilla Rueda Socci Sebastián
  • 2. Comisión: 5K11) Seleccionar uno o varios motores de DB, instalarlo y hacer el paso a paso de la instalación.(L/WAMP, SQL SRV, Oracle, Sysbase, Posgre, etc.)El motor de DB a usar para la resolución del siguiente practico es PostgreSQL.PostgreSQL es un Sistema de Gestión de Base de Datos (SGBD) relacional orientada a objetos ylibre, publicado bajo la licencia BSDINSTALACIÓN (Ubuntu 12.04 x86)La instalación se realizara sobre Ubuntu 12.04 x86 del motor de DB PostgreSQL 9.1.5 (1) Abrir una nueva Terminal: (2) Tipear el siguiente comando dentro de ella “sudo apt-get install postgresql postgresql-client postgresql-contrib libpq-dev postgresql-client-common postgresql-common” Página 2
  • 3. (3) Teclear S (si) a todas las preguntas que nos surjan durante la instalación(4) Confirmemos que la instalación terminó adecuadamente tecleando “psql –version” Página 3
  • 4. (5) Cambiar la contraseña del usuario administrador. Ahora necesitamos establecer la contraseña del usuario administrador postgres. Teclea la siguiente línea en la terminal para iniciar PostgreSQL “sudo su postgres -c psql”(6) Una vez dentro de PostgreSQL tecleamos el siguiente comoando “ALTER USER postgres WITH PASSWORD password ” (cambia la palabra password por la contraseña que desees usar). Despues de esto escribimos “q” : Página 4
  • 5. (7) Eso altera la contraseña dentro de la base de datos, ahora necesitamos hacer lo mismo para el usuario Linux postgres: 1 sudo passwd -d postgres 2 sudo su postgres -c passwd Al ejecutar el comando “sudo su postgres -c passwd” te aparecerá un prompt, introduce la misma contraseña que pusiste antes.(8) Cambiar el esquema de autenticación de PostgreSQL. Al ejecutar algunos comandos de base de datos, es posible que te encuentres con un error que dice algo como: FATAL: Peer authentication failed for user “X” Para evitarlo necesitas editar el archivo /etc/postgresql/9.1/main/pg_hba.conf y cambiar el esquema de autenticación. Abre el archivo con privilegios de root: 1 sudo gedit /etc/postgresql/9.1/main/pg_hba.conf Y cambia esto: 1 # Database administrative login by Unix domain socket 2 local all postgres peer Por: Página 5
  • 6. 1 # Database administrative login by Unix domain socket 2 local all postgres md5 Reinicia el servidor de PostgreSQL tecleando en tu terminal: 1 sudo /etc/init.d/postgresql restart (9) Para finalizar la instalación recomendamos instalar el programa “PGADMIN3”. Para esto tecleamos dentro de la consola el siguiente comando “sudo apt-get install pgadmin3 ”INSTALACIÓN (Windows 7 x64)Abriremos un navegador web y accederemos a la URL: http://www.postgresql.org/download/windowsEn nuestro caso descargaremos la versión aún no estable 9.1.5 para Windows de 64 bitsUna vez descargado el archivo de instalación de PostgreSQL pulsaremos con el botón derecho delratón sobre él y seleccionaremos "Ejecutar como administrador": Página 6
  • 7. Si tenemos activado el control de cuentas de usuario nos mostrará una advertencia con el texto"¿Desea permitir que este programa realice cambios en el equipo?", pulsaremos "Sí" para continuarcon la instalación de PostgreSQL. Es importante realizar este paso ya que de no ejecutarlo así, nossaldrá un error en la instalación:Se iniciará el asistente para instalar PostgreSQL, pulsaremos "Siguiente":Indicaremos la carpeta de instalación de PostgreSQL, donde se guardarán los ejecutables, librerías yficheros de configuración de PostgreSQL: Página 7
  • 8. Indicaremos también la carpeta donde se guardarán los datos por defecto de PostgreSQL:Introduciremos la contraseña para el superusuario "postgres" que será con el que iniciemos sesiónpara administrar la base de datos:Introduciremos el puerto de escucha para la conexión con el servidor PostgreSQL, por defecto el5432:Seleccionaremos la configuración regional, en nuestro caso, Español - Argentina: Página 8
  • 9. Pulsaremos "Siguiente", se iniciará el asistente para instalar el motor de base de datos PostgreSQL,que creará las carpetas oportunas, copiará los ficheros necesarios y creará el servicio para iniciar deforma automática el motor de base de datos:Una vez finalizada la instalación el asistente nos dará la posibilidad de ejecutar Stack Builder,aplicación que nos permitirá instalar otros componentes y herramientas para PostgreSQL:Si hemos marcado la opción de Stack Builder, se iniciará, seleccionaremos "PostgreSQL 9.1.5 onport 5432" y pulsaremos "Next":Seleccionaremos las aplicaciones, componentes y herramientas a instalar y pulsaremos "Next": Página 9
  • 10. Se abrirá una ventana donde nos mostrará el progreso de la descarga de los paquetes adicionales.No se apresure, es un proceso lento dependiendo de la velocidad de conexión:Se iniciaran varias ventanas de instalación dependiendo de la cantidad de programas adicionaleselegidos. Es importante proceder con cautela en cada una, completando los recuadros de acuerdo alos parámetros elegidos al comienzo de la instalación (host, password, usuario, puerto, etc):También nos aparecerá una ventana donde nos permitirá crear una cuenta de postgre para validar elsoftware instalado. Deberemos completar con nuestros datos validos en la página web que se abrirá.Luego de esto, se nos enviará un mail al correo elegido para poder validar finalmente. Estasuscripción nos asignara un password aleatorio el cual deberemos cambiar para poder recordarlo. Elcambio de contraseña puede hacerse fácilmente desde el sitio web abierto luego de confirmar lacuenta presionando en el link recibido en el correo.Al finalizar toda la instalación, el asistente para instalar el servidor PostgreSQL habrá creado unservicio que estará iniciado y en tipo de inicio automático llamado: Página 10
  • 11. "postgresql-x64-9.1 – PostgreSQL Server 9.1":Y habrá creado la carpeta en archivos de programa "PosgreSQL" con las subcarpetas:Con esto habremos convertido nuestro equipo Microsoft Windows 7 en un servidor de base de datosPostgreSQL.Si queremos que los equipos de nuestra red tengan acceso al servidor PostgreSQL y tenemos algúncortafuegos (firewall) deberemos abrir el puerto 5432. Y si queremos que se tenga acceso desdeInternet al servidor PostgreSQL deberemos redireccionar (mapear) el puerto 5432 en el router ocortafuegos de nuestra empresa.2) Una vez instalados determinar las herramientas (software para el usuario, para el Página 11
  • 12. Administrador, generador de consultas, etc) que trae el paquete y describir cada una deellas.De la instalación realizada en el paso anterior podemos reconocer el siguiente conjunto deherramientas:Ubuntu 12.04 x86: • libpq5: Libreria cliente de PostgreSQL C • postgresql-client-common: Administrador para multiples versiones de clientes PostgreSQL. • postgresql-common: PostgreSQL database-cluster manager • pgAdmin3: El máximo exponente de cliente gráfico de PostgreSQL es el software pgAdmin3 que tiene licencia “Artist License”, aprobada por la FSF. En pgAdmin3 podemos ver y trabajar con casi todos los objetos de la base de datos, examinar sus propiedades y realizar tareas administrativas. Tiene soporte para Agregados, Constraints, Bases de datos, Funciones, Grupos, Índices, Lenguajes (PLpgsql, PLpython, PLperl, etc.), Clases de operadores, Servidores PostgreSQL, Reglas, Esquemas, Triggers, Usuarios, Vistas, etc. Una característica interesante de pgAdmin3 es que, cada vez que realizamos alguna modificación en un objeto, escribe la/s sentencia/s SQL correspondiente/s, lo que hace que, además de una herramienta muy útil, sea a la vez didáctica. pgAdmin3 también incorpora funcionalidades para realizar consultas, examinar su ejecución (como el comando explain) y trabajar con los datos.Windows 7 x64: • SQL Shell (psql): Este es la consola por la cual nos podemos conectar al motor, al iniciar nos pedirá los datos de conexión. Luego de completar todo nos permitirá hacer las consultas y cambios permitidos para el usuario logueado: • pgAdmin III: La herramienta más importante instalada con el servidor de BD. Con ella Página 12
  • 13. podremos hacer las siguientes cosas: Administración de PostgreSQL, creación de usuarios (roles), bases de datos, vistas, esquemas, tablespace, entre otras cosas. Para el acceso a la administración del motor de base de datos PostgreSQL accederemos al botón "Iniciar" - "PostgreSQL 9.1" - "pgAdmin III": Desplegaremos "Server Groups", dentro desplegaremos "Servidores" y dentro de éste pulsaremos con el botón derecho del ratón sobre "PostgreSQL 9.1 (localhost:5432), en el menú emergente seleccionaremos "Conectar": Introduciremos la contraseña para el superusuario postgres (la contraseña introducida en la instalación): Página 13
  • 14. Si todo es correcto nos conectaremos al servidor PostgreSQL, desde pgAdmin podremosconfigurar y administrar el servidor de PostgreSQL:Para crear un rol de login pulsaremos con el botón derecho del ratón sobre "Roles deLogin", seleccionaremos "Nueva Rol de Login":En la pestaña "Propiedades" introduciremos los siguientes datos:  Nombre del Rol: nombre del usuario, en nuestro caso "root".  Contraseña: contraseña para este usuario (rol): “admin”  La cuenta caduca: si queremos que la cuenta de usuario caduque en una fecha la estableceremos en este campo. Página 14
  • 15. También podremos crear un tableSpace que es donde se guardaran las bases de datos a crear en el futuro, es decir, se puede hacer que cada usuario tenga un tablespace diferente. En nuestro caso tendremos el tablespace “tp_dbavanzados” donde el usuario “root” guardara sus DB:• phpPgAdmin: Este es otro complemento instalado con el motor, nos permite gestionar la Base de Datos a través de un navegador como Internet Explorer, Chrome, etc. Página 15
  • 16. • Postgres Enterprise Manager: Similar a los anteriores solo que con mas características, con el podremos hacer BackUp o Restore, sacar estadísticas y Data Minning. La desventaja es que es de prueba:3) Describir los servicios que se activaron con el SO postgresql: Servidor de Base de Datos SQL objeto-relacional, version 9.1 postgresql-client: Aplicaciones front-end para PostgreSQL 9.1 Página 16
  • 17. 4) Diseñar una DB relacional y crearla y montarla en motor instalado (teniendo en cuenta lacreación de tablas, índices).Script de creación de elementos de la base de datos del modelo de arriba:CREATE TABLE "Ciudad"( idciudad integer NOT NULL DEFAULT nextval(ciudad_idciudad_seq::regclass), nombre character varying(250) NOT NULL, idprovincia integer NOT NULL, creado timestamp without time zone NOT NULL DEFAULT now(), CONSTRAINT ciudad_pkey PRIMARY KEY (idciudad ), CONSTRAINT ciudad_idprovincia_fkey FOREIGN KEY (idprovincia) Página 17
  • 18. REFERENCES "Provincia" (idprovincia) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION) WITH ( OIDS=FALSE);CREATE TABLE "Cliente"( idcliente serial NOT NULL, nombre character varying(50) NOT NULL, apellido character varying(50) NOT NULL, direccion integer NOT NULL, CONSTRAINT pk_idcliente PRIMARY KEY (idcliente ), CONSTRAINT fk_direccion FOREIGN KEY (direccion) REFERENCES "Direccion" (iddireccion) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION)WITH ( OIDS=FALSE);CREATE TABLE "Direccion"( iddireccion integer NOT NULL DEFAULTnextval(direccion_iddireccion_seq::regclass), calle character varying(50) NOT NULL, numero integer, fk_ciudad integer NOT NULL DEFAULTnextval(direccion_fk_ciudad_seq::regclass), CONSTRAINT pk_iddireccion PRIMARY KEY (iddireccion ), CONSTRAINT fk_ciudad FOREIGN KEY (fk_ciudad) REFERENCES "Ciudad" (idciudad) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION)WITH ( OIDS=FALSE);CREATE TABLE "Empleado"( idempleado serial NOT NULL, nombre character varying(50) NOT NULL, apellido character varying(30) NOT NULL, direccion integer NOT NULL, CONSTRAINT idempleado PRIMARY KEY (idempleado ), CONSTRAINT fk_direccion FOREIGN KEY (direccion) REFERENCES "Direccion" (iddireccion) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION)WITH ( OIDS=FALSE);CREATE TABLE "Familiar"( idfamiliar serial NOT NULL, nombre character varying(50) NOT NULL, apellido character varying(50) NOT NULL, direccion integer NOT NULL, CONSTRAINT pk_idfamiliar PRIMARY KEY (idfamiliar ), CONSTRAINT fk_direccion FOREIGN KEY (direccion) REFERENCES "Direccion" (iddireccion) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION Página 18
  • 19. )WITH ( OIDS=FALSE);CREATE TABLE "Grupo_familiar"( idgrupo_familiar integer NOT NULL DEFAULTnextval(grupo_familiar_idgrupo_familiar_seq::regclass), idfamiliar integer NOT NULL, relacion integer NOT NULL, idempleado integer NOT NULL, CONSTRAINT pk_idgrupo PRIMARY KEY (idgrupo_familiar , idfamiliar , idempleado), CONSTRAINT fk_familiar FOREIGN KEY (idfamiliar) REFERENCES "Familiar" (idfamiliar) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT fk_idempleado FOREIGN KEY (idempleado) REFERENCES "Empleado" (idempleado) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION, CONSTRAINT fk_relacion FOREIGN KEY (relacion) REFERENCES "Relacion" (idrelacion) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION)WITH ( OIDS=FALSE);CREATE TABLE "Pais"( idpais character(3) NOT NULL, nombre character varying(250) NOT NULL, creado timestamp without time zone NOT NULL DEFAULT now(), CONSTRAINT pais_pkey PRIMARY KEY (idpais ))WITH ( OIDS=FALSE);CREATE TABLE "Provincia"( idprovincia integer NOT NULL DEFAULTnextval(provincia_idprovincia_seq::regclass), nombre character varying(250) NOT NULL, idpais character varying(3) NOT NULL, creado timestamp without time zone NOT NULL DEFAULT now(), CONSTRAINT provincia_pkey PRIMARY KEY (idprovincia ), CONSTRAINT provincia_idpais_fkey FOREIGN KEY (idpais) REFERENCES "Pais" (idpais) MATCH SIMPLE ON UPDATE NO ACTION ON DELETE NO ACTION)WITH ( OIDS=FALSE);CREATE TABLE "Relacion"( idrelacion serial NOT NULL, nombre character varying(20) NOT NULL, CONSTRAINT pk_idrelacion PRIMARY KEY (idrelacion ))WITH ( OIDS=FALSE Página 19
  • 20. );5) Crear store procedures que permitan cargar datos en las tablas utilizando el leguaje deSQL.Básicamente la estructura de un Store Procedure es la siguiente:CREATE FUNCTION [nombre de la función] ([parámetros separados por comas])RETURNS [el tipo de dato que regresa] ASDECLARE aquí se definen las variables que se usarán.BEGIN indica el inicio de la función.SELECT INTO este comando permite que los resultados de las consultas seanasignados a variables. (no debe de confundirse con SELECT [columnas] INTO)RETURN Sale de la función y regresa el tipo de dato que se declaro después de lapalabra RETURNS del CREATE FUNCTIONEND indica el fin de la función LANGUAGE indica con que lenguaje esta escrita la función, puede ser unlenguaje de procedimiento (plpgsql) o de consulta (SQL).Creamos una función para convertir la primera letra en mayúscula:CREATE FUNCTION UpperCamelCase(varchar) RETURNS varchar ASDECLARE res varchar;BEGIN SELECT INTO res UPPER(SUBSTRING($1,1,1)) || LOWER(SUBSTRING($1,2)); return res;END;LANGUAGE plpgsql;Ahora escribiremos las funciones para insertar registros en algunas de las tablas.CREATE FUNCTION InsertarPais (varchar,varchar) RETURNS int ASDECLARE regs record; res numeric;BEGIN SELECT INTO regs count(nombre) FROM Pais WHERE nombre =UpperCamelCase($1); IF regs.count = 0 THEN INSERT INTO Pais (idpais,nombre) VALUES(UPPER($1,$2)); SELECT INTO res idpais FROM Pais WHERE idpais =UpperCamelCase($1); RETURN res; END IF; IF regs.count > 0 THEN SELECT INTO res idpais FROM Pais WHERE idpais =UpperCamelCase($1); RETURN res; END IF;END; LANGUAGE plpgsql;CREATE FUNCTION InsertarProvincia (varchar,varchar) RETURNS int ASDECLARE Página 20
  • 21. regs record; res numeric;BEGIN SELECT INTO regs count(nombre) FROM Provincia WHERE nombre =UpperCamelCase($1); IF regs.count = 0 THEN INSERT INTO Provincia (nombre,idpais) VALUES(UPPER($1,$2)); SELECT INTO res idprovincia FROM Provincia WHERE nombre =UpperCamelCase($1); RETURN res; END IF; IF regs.count > 0 THEN SELECT INTO res idprovincia FROM Provincia WHERE nombre =UpperCamelCase($1); RETURN res; END IF;END; LANGUAGE plpgsql;CREATE FUNCTION InsertarCiudad (varchar,numeric) RETURNS int ASDECLARE regs record; res numeric;BEGIN SELECT INTO regs count(nombre) FROM Ciudad WHERE nombre =UpperCamelCase($1); IF regs.count = 0 THEN INSERT INTO Ciudad (nombre,idprovincia)VALUES(UPPER($1,$2)); SELECT INTO res idciudad FROM Ciudad WHERE nombre =UpperCamelCase($1); RETURN res; END IF; IF regs.count > 0 THEN SELECT INTO res idciudad FROM Ciudad WHERE nombre =UpperCamelCase($1); RETURN res; END IF;END; LANGUAGE plpgsql; Página 21
  • 22. 6) Identificar las DBs pertenecientes a los metadatos. Hacer una descripción de cada una yanalizar la estructuras de sus tablas (las mas importantes).PostgreSQL posee un “catalog” (catalogo) e “information_schema” (esquema de informacion)robustos que proveen todo lo necesario para conocer sobre como una base de datos se arma.El “information_schema” consiste de un conjunto de views (vistas) que contienen informacionsobre los objetos definidos en la base de datos actual. El “information_schema” se encuentradefinido en el estandar SQL, por lo tanto le permite ser portable y altamente estable (a diferenciadel “catalogs” que es especifico a PostgreSQL). Las views (vistas) del “information_schema” nocontinenen informacion sobre caracteristicas especificas de PostgreSQL; para esto seria necesarioconsultar los “catalogs” (catálogos) del sistema u otros views específicos de PostgreSQL.Los “catalogs” del sistema son el lugar donde un sistema de bases de datos relacional almacena losmetadatos de esquema, tales como información sobre las tablas y columnas, y la información de lacontabilidad interna. Los “catalogs” del sistema de PostgreSQL son tablas normales. Podemoseliminar y volver a crear estas tablas, añadir columnas, insertar y actualizar valores, pero de esamanera podemos estropear nuestros sistemas. Normalmente, no hay que cambiar los catálogos delsistema a mano, siempre hay comandos SQL para hacerlo. (Por ejemplo, CREATE DATABASEinserta una fila en el catálogo pg_database - y de hecho crea la base de datos en el disco.) Hayalgunas excepciones para operaciones particularmente esotéricas, como la adición de métodos deacceso de index.Los “catalogs” del sistema los podemos encontrar dentro de la base de datos “pg_catalog”, dentrode ella las tablas que podemos encontrar son: Nombre del Catalog Propositopg_aggregate Agregacion de funcionespg_am metodos de acceso a indexspg_amop operadores de metodos de accesopg_amproc procedimientos de soporte a metodos de accesopg_attrdef valores por defecto de columnaspg_attribute columnas de tablas (“atributos”)pg_authid identificadores de autorizacion (roles)pg_auth_members Relaciones de Identificadores de autorizacion de miembrospg_cast casts (conversion de tipos de datos)pg_class tablas, indexes, sequencias, views ("relaciones") Constantes check, constantes unique, constantes primary key,pg_constraint constantes foreign key.pg_conversion informacion de conversion encriptadapg_database bases de datos dentro de este cluster de base de datospg_db_role_setting configuraciones por rol y por base de datospg_default_acl privilegios por defecto para tipos de objetos Página 22
  • 23. Nombre del Catalog Propositopg_depend dependencias entre objetos de la base de datospg_description descripciones o comentarios sobre los objetos de base de datospg_enum enumeración de etiquetas y valores de definiciopg_foreign_data_wrapper Definiciones de foreign-data wrapperpg_foreign_server Definiciones de foreign serverspg_index Informacion adicional de indexspg_inherits table inheritance hierarchypg_language Lenguajes para escribir funcionespg_largeobject Paginas de datos para objetos grandespg_largeobject_metadata metadata para grandes objetospg_namespace schemaspg_opclass clases de operadores de metodos de accesopg_operator operadorespg_opfamily Familias de operadores de metodos de accesopg_pltemplate template de datos para lenguajes proceduralespg_proc Funciones y procedimientospg_rewrite Reglas de reescritura de queryspg_shdepend Dependencias en objetos compartidospg_shdescription Comentarios en objetos compartidospg_statistic planner statisticspg_tablespace tablespaces del cluster de databasespg_trigger triggerspg_ts_config Configuraciones de busqueda de textopg_ts_config_map Configuraciones de busqueda de texto (token mappings)pg_ts_dict Diccionarios de busqueda de textopg_ts_parser Parsers de busqueda de textopg_ts_template Templates de busqueda de textopg_type data typespg_user_mapping mappings de usuarios para foreign servers Página 23
  • 24. Referencias:http://www.postgresql.orghttp://www.ajpdsoft.com/modules.php?name=News&file=article&sid=489#.UE1p2vJq3Ldhttp://xomalli.blogspot.com.ar/2010/09/trabajando-con-store-procedures-con.htmlhttp://phenobarbital.wordpress.com/2008/02/25/descubriendo-la-metadata-de-una-tabla-postgresql/http://grover.open2space.com/content/postgresql-meta-datahttp://www.postgresql.org/docs/9.0/interactive/information-schema.htmlhttp://www.postgresql.org/docs/9.0/interactive/catalogs-overview.htmlhttp://www.postgresql.org.es/node/297http://www.postgresqlya.com.ar/http://www.dataprix.com/8-cliente-grafico-pgadmin3http://www.pgadmin.org/http://www.arpug.com.ar/trac/wiki/PgAdminhttp://es.wikipedia.org/wiki/PostgreSQLhttp://lobotuerto.com/blog/2012/08/30/como-instalar-postgresql-en-ubuntu/http://socrateos.blogspot.com.ar/2012/08/installing-postgresql-91-on-ubuntu-1204.htmlhttp://www.guia-ubuntu.org/index.php?title=PostgreSQLhttp://stackoverflow.com/questions/8181604/postgres-9-1-vs-mysql-5-6-innodbhttp://www.wikivs.com/wiki/MySQL_vs_PostgreSQLhttp://www.aprendeinformaticaconmigo.com/postgresql-vs-mysql Página 24