miércoles, 27 de febrero de 2008

motor InnoDB de MySQL y Tablas Relacionales

Hola amig@s, en esta ocasion quiero escribir sobre el motor innodb que es un motor de base de datos que trae el mysql, junto con el MyISAM; por defecto cuando trabajamos con MySQL que viene con el paquete appserv (para windows) el motor de base de datos innodb esta desactivado, para activarlo, basta con modificar el my.conf que se encuentra en la carpeta donde se instala la aplicacion en mi caso:

D:\AppServ\MySQL\my.ini

la linea que dice

#default-storage-engine=INNODB


debemos descomentar, esto hacemos removiendo el '#' que tiene al comienzo y mas abajo buscamos una linea que dice:

skip-innodb

y la comentamos agregando antes el simbolito '#' (sin las comillas) y listo, reiniciamos el servicio de mysql que en windows hacemos escribiendo:

net stop mysql

y luego

net start mysql


y ya debería estar activado, ahora ya se pueden usar foreing keys en las tablas
para hacer esto probamos con el phpMyAdmin donde podemos hacerlo de una forma muy sencilla tanto escribiendo el código SQL o utilizando el modo grafico (que ayuda mucho) para dar un ejemplo voy a hacerlo en forma de texto es decir codigo sql vamos a crear tres tablas, de las cuales una va a tener dos clave foraneas de las otras dos tablas; el ejemplo seria de la siguiente manera:

tendremos una tabla usuario, otra tabla que se llame preferencias (que por ejemplo tiene las distintas preferencias en una pagina web) y otra tabla que se llame preferencia de usuarios donde se almacenara las preferencias de cada usuario

CREATE TABLE `usuario`
(

`id` int(10) NOT NULL auto_increment,
`nombre` varchar(50) NULL,
`apellido` varchar(50) NULL,
`email` varchar(100) NOT NULL,
primary key (`id`)
);


CREATE TABLE `preferencias`
(

`id` int(10) NOT NULL auto_increment,
`nombre` varchar(20) NULL,
`descripcion` text NULL,
primary key(`id`)
);


CREATE TABLE `preferencias_usuarios`
(

`id_usuario` int(10) NOT NULL,
`id_preferencia` int(10) NOT NULL,
PRIMARY KEY (`id_usuario`,`id_preferencia`)
);


ALTER TABLE preferencias_usuarios
ADD CONSTRAINT nombre_del_constraint FOREIGN KEY (id_usuario)
REFERENCES usuario(id)
ON DELETE CASCADE ON UPDATE CASCADE,

ADD CONSTRAINT nombre_otro_constraint FOREIGN KEY (id_preferencia) REFERENCES preferencias(id) ON DELETE CASCADE ON UPDATE CASCADE;

de este modo podemos cargar usuarios luego servicios y por ultimo las preferencias de nuestro usuario y para probar que funciona cambiamos o 'editamos' nuestra tabla usuarios y editamos el id, luego revisamos en la tabla preferencias de usuarios para ver si se actualizaron los campos asi de sencillo con esto logramos mantener la integridad de nuestros datos y nos quita la tediosa tarea de hacer todos estos controles por código

otra forma de crear los foreign key es desde la misma definicion de la tabla pero para esto importa muchisimo el orden de creacion de tablas, para nuestro sencillo ejemplo es claro que primero deben crearse las tablas usuario y preferencias para luego crear la ultima tabla.

la forma seria similar a esto:

create table `preferencias_usuarios2`
(
`id_preferencia` int(10) not null,
`id_usuario` int(10) not null,
primary key (`id_preferencia`,`id_usuario`),
foreign key(`id_preferencia`) references preferencias(id) ON UPDATE CASCADE ON DELETE CASCADE,
foreign key (`id_usuario`) references usuario(id) on update cascade on delete cascade
);


obs:
no soy ningún 'máster' en base de datos, la mayor parte de lo que se aprendí fue leyendo practicando y 'quemando' osea no es 100% técnico lo que digo pero creo que se entiende y si piensan que algo no esta bien, ruego me envíen un mail a mi correo http://tinymailto.com/p431i7o o dejen su comentario en este blog

la informacion original sin 'mi toque' la pueden encontrar en la pagina oficial de mysql
http://dev.mysql.com/doc/refman/5.0/es/innodb-foreign-key-constraints.html por ultimo quiero aclarar que la base de datos usada para el ejemplo es la Versión del servidor: 5.0.24a-community-nt-log o algo asi. osea en sintesis la version 5.0

que ademas soporta 'stored procedures' y 'functions, que serian procedimientos y funciones almacenadas... de lo que hablare mas adelante cuando 'haya jugado' un poco mas con esto...

Eso es todo por ahora
hasta la proxima!!!!

4 comentarios:

  1. Se entiende muy bien y es muy util tu articulo, lo voy a probar y te cuento luego, saludos y gracias!

    ResponderEliminar
  2. HOla.
    GRacias por el documento.
    me ha sido muy util en mis estudios.

    Estuve estudiando un poco tu codigo, y estuve viendo tu ejemplo, y me tente hacer este otro, pero sabes... me gustaria que lo chekearas,

    CREATE TABLE `usuario` (

    `id` INT PRIMARY KEY,
    `nombre` varchar(50) NULL,
    `NUMERO` INT(20) NULL,
    `JoinDate` DATETIME,
    `email` varchar(100) NOT NULL,
    `To_preferencias_TABLE` CHAR(20) FOREIGN KEY REFERENCES preferencias,
    primary key (`id`)
    );

    CREATE TABLE `preferencias`
    (
    `id` int(10) NOT NULL auto_increment,
    `nombre` varchar(20) NULL,
    `descripcion` text NULL,
    primary key(`id`)
    );

    yo lo implementaria haci... pero apenas estoy aprendiendo SQL y no se si esta bien.

    Un saludo y gracias por el ejemplo, me ilustro mucho.

    chao

    ResponderEliminar
  3. Amigo, has realizado alguna base de datos de este tipo "relacional" utilizando php cómo gestor de la base de datos? en concreto quiero saber si cómo haces para que a travéz de formularios puedas rellenar cada sub-tabla, digamos tienes una tabla alumnos, con id, nombre, grado y otra tabla materias, con id, nombre de la materia, id de alumno, cómo haces por medio de php para saber id de la tabla almumno corresponde a ser llenado en la tabla materias?

    ResponderEliminar