Documentos de Académico
Documentos de Profesional
Documentos de Cultura
htm
Un Arbol-B es una estructura que posee forma de árbol que crece de la raíz hacia la hojas. En
un arból habrá un nodo raíz el cuál tendrá N hijos. A su vez cada hijo de la raíz puede tener N
hijos y así sucesivamente. A cada camino que se va formando se lo llama rama. Aquellos
nodos que se encuentren al final de cada rama se los denomina hoja.
Si se arma un Arbol-B sobre una columna, por ejemplo CODIGO de la tabla CLIENTES, en
promedio para buscar un CODIGO en una tabla de 1.000.000 de registros, tomará 20 accesos.
Este valor es mucho menor a barrerse el millón de registros.
Los índices se crearán sobre las columnas en las cuales hagamos consultas frecuentemente.
Por lo expuesto anteriormente, no es beneficioso poner índices en todas las columnas. Por lo
tanto, habrá que analizar que consultas se harán y en donde conviene crear los índices.
Internamente, MySQL, al determinar una(s) columna(s) como clave primaria, generará un
índice único sobre dichas columnas. Por lo tanto, sobre la clave primaria siempre se tiene
buena velocidad de acceso. Esto se debe a que las relaciones siempre se hacen sobre las
claves primarias por lo tanto si no se posee dicha columna indexada tomará mucho tiempo
relacionar dos tablas.
Los índices pueden o no aceptar valores duplicados. Si creamos un índice único, entonces los
valores de esa columna nunca se repetirán. Cuando utilizabamos el UNIQUE en el CREATE
TABLE, lo que se creabá era un índice que aseguraba esto.
Una vez creado el índice MySQL se encargará automaticamente de determinar cuando
conviene utilizarlo y cuando no. Por lo tanto, no hará falta en cada consulta escribir
explicitamente que índice debe usar ni como.
Una vez creado el índice es posible eliminarlo si hace falta. Para ello se utlizará el comando
DROP INDEX de la siguiente forma:
Integridad Referencial
Cuando comenzamos a hablar de base de datos hicimos mención de la integridad
referencial. La integridad referencial significa poder decirle al motor explícitamente que
campo hace referencia a que clave primaria de que tabla. Por lo tanto, tendriamos las
relaciones metidas dentro del motor(reglas de integridad), lo cual nos asegura que la base
siempre esta en un estado consistente. Esto significa que nunca encontraríamos relaciones
mal hechas o códigos que no existen.
Las tablas estandar (MyISAM) no pueden utilizar integridad referencial. Para ello hay que crear
las tablas del tipo InnoDB como hemos visto en clases anteriores (utilizando la opción TYPE en
el CREATE TABLE). Además existe otra restricción: para crear una relación ambas columnas, la
clave foránea como la clave referenciada, deben tener un índice creado. Esto se debe a que en
el caso contrario, la performance disminuiría significativamente con cada INSERT, DELETE y
UPDATE ya que las reglas de integridad se deben verificar en cada una de estas operaciones.
Para definir una relación entre dos tablas utilizaremos la sentencia ALTER TABLE de la
siguiente forma:
tabla
ADD [CONSTRAINT nombre_constraint] FOREIGN KEY (columnas_clave_foranea)
REFERENCES tabla_independiente (columnas_independiente
Aquí tabla es la tabla que posee una columna que es clave foránea. Esta es la columna que
hará referencia a otra tabla.
nombre_constraint es el nombre que se le dará a la relación. Esta alternativa (es opcional)
existe simplemente para respetar el estándar ya que MySQL la ignora.
columnas_clave_foranea son el nombre de la o las columnas (separadas por comas) que
hacen referencia a la tabla independiente.
tabla_independiente es la tabla la cual es referenciada y columnas_independientes su clave
primaria (que deberán concordar con las de columnas_clave_foranea).
ALTER TABLE VENTAS ADD FOREIGN KEY (VAS_CES_ID) REFERENCES CLIENTES (CES_ID);
Como recomendación práctica diremos que es mejor, dentro del script que generá la base de
datos, definir primero todas las tablas y luego todas las relaciones. De esta forma siempre que
se vaya a definir una relación ya se poseen las tablas intervinientes creadas y no hay que
estar moviendo definiciones por todo el archivo para que al momento de definir la relación
ambas tablas existan.
Por último veamos las opciones restantes ON DELETE y ON UPDATE. Esta reglas le dicen al
motor que hacer en caso que se borre o actualice el valor de la clave referenciada (en el
ejemplo CES_ID de CLIENTES). Hay 4 acciones posibles: CASCADE, SET NULL, NO ACTION y
RESTRICT. Las acciones son similares para DELETE y UPDATE con la única diferencia que DELETE
borrará y UPDATE actualizará.
La opción CASCADE propagará la operación a las tablas referenciadas. En el ejemplo, si
borramos un cliente se borrarán de la tabla VENTAS todos los registros que contengan a ese
cliente.
La alternativa SET NULL pondrá el valor NULL en la columna de la clave foránea (VAS_CES_ID)
si y solo si la columna acepta valores nulos. Si no los acepta no se podrá realizar la operación
(el DELETE o UPDATE fallarán).
La opción NO ACTION (no recomendada) no tomará ninguna acción y la base quedará en un
estado inconsistente.
Finalmente, la opción RESTRICT prohibirá la ejecucíon del DELETE o del UPDATE y nunca podrá
ser eliminada o actualizada la clave primaria de la tabla independiente.
Ejercicios
1. ¿Para que se utilizan los indices?
2. ¿Que ventajas trae utilizar indices?
3. ¿Que desventajas trae utilizar indices?
4. Se pide agregar todas las reglas de integridad referencial a la agenda creada
anteriormente.
5. Se pide agregar todas las reglas de integridad referencial al sistema generado a
voluntad.