Normalización de la base de datos
La normalización es el proceso que permite distribuir todos los campos de la
base de datos en tablas relacionadas entre sí, de forma que cumplan con el
funcionamiento esperado de la base de datos.
Ahora ya estamos preparados para comenzar un análisis más profundo de los
datos y la organización de los elementos individuales en grupos.
Como premisa fundamental partiremos del propio significado de relación, que
supone el agrupar en una misma tabla todos los campos de información
relacionados por su significado.
Para evitar la inconsistencia y duplicidad de datos emplearemos la técnica de
normalización para organizar los campos de datos en cada tabla. Sin entrar a
desarrollar la teoría que hay detrás de la normalización, usaremos
una serie de reglas que pueden aplicarse para determinar si nuestro diseño tiene
sentido.
- Cada campo de una tabla debe contener un único tipo de información.
Esto significa que deberíamos dividir los campos complejos y evitar la
repetición de grupos de información. Ejemplo: Sería conveniente separar en
campos diferentes el nombre y los apellidos de un cliente, o dividir la
dirección del mismo en los campos necesarios.
- Claves principales. Cada tabla debe tener un único identificador o
clave principal, que debe estar formado por uno o varios campos de la
tabla. En una base de datos relacional, cada uno de los registros de cualquier
tabla debe ser identificado de forma única. Es decir, algún campo o
combinación de varios debe albergar un valor único para cada registro de la
tabla. Este identificador es lo que denominamos clave principal. Como regla
general deberíamos usar como clave principal el campo más corto que
identifique a cada registro. No obstante es recomendable la creación de campos
artificiales para ser usados como clave principal.
- Dependencia funcional. Para cada valor único de la clave principal, los
valores de las columnas de datos deben estar relacionados y deben describir
completamente el contenido de la tabla. Esta regla opera de dos formas:
- En primer lugar no debería haber en una tabla un dato que no sea relevante
del asunto o materia del que trata la tabla. Por ejemplo, aunque es necesaria
la información del cliente para cada pedido, los clientes serían un asunto
independiente y tendrían su propia tabla.
- En segundo lugar los datos de la tabla deberían describir completamente la
materia de la que trata la tabla.
Por ejemplo, un pedido podría ser enviado a una dirección diferente a la del
cliente, por lo que la adición de la dirección de envío a la tabla pedido
haría que la información fuese mas completa.
Mas técnicamente decimos que dados dos campos, A y B, se dice que B es
funcionalmente dependiente de A si para cada valor de A existe un valor de B,
y solo uno, asociado con el. A y B pueden ser
compuestos, es decir pueden ser conjuntos de campos en lugar de campos
simples.
- Independencia de los campos. Debe ser posible realizar cambios en
cualquier campo que no forme parte de la clave principal sin que para ello se
vea afectado cualquier otro campo. Si incluyéramos la compañía de envío y su
teléfono en la tabla de pedidos, y la compañía cambia su
numero de teléfono habría de ser modificado en muchos registros.
 |
