2. El modelo relacional y el álgebra relacional

2. El modelo relacional y el álgebra relacional carlos Wed, 11/25/2009 - 10:49

Visto el proyecto planteado, decidimos hacer las cosas bien hechas para, de paso, impresionar a nuestro jefe con nuestros conocimientos en bases de datos. El primer paso será presentarle un documento que describa el modelo relacional que vamos a utilizar, en el que incluiremos algunas consultas de muestra para que pueda comprobar qué será capaz de hacer con nuestro proyecto cuando esté acabado.

 

2.1. Determinar las relaciones

2.1. Determinar las relaciones carlos Wed, 11/25/2009 - 10:51

En primer lugar determinaremos las relaciones, sus atributos y los dominios de cada uno de ellos:

 

PETICION(referencia, cliente, resumen, estado, fecharecepcion, fechainicio, fechafin, tiempoempleado)
NOTA_PETICION(peticion, nota, fecha, empleado)
MATERIAL_PETICION(nombrematerial, peticion, cantidad, precio)
CLIENTE(nombre, nif, telefono, email)
EMPLEADO(nombre, nif)

 

En la relación PETICION, hemos decidido que convendría tener una referencia interna de la petición, que nos ayudará al hablar de ella con el cliente (si tuviese varias abiertas) y evitará confusiones al trabajar. El resto de atributos son bastante explícitos.

 

Como una petición puede evolucionar con el tiempo, a medida que se piden más datos al cliente, la incidencia va evolucionando, etc., hemos creado las relaciones NOTA_PETICION y MATERIAL_PETICION para reflejarlo.

 

También hemos tenido que definir las relaciones CLIENTE y EMPLEADO para poder relacionarlas con las peticiones y las notas que se vayan generando durante su resolución.

 

A continuación vamos a definir los dominios de los atributos:

 

 

PETICION:
dominio(referencia)=números
dominio(cliente)=NIF
dominio(resumen)=texto
dominio(estado)=estados
dominio(fecharecepcion)=fechayhora
dominio(fechainicio)=fechayhora
dominio(fechafin)=fechayhora
dominio(tiempoempleado)=horasyminutos
NOTA_PETICION:
dominio(peticion)=números
dominio(nota)=texto
dominio(fecha)=fechayhora
dominio(empleado)=NIF
MATERIAL_PETICION:
dominio(nombrematerial)=nombreMaterial
dominio(peticion)=números
dominio(precio)=precio
dominio(cantidad)=números
CLIENTE:
dominio(nombre)=nombreCliente
dominio(nif)=NIF
dominio(telefono)=teléfonos
dominio(email)=emails
EMPLEADO:
dominio(nombre)=nombreEmpleado
dominio(nif)=NIF

 

Al definir los dominios de cada atributo, ya nos hemos avanzado en la toma de algunas decisiones: al decidir, por ejemplo, que el dominio del atributo empleado en la relación NOTA_PETICION es NIF, estamos implícitamente determinando que la clave primaria de la relación EMPLEADO será del dominio NIF y que usaremos un atributo de este dominio para referirnos a él.

 

Este proceso descrito indicando directamente su resultado, normalmente es fruto de  una revisión de las entidades a medida que se van definiendo y analizando las necesidades de éstas.

 

Nota

La regla de integridad del modelo correspondiente a la clave primaria obligará a que no existan dos notas sobre la misma petición hechas en la misma fecha y hora por parte del mismo empleado, lo cual es perfectamente lícito y coherente.

 

 

 

 

 

 

 

 

 

2.2. Definición de claves

2.2. Definición de claves carlos Wed, 11/25/2009 - 11:33

Aunque algunas claves ya se intuyen a partir de los atributos de las relaciones, vamos a determinarlas para completar el caso.

En todos los casos sólo tenemos
una clave candidata y, por lo tanto, no caben dudas a la hora de escoger la clave primaria. Esto no tiene por que ser así: en la relación EMPLEADO, podríamos haber incluido más atributos (número de la seguridad social, un número de empleado interno, etc.) que serían claves candidatas susceptibles de ser clave primaria.