Normalización de la base de datos |
Una vez realizado este estudio llega el momento de crear las tablas, para
ello colocaremos en cada tabla aquellos campos del tipo Nuevo, teniendo cuidado
de que en cada tabla no haya ningún campo que se repita. Por ejemplo, en la
tabla de pedidos no colocaremos el código del producto ya que en un pedido puede
haber varios productos, para solucionar esto crearemos una tabla auxiliar que
llamaremos Detalles de pedidos, en la que incluiremos los campos: clave del
producto, PrecioUnidad, Cantidad y Descuento.
En nuestro ejemplo llegamos a la conclusión de que son necesarias seis
tablas
|
Tabla Clientes |
| Nombre |
Tipo |
Tamaño |
Otras propiedades |
| IdCliente |
|
|
clave |
| NombreCompañía |
|
|
|
| NombreContacto |
|
|
|
| CargoContacto |
|
|
|
| Dirección |
|
|
|
| Ciudad |
|
|
|
| Región |
|
|
|
| CódPostal |
|
|
|
| País |
|
|
|
| Teléfono |
|
|
|
| Fax |
|
|
|
|
Tabla Compañías de envíos |
| Nombre |
Tipo |
Tamaño |
Otras propiedades |
| IdCompañíaEnvíos |
|
|
clave |
| NombreCompañía |
|
|
|
| Teléfono |
|
|
|
|
Tabla Detalles de pedidos |
| Nombre |
Tipo |
Tamaño |
Otras propiedades |
| IdPedido |
|
|
clave |
| IdProducto |
|
|
clave |
| PrecioUnidad |
|
|
|
| Cantidad |
|
|
|
| Descuento |
|
|
|
|
Tabla Empleados |
| Nombre |
Tipo |
Tamaño |
Otras propiedades |
| IdEmpleado |
|
|
clave |
| Apellidos |
|
|
|
| Nombre |
|
|
|
| Cargo |
|
|
|
| Tratamiento |
|
|
|
| FechaNacimiento |
|
|
|
| FechaContratación |
|
|
|
| Dirección |
|
|
|
| Ciudad |
|
|
|
| Región |
|
|
|
| CódPostal |
|
|
|
| País |
|
|
|
| TelDomicilio |
|
|
|
| Extensión |
|
|
|
| Foto |
|
|
|
| Notas |
|
|
|
| Jefe |
|
|
|
|
Tabla
Pedidos |
| Nombre |
Tipo |
Tamaño |
Otras propiedades |
| IdPedido |
|
|
clave |
| IdCliente |
|
|
|
| IdEmpleado |
|
|
|
| FechaPedido |
|
|
|
| FechaEntrega |
|
|
|
| FechaEnvío |
|
|
|
| FormaEnvío |
|
|
|
| Cargo |
|
|
|
| Destinatario |
|
|
|
| DirecciónDestinatario |
|
|
|
| CiudadDestinatario |
|
|
|
| RegiónDestinatario |
|
|
|
| CódPostalDestinatario |
|
|
|
| PaísDestinatario |
|
|
|
|
Tabla Productos |
| Nombre |
Tipo |
Tamaño |
Otras propiedades |
| IdProducto |
|
|
clave |
| NombreProducto |
|
|
|
| CantidadPorUnidad |
|
|
|
| PrecioUnidad |
|
|
|
A continuación vamos a ver un método mecánico para diseñar las tablas de la
base de datos (normalizar).
Recordemos la definición técnica de dependencia funcional: dados dos campos,
A y B, se dice que B es funcionalmente dependiente de A si para cada valor de A
existe un único valor de B, asociado con él.
Empezamos tomando aquellos campos que de una manera clara serán claves en
alguna tabla como por ejemplo el Idcliente. Para saber si un campo depende
funcionalmente de otro nos hacemos el siguiente razonamiento:
- ¿Si conozco el Idcliente, existe un único apellido del cliente asociado a el?,
SI, luego los apellidos dependen
funcionalmente del campo Idcliente. (Idcliente Þ apellidos
)
- ¿Si conozco el IdPedido existe un único Producto en el pedido asociado a el?,
NO, ya que un pedido puede no tener un único producto, por lo tanto el producto
no depende funcionalmente de IdPedido.
 |
Obtención
de todas las dependencias funcionales |
| IdPedido Þ FechaPedido IdPedido Þ
FechaEntrega
IdPedido Þ FechaEnvío
IdPedido Þ FormaEnvío
IdPedido Þ Cargo
IdPedido Þ IdCliente
IdPedido Þ NombreCompañía
IdPedido Þ NombreContacto
IdPedido Þ Dirección
IdPedido Þ Ciudad
IdPedido Þ Región
IdPedido Þ CódPostal
IdPedido Þ País
IdPedido Þ Destinatario
IdPedido Þ DirecciónDestinatario
IdPedido Þ CiudadDestinatario
IdPedido Þ RegiónDestinatario
IdPedido Þ CódPostalDestinatario
IdPedido Þ PaísDestinatario
IdPedido Þ NombreProducto
IdPedido Þ IdEmpleado
IdPedido Þ NombreEmpleado
|
IdPedido, IdProducto Þ PrecioUnidad
IdPedido, IdProductoÞ Cantidad
IdPedido, IdProductoÞ Descuento
IdCliente Þ NombreCompañía
IdCliente Þ NombreContacto
IdCliente Þ CargoContacto
IdCliente Þ Dirección
IdCliente Þ Ciudad
IdCliente Þ Región
IdCliente Þ CódPostal
IdCliente Þ País
IdCliente Þ Teléfono
IdCliente Þ Fax
IdProducto Þ NombreProducto
IdProducto Þ CantidadPorUnidad
IdProducto Þ PrecioUnidad
IdCompañíaEnvíos Þ NombreCompañíaEnvíos
IdCompañíaEnvíos Þ Teléfono
|
IdEmpleado Þ Nombre IdEmpleado Þ
Apellidos
IdEmpleado Þ Cargo
IdEmpleado Þ TratamientoEmp
IdEmpleado Þ FechaNacimiento
IdEmpleado Þ FechaContratación
IdEmpleado Þ Dirección
IdEmpleado Þ Ciudad
IdEmpleado Þ Región
IdEmpleado Þ CódPostal
IdEmpleado Þ País
IdEmpleado Þ TelDomicilio
IdEmpleado Þ Extensión
IdEmpleado Þ Foto
IdEmpleado Þ Notas
IdEmpleado Þ Jefe
|
Notar que en el caso del PrecioVenta de un producto este depende a la vez del
IdProducto y del IdPedido, es decir va a tener una clave doble.
Esta relación contiene todas las dependencias funcionales que yo he visto,
aunque posiblemente podrían determinarse mas de las que aquí aparecen. A partir
de ahora se trata de simplificar hasta lograr una cobertura mínima, es decir que
un campo no puede depender funcionalmente mas que de una clave.
Para realizar el proceso de simplificar, nos basaremos en la siguiente
propiedad:
Si tenemos que A Þ B, y B Þ
C, se puede deducir la dependencia A Þ C, siendo esta
última dependencia redundante (sobrante).
En nuestro ejemplo tenemos que IdPedido Þ
IdEmpleado, y
IdEmpleado Þ Nombre, luego la expresión
IdPedido Þ Nombre, es redundante y podemos
eliminarla. Continuaremos este proceso de simplificación hasta obtener una
cobertura mínima en la que aparezcan todos los campos una sola vez.
 |
Simplificación y obtención de las tablas |
| IdPedido Þ FechaPedido IdPedido Þ
FechaEntrega
IdPedido Þ FechaEnvío
IdPedido Þ FormaEnvío
IdPedido Þ Cargo
IdPedido Þ IdCliente
IdPedido Þ NombreCompañía
IdPedido Þ NombreContacto
IdPedido Þ Dirección
IdPedido Þ Ciudad
IdPedido Þ Región
IdPedido Þ CódPostal
IdPedido Þ País
IdPedido Þ Destinatario
IdPedido Þ DirecciónDestinatario
IdPedido Þ CiudadDestinatario
IdPedido Þ RegiónDestinatario
IdPedido Þ CódPostalDestinatario
IdPedido Þ PaísDestinatario
IdPedido Þ NombreProducto
IdPedido Þ IdEmpleado
IdPedido Þ NombreEmpleado
|
IdPedido, IdProducto Þ PrecioUnidad
IdPedido, IdProductoÞ Cantidad
IdPedido, IdProductoÞ Descuento
IdCliente Þ NombreCompañía
IdCliente Þ NombreContacto
IdCliente Þ CargoContacto
IdCliente Þ Dirección
IdCliente Þ Ciudad
IdCliente Þ Región
IdCliente Þ CódPostal
IdCliente Þ País
IdCliente Þ Teléfono
IdCliente Þ Fax
IdProducto Þ NombreProducto
IdProducto Þ CantidadPorUnidad
IdProducto Þ PrecioUnidad
IdCompañíaEnvíos Þ NombreCompañíaEnvíos
IdCompañíaEnvíos Þ Teléfono
|
IdEmpleado Þ Nombre IdEmpleado Þ
Apellidos
IdEmpleado Þ Cargo
IdEmpleado Þ TratamientoEmp
IdEmpleado Þ FechaNacimiento
IdEmpleado Þ FechaContratación
IdEmpleado Þ Dirección
IdEmpleado Þ Ciudad
IdEmpleado Þ Región
IdEmpleado Þ CódPostal
IdEmpleado Þ País
IdEmpleado Þ TelDomicilio
IdEmpleado Þ Extensión
IdEmpleado Þ Foto
IdEmpleado Þ Notas
IdEmpleado Þ Jefe
|
Hacemos limpieza borrando los que se han tachado, y obtenemos las tablas de la base
de datos sin mas que definir una tabla por cada conjunto de dependencias
funcionales de la misma clave

 |
Conclusiones finales del capítulo |
|