PETICION:
Claves candidatas: {referencia}
Clave  primaria: {referencia}
NOTA_PETICION:
Claves candidatas: {peticion,fecha,empleado} Clave primaria: {peticion,fecha,empleado}
MATERIAL_PETICION:
Claves candidatas: {nombrematerial,peticion} Clave primaria: {nombrematerial,peticion}
CLIENTE:
Claves candidatas: {nif}
Clave primaria: {nif}
EMPLEADO:
Claves candidatas: {nif}
Clave primaria: {nif}

 

Ahora podemos reescribir las relaciones:

 

PETICION(referencia, cliente, resumen, estado, fecharecepcion, fechainicio, fechafin, tiempoempleado)
NOTA_PETICION(peticion, nota, fecha, empleado) MATERIAL_PETICION(nombrematerial, peticion, cantidad, precio)
CLIENTE(nombre, nif, telefono, email)
EMPLEADO(nombre, nif)

 

Las claves foráneas ya se intuyen a partir de las relaciones, aunque vamos a comentarlas para completar el caso:

 

NOTA_PETICION:

 

Tiene de clave foránea el atributo {peticion}, que establece la relación (y pertenece al mismo dominio) con el atributo {referencia} de la relación PETICION.

También tiene la clave foránea {empleado}, que establece la relación con EMPLEADO a partir de su clave primaria {nif}.

 

MATERIAL_PETICION:

 

Tiene de clave foránea el atributo {peticion}, que establece la relación (y pertenece al mismo dominio) con el atributo {referencia} de la relación PETICION.

2.3. Reglas de integridad

2.3. Reglas de integridad carlos Wed, 11/25/2009 - 11:40

En este punto, no es necesario preocuparse por las reglas de integridad del modelo que tratan sobre la clave primaria, ya que nos vendrán impuestas en el momento de crear las tablas en el SGBD.

 

Es conveniente, no obstante, fijar las decisiones sobre la integridad referencial; en concreto, qué vamos a hacer en caso de restricción. Así pues, para cada re- lación que tiene una clave primaria referenciada desde otra, deberemos decidir qué política cabe aplicar en caso de modificación o borrado:

 

PETICION

 

• Modificación del atributo {referencia} referenciado desde NOTA_PETICION y MATERIAL_PETICION: aquí podemos optar por la restricción o por la actualización en cascada (más cómoda, aunque no todos los SGBD la implementan, como veremos más adelante).

 

• Borrado del atributo {referencia}. Aquí optaremos por una política de restricción. Si la petición tiene notas asociadas o materiales, significa que ha habido alguna actividad y, por lo tanto, no deberíamos poder borrarla. Si se desea anularla, ya estableceremos un estado de la misma que lo indique.

 

CLIENTE

 

• Modificación del atributo {nif} referenciado desde PETICION. Es probable que si un cliente cambia de NIF (por un cambio del tipo de sociedad, etc.) deseemos mantener sus peticiones. Aquí la política debe ser de actualización en cascada.

 

• Borrado del atributo {nif}. Es posible que si queremos borrar un cliente, es porque hemos terminado toda relación con él y, por lo tanto, es coherente utilizar aquí la política de anulación.

 

EMPLEADO

 

• Modificación del atributo {nif} referenciado desde NOTA_PETICION. No es probable que un empleado cambie su NIF, salvo caso de error. Aun así, en caso de que se produzca, es preferible la actualización en cascada.

 

• Borrado del atributo {nif}. Aunque eliminemos un empleado si termina su relación con la empresa, no deberíamos eliminar sus notas. La mejor opción es la restricción.

2.4. Álgebra relacional

2.4. Álgebra relacional carlos Wed, 11/25/2009 - 11:45

Para probar el modelo, una buena opción es intentar realizar algunas consultas sobre él y ver si obtenemos los resultados deseados. En nuestro caso, vamos

a realizar las siguientes consultas:

 

• Obtención de una petición junto con los datos del cliente:

 

R:= PETICION [cliente=nif] CLIENTE

 

• Obtención de una petición con todas sus notas:

 

NP(peticionnota, nota, fechanota, empleado):=NOTA_PETICION(peticion, nota, fecha, empleado) R:=PETICION[peticion=peticionnota]NOTA_PETICION

 

• Obtención de los datos de todos los empleados que han participado en la petición 5:

 

NP:=NOTA_PETICION[peticion=5] RA:=EMPLEADO[nif=empleado]NP
R:=RA[nombre,nif]

 

Ejercicio

Os sugerimos que intentéis más operaciones sobre el modelo para familiarizaros con él.