2.- Base de Datos Relacional


1.- Base de Datos Relacional



Su idea fundamental es el uso de "relaciones". Estas relaciones podrían considerarse en forma lógica como conjuntos de datos llamados "tuplas".
Esto es pensando en cada relación como si fuese una tabla que está compuesta por registros (las filas de una tabla), que representarían las tuplas, y campos (las columnas de una tabla).

En este modelo, el lugar y la forma en que se almacenan los datos no tienen relevancia (a diferencia de otros modelos como el jerárquico y el de red).

Esto tiene la considerable ventaja de que es más fácil de entender y de utilizar para un usuario esporádico de la base de datos.

La información puede ser recuperada o almacenada mediante consultas que ofrecen una amplia flexibilidad y poder para administrar la información.

El lenguaje más habitual para construir las consultas a bases de datos relacionales es SQL, Structured Query Language o Lenguaje Estructurado de Consultas, un estándar implementado por los principales motores o sistemas de gestión de bases de datos relacionales.

Durante su diseño, una base de datos relacional pasa por un proceso al que se le conoce como normalización de una base de datos.

Un RDBMS es un Sistema Administrador de Bases de Datos Relacionales. RDBMS viene del acrónimo en inglés Relational Data Base Management System.

Los RDBMS proporcionan el ambiente adecuado para gestionar una base de datos.

Reglas de Codd
En 1985 el Dr. Edgar Frank Codd publicó trece reglas para evaluar si un DBMS (DataBase Management System) puede considerarse un RDBMS (Relational DataBase Management System), o dicho más concisamente, si un sistema de bases de datos puede considerarse o no relacional.

Regla 0
Para que un sistema se denomine sistema de administración de bases de datos relacionales, debe usar (exclusivamente) sus capacidades relacionales para gestionar la base de datos.

Regla de acceso garantizado.
Para todos y cada uno de los datos (valores atómicos) de una Base de Datos Relacional (BDR) se garantiza que son accesibles a nivel lógico utilizando una combinación de nombre de tabla, valor de clave primaria y nombre de columna.
  • Cualquier dato almacenado en una BDR tiene que poder ser direccionado unívocamente. Para ello hay que indicar en qué tabla está, cuál es la columna y cuál es la fila (mediante la clave primaria).
  • Por tanto se necesita el concepto de clave primaria, que no es soportado en muchas implementaciones. En estos casos, para lograr un efecto similar se puede hacer lo siguiente: 
  • Hacer que los atributos clave primaria no puedan ser nulos (NOT NULL). 
  • Crear un índice único sobre la clave primaria. 
  • No eliminar nunca el índice.
Tratamiento sistemático de valores nulos.
Los valores nulos (que son distintos de la cadena vacía, blancos, 0, ...) se soportan en los SGBD totalmente relacionales para representar información desconocida o no aplicable de manera sistemática, independientemente del tipo de datos.
  • Se reconoce la necesidad de la existencia de valores nulos, para un tratamiento sistemático de los mismos.
  • Hay problemas para soportar los valores nulos en las operaciones relacionales, especialmente en las operaciones lógicas. 
  • Lógica trivaluada. Es una posible solución, existen tres (no dos) valores de verdad: Verdadero, Falso y Desconocido (null). Se crean tablas de verdad para las operaciones lógicas:
    • null Y null = null
    • Verdadero Y null = null 
    • Falso Y null = Falso 
    • Verdadero O null = Verdadero 
    • etc.
Diccionario dinámico en línea basado en el modelo relacional.
La descripción de la base de datos se representa a nivel lógico de la misma manera que los datos normales, de modo que los usuarios autorizados pueden aplicar el mismo lenguaje relacional a su consulta, igual que lo aplican a los datos normales.

Regla del sublenguaje de datos completo
Un sistema relacional debe soportar varios lenguajes y varios modos de uso de terminal (ej: rellenar formularios, etc.). Sin embargo, debe existir al menos un lenguaje cuyas sentencias sean expresables, mediante una sintaxis bien definida, como cadenas de caracteres y que sea completo, soportando:
  • Definición de datos
  • Definición de vistas 
  • Manipulación de datos (interactiva y por programa) 
  • Limitantes de integridad 
  • Limitantes de transacción (iniciar, realizar, deshacer) (Begin, commit, rollback). 
  • Además de poder tener interfaces más amigables para hacer consultas, etc. siempre debe de haber una manera de hacerlo todo de manera textual, que es tanto como decir que pueda ser incorporada en un programa tradicional. 
  • Un lenguaje que cumple esto en gran medida es SQL.
Regla de actualización de vistas
Todas las vistas que son teóricamente actualizables se pueden actualizar por el sistema.
  • El problema es determinar cuáles son las vistas teóricamente actualizables, ya que no está muy claro.
  • Cada sistema puede hacer unas suposiciones particulares sobre las vistas que son actualizables.
Inserción, actualización y borrado de alto nivel
La capacidad de manejar una relación base o derivada como un solo operando se aplica no sólo a la recuperación de los datos (consultas), sino también a la inserción, actualización y borrado de datos.
Esto es, el lenguaje de manejo de datos también debe ser de alto nivel. Algunas bases de datos inicialmente sólo podían modificar las tuplas de la base de datos de una en una (un registro de cada vez).

Independencia física de los datos
Los programas de aplicación y actividades del terminal permanecen inalterados a nivel fisico cuandoquiera que se realicen cambios en las representaciones de almacenamiento o métodos de acceso.
El modelo relacional es un modelo lógico de datos, y oculta las características de su representación física.
Es la capacidad de modificar el esquema interno sin tener que alterar el esquema conceptual (o los externos). Por ejemplo, puede ser necesario reorganizar ciertos archivos físicos con el fin de mejorar el rendimiento de las operaciones de consulta o de actualización de datos. la independencia física se refiere sólo a la separación entre las aplicaciones y las estructuras físicas de almacenamiento.

Independencia lógica de los datos
Los programas de aplicación y actividades del terminal permanecen inalterados a nivel lógico cuando quiera que se realicen cambios a las tablas base que preservan la información.
  • Cuando se modifica el esquema lógico preservando información (no valdría p.ej. eliminar un atributo) no es necesario modificar nada en niveles superiores.
  • Ejemplos de cambios que preservan la información: 
    • Añadir un atributo a una tabla base. 
    • Sustituir dos tablas base por la unión de las mismas. Usando vistas de la unión puedo recrear las tablas anteriores...
Independencia de integridad.
Los limitantes de integridad específicos para una determinada base de datos relacional deben poder ser definidos en el sublenguaje de datos relacional, y almacenables en el catálogo, no en los programas de aplicación.
  • El objetivo de las bases de datos no es sólo almacenar los datos, sino también sus relaciones y evitar que estas (limitantes) se codifiquen en los programas. Por tanto en una BDR se deben poder definir limitantes de integridad.
  • Cada vez se van ampliando más los tipos de limitantes de integridad que se pueden utilizar en los SGBDR, aunque hasta hace poco eran muy escasos. 
  • Como parte de los limitantes inherentes al modelo relacional (forman parte de su definición) están: 
    • Una BDR tiene integridad de entidad. Es decir, toda tabla debe tener una clave primaria. 
    • Una BDR tiene integridad referencial. Es decir, toda clave externa no nula debe existir en la relación donde es primaria.
Independencia de distribución.
Una BDR tiene independencia de distribución.
  • Las mismas órdenes y programas se ejecutan igual en una BD centralizada que en una distribuida.
  • Las BDR son fácilmente distribuibles: 
  • Se parten las tablas en fragmentos que se distribuyen. 
  • Cuando se necesitan las tablas completas se recombinan usando operaciones relacionales con los fragmentos. 
  • Sin embargo se complica más la gestión interna de la integridad, etc. 
  • Esta regla es responsable de tres tipos de transparencia de distribución: 
    • Transparencia de localización. El usuario tiene la impresión de que trabaja con una BD local. (aspecto de la regla de independencia física) 
    • Transparencia de fragmentación. El usuario no se da cuenta de que la relación con que trabaja está fragmentada. (aspecto de la regla de independencia lógica de datos). 
    • Transparencia de replicación. El usuario no se da cuenta de que pueden existir copias (réplicas) de una misma relación en diferentes lugares.
Regla de la no subversión
Si un sistema relacional tiene un lenguaje de bajo nivel (un registro de cada vez), ese bajo nivel no puede ser usado para saltarse (subvertir) las reglas de integridad y los limitantes expresados en los lenguajes relacionales de más alto nivel (una relación (conjunto de registros) de cada vez)
  • Algunos problemas no se pueden solucionar directamente con el lenguaje de alto nivel.
  • Normalmente se usa SQL inmerso en un lenguaje anfitrión para solucionar estos problemas. Se utiliza el concepto de cursor para tratar individualmente las tuplas de una relación. En cualquier caso no debe ser posible saltarse los limitantes de integridad impuestos al tratar las tuplas a ese nivel. 

2.- Diseño de Base de Datos



El diseño de una base de datos requiere un conocimiento profundo de las funciones empresariales que se desean modelar, así como de las características y conceptos de base de datos que se desea utilizar para representar esas funciones empresariales. Asegúrese de diseñar con precisión la base de datos que utilizará para modelar el negocio porque el cambio del diseño de la base de datos una vez implementada puede requerir mucho tiempo. Por otra parte, una base de datos bien diseñada ofrece un mejor rendimiento.

¿Qué es un buen diseño de base de datos?
El proceso de diseño de una base de datos se guía por algunos principios. El primero de ellos es que se debe evitar la información duplicada o, lo que es lo mismo, los datos redundantes, porque malgastan el espacio y aumentan la probabilidad de que se produzcan errores e incoherencias. El segundo principio es que es importante que la información sea correcta y completa. Si la base de datos contiene información incorrecta, los informes que recogen información de la base de datos contendrán también información incorrecta y, por lo tanto, las decisiones que se tome a partir de esos informes estarán mal fundamentadas.

Un buen diseño de base de datos es, por lo tanto, aquél que:

  • Divide la información en tablas basadas en temas para reducir los datos redundantes.
  • Proporciona a RDBMS la información necesaria para reunir la información de las tablas cuando así se precise.
  • Ayuda a garantizar la exactitud e integridad de la información.
  • Satisface las necesidades de procesamiento de los datos y de generación de informes.
El proceso de diseño
El proceso de diseño consta de los siguientes pasos:

  • Determinar la finalidad de la base de datos. Esto le ayudará a estar preparado para los demás pasos.
  • Buscar y organizar la información necesaria.Reúna todos los tipos de información que desee registrar en la base de datos, como los nombres de productos o los números de pedidos.
  • Dividir la información en tablas.Divida los elementos de información en entidades o temas principales, como Productos o Pedidos. Cada tema pasará a ser una tabla.
  • Convertir los elementos de información en columnas.Decida qué información desea almacenar en cada tabla. Cada elemento se convertirá en un campo y se mostrará como una columna en la tabla. Por ejemplo, una tabla Empleados podría incluir campos como Apellido y Teléfono.
  • Especificar claves principales.Elija la clave principal de cada tabla. La clave principal es una columna que se utiliza para identificar inequívocamente cada fila, como Id. de producto o Id. de pedido.
  • Definir relaciones entre las tablas. Examine cada tabla y decida cómo se relacionan los datos de una tabla con las demás tablas. Agregue campos a las tablas o cree nuevas tablas para clarificar las relaciones según sea necesario.
  • Ajustar el diseño.Analice el diseño para detectar errores. Cree las tablas y agregue algunos registros con datos de ejemplo. Compruebe si puede obtener los resultados previstos de las tablas. Realice los ajustes necesarios en el diseño.
  • Aplicar las reglas de normalizaciónAplique reglas de normalización de los datos para comprobar si las tablas están estructuradas correctamente. Realice los ajustes necesarios en las tablas.
Determinar la finalidad de la base de datos
Es conveniente plasmar en papel el propósito de la base de datos: cómo piensa utilizarla y quién va a utilizarla. Para una pequeña base de datos de un negocio particular, por ejemplo, podría escribir algo tan simple como "La base de datos de clientes contiene una lista de información de los clientes para el envío masivo de correo electrónico y la generación de informes". Si la base de datos es más compleja o la utilizan muchas personas, como ocurre normalmente en un entorno corporativo, la finalidad podría definirse fácilmente en uno o varios párrafos y debería incluir cuándo y cómo va a utilizar cada persona la base de datos. La idea es desarrollar una declaración de intenciones bien definida que sirva de referencia durante todo el proceso de diseño. Esta declaración de intenciones le permitirá centrarse en los objetivos a la hora de tomar decisiones.

Buscar y organizar la información necesaria
Para buscar y organizar la información necesaria, empiece con la información existente. Por ejemplo, si registra los pedidos de compra en un libro contable o guarda la información de los clientes en formularios en papel en un archivador, puede reunir esos documentos y enumerar cada tipo de información que contienen (por ejemplo, cada casilla de un formulario). Si no dispone de formularios, imagine que tiene que diseñar uno para registrar la información de los clientes. ¿Qué información incluiría en el formulario? ¿Qué casillas crearía? Identifique cada uno de estos elementos y cree un listado. Suponga, por ejemplo, que guarda la lista de clientes en fichas. Cada ficha podría contener un nombre de cliente, su dirección, ciudad, provincia, código postal y número de teléfono. Cada uno de estos elementos representa una columna posible de una tabla.

Cuando prepare esta lista, no se preocupe si no es perfecta al principio. Simplemente, enumere cada elemento que se le ocurra. Si alguien más va a utilizar la base de datos, pídale también su opinión. Más tarde podrá ajustar la lista.

A continuación, considere los tipos de informes o la correspondencia que desea producir con la base de datos. Por ejemplo, tal vez desee crear un informe de ventas de productos que contenga las ventas por región, o un informe de resumen de inventario con los niveles de inventario de los productos. Es posible que también desee generar cartas modelo para enviárselas a los clientes con un anuncio de una actividad de ventas o una oferta. Diseñe el informe en su imaginación y piense cómo le gustaría que fuera. ¿Qué información incluiría en el informe? Cree un listado de cada elemento. Haga lo mismo para la carta modelo y para cualquier otro informe que tenga pensado crear.



Deténgase a pensar en los informes y en la correspondencia que desea crear para identificar los elementos que necesita incluir en la base de datos.

Parece lógico crear un prototipo de cada informe o listado de salida y considerar qué elementos necesita para crear el informe.

Un punto clave que hay que recordar es que debe descomponer cada pieza de información en sus partes lógicas más pequeñas. En el caso de un nombre, para poder utilizar el apellido, dividirá el nombre en dos partes: el nombre y el apellido. Para ordenar un informe por nombre, por ejemplo, sería útil que el apellido de los clientes estuviera almacenado de forma independiente. En general, si desea ordenar, buscar, calcular o generar informes a partir de un elemento de información, debe incluir ese elemento en su propio campo.

Piense en las preguntas que le gustaría que la base de datos contestara. Por ejemplo, ¿cuántas ventas de un determinado producto se cerraron el pasado mes? ¿Dónde viven sus mejores clientes? ¿Quién es el proveedor del producto mejor vendido? Prever esas preguntas le ayudará a determinar los elementos adicionales que necesita registrar.

Dividir la información en tablas
Para dividir la información en tablas, elija las entidades o los temas principales. Por ejemplo, después de buscar y organizar la información de una base de datos de ventas de productos, la lista preliminar podría ser similar a la siguiente:



Las entidades principales mostradas aquí son los productos, los proveedores, los clientes y los pedidos. Por lo tanto, parece lógico empezar con estas cuatro tablas: una para los datos sobre los productos, otra para los datos sobre los proveedores, otra para los datos sobre los clientes y otra para los datos sobre los pedidos. Aunque esto no complete la lista, es un buen punto de partida. Puede seguir ajustando la lista hasta obtener un diseño correcto.

Cuando examine por primera vez la lista preliminar de elementos, podría estar tentado a incluirlos todos ellos en una sola tabla en lugar de en las cuatro tablas mostradas en la ilustración anterior. Considere por un momento la tabla que se muestra a continuación:



En este caso, cada fila contiene información sobre el producto y su proveedor. Como hay muchos productos del mismo proveedor, la información del nombre y la dirección del proveedor debe repetirse muchas veces, con lo que se malgasta el espacio en disco. Registrar la información del proveedor una sola vez en una tabla Proveedores distinta y luego vincular esa tabla a la tabla Productos es una solución mucho mejor.

Otro problema de este diseño surge cuando es necesario modificar la información del proveedor. Suponga, por ejemplo, que necesita cambiar la dirección de un proveedor. Como ésta aparece en muchos lugares, podría sin querer cambiar la dirección en un lugar y olvidarse de cambiarla en los demás lugares. Ese problema se resuelve registrando la información del proveedor en un único lugar.

Cuando diseñe la base de datos, intente registrar siempre cada dato una sola vez. Si descubre que está repitiendo la misma información en varios lugares, como la dirección de un determinado proveedor, coloque esa información en una tabla distinta.

Por último, suponga que el proveedor Bodega Sol sólo suministra un producto y desea eliminar ese producto pero conservar el nombre del proveedor y la información de su dirección. ¿Cómo eliminaría el producto sin perder la información del proveedor? No se puede. Como cada registro contiene datos sobre un producto, además de datos sobre un proveedor, no puede eliminar unos sin eliminar los otros. Para mantener estos datos separados, debe dividir la tabla en dos: una tabla para la información sobre los productos y otra tabla para la información sobre los proveedores. Al eliminar un registro de producto sólo se eliminarían los datos del producto y no los datos del proveedor.

Una vez seleccionado el tema representado por una tabla, las columnas de esa tabla deben almacenar datos únicamente sobre ese tema. Por ejemplo, la tabla de productos sólo debe contener datos de productos. Como la dirección del proveedor es un dato del proveedor, pertenece a la tabla de proveedores.

Convertir los elementos de información en columnas
Para determinar las columnas de una tabla (los campos de la tabla), decida qué información necesita registrar sobre el tema representado por la tabla. Por ejemplo, para la tabla Clientes, una buena lista de columnas iniciales sería Nombre, Dirección, Ciudad-Provincia-Código postal, Enviar correo electrónico, Saludo y Correo electrónico. Cada registro de la tabla contiene el mismo número de columnas, por lo que puede almacenar información sobre el nombre, dirección, ciudad-provincia-código postal, envío de correo electrónico, saludo y dirección de correo electrónico para cada registro. Por ejemplo, la columna de dirección podría contener las direcciones de los clientes. Cada registro contendrá datos sobre un cliente y el campo de dirección, la dirección de ese cliente.

Cuando haya determinado el conjunto inicial de columnas para cada tabla, puede ajustar con mayor precisión las columnas. Por ejemplo, tiene sentido almacenar los nombres de los clientes en dos columnas distintas (el nombre y el apellido) para poder ordenar, buscar e indizar por esas columnas. De igual forma, la dirección consta en realidad de cinco componentes distintos: dirección, ciudad, provincia, código postal y país o región, y parece lógico también almacenarlos en columnas distintas. Si desea realizar, por ejemplo, una búsqueda o una operación de ordenación o filtrado por provincia, necesita que la información de provincia esté almacenada en una columna distinta.

Debe considerar también si la base de datos va a contener información sólo de procedencia nacional o internacional. Por ejemplo, si piensa almacenar direcciones internacionales, es preferible tener una columna Región en lugar de Provincia, ya que esa columna puede incluir provincias del propio país y regiones de otros países. De igual forma, es más lógico incluir una columna Región en lugar de Comunidad Autónoma si va a almacenar direcciones internacionales.

En la lista siguiente se incluyen algunas sugerencias para determinar las columnas de la base de datos.

  • No incluya datos calculados. En la mayoría de los casos, no debe almacenar el resultado de los cálculos en las tablas. En lugar de ello, puede dejar que RDBMS realice los cálculos cuando desee ver el resultado. Suponga, por ejemplo, que tiene un informe Productos bajo pedido que contiene el subtotal de unidades de un pedido para cada categoría de producto de la base de datos. Sin embargo, no hay ninguna tabla que contenga una columna de subtotal Unidades en pedido. La tabla Detalles de Pedidos contiene una columna Unidades en pedido que almacena las unidades incluidas en un pedido de cada producto. Con esos datos, RDBMS calcula el subtotal cada vez que se imprime el informe, pero el subtotal propiamente dicho no debe almacenarse en una tabla.
  • Almacene la información en sus partes lógicas más pequeñas. Puede ceder a la tentación de habilitar un único campo para los nombres completos o para los nombres de productos junto con sus descripciones. Si combina varios tipos de información en un campo, será difícil recuperar datos individuales más adelante. Intente dividir la información en partes lógicas. Por ejemplo, cree campos distintos para el nombre y el apellido, o para el nombre del producto, la categoría y la descripción.
Una vez ajustadas las columnas de datos de cada tabla, ya puede seleccionar la clave principal de cada tabla.

Especificar claves principales
Cada tabla debe incluir una columna o conjunto de columnas que identifiquen inequívocamente cada fila almacenada en la tabla. Ésta suele ser un número de identificación exclusivo, como un número de identificador de empleado o un número de serie. En la terminología de bases de datos, esta información recibe el nombre de clave principal de la tabla. El RDBMS utiliza los campos de clave principal para asociar rápidamente datos de varias tablas y reunir automáticamente esos datos.

Si ya tiene un identificador exclusivo para una tabla, como un número de producto que identifica inequívocamente cada producto del catálogo, puede utilizar ese identificador como clave principal de la tabla, pero sólo si los valores de esa columna son siempre diferentes para cada registro. No puede tener valores duplicados en una clave principal. Por ejemplo, no utilice los nombres de las personas como clave principal, ya que los nombres no son exclusivos. Es muy fácil que dos personas tengan el mismo nombre en la misma tabla.
Una clave principal siempre debe tener un valor. Si el valor de una columna puede quedar sin asignar o vacío (porque no se conoce) en algún momento, no puede utilizarlo como componente de una clave principal.
Debe elegir siempre una clave principal cuyo valor no cambie. En una base de datos con varias tablas, la clave principal de una tabla se puede utilizar como referencia en las demás tablas (clave externa o secundaria). Si la clave principal cambia, el cambio debe aplicarse también a todos los lugares donde se haga referencia a la clave. Usar una clave principal que no cambie reduce la posibilidad de que se pierda su sincronización con las otras tablas en las que se hace referencia a ella.

A menudo, se utiliza como clave principal un número único arbitrario. Por ejemplo, puede asignar a cada pedido un número de pedido distinto. La única finalidad de este número de pedido es identificar el pedido. Una vez asignado, nunca cambia.

Si piensa que no hay ninguna columna o conjunto de columnas que pueda constituir una buena clave principal, considere la posibilidad de utilizar una columna que tenga el tipo de datos Autonumérico. Cuando se utiliza el tipo de datos Autonumérico, El RDBMS asigna automáticamente un valor. Este tipo de identificador no es "fáctico", es decir, no contiene información objetiva sobre la fila que representa. Los identificadores de este tipo son perfectos para usarlos como claves principales, ya que no cambian. Una clave principal que contiene datos sobre una fila, como un número de teléfono o el nombre de un cliente, es más probable que cambie, ya que la propia información "fáctica" podría cambiar.



Una columna establecida en el tipo de datos Autonumérico suele constituir una buena clave principal. No hay dos identificadores de producto iguales.

En algunos casos, tal vez considere conveniente utilizar dos o más campos juntos como clave principal de una tabla. Por ejemplo, una tabla Detalles de pedidos que contenga artículos de línea de pedidos tendría dos columnas en su clave principal: Id. de pedido e Id. de producto. Cuando una clave principal está formada por más de una columna se denomina clave compuesta.

Para la base de datos de ventas de productos, puede crear una columna autonumérica para cada una de las tablas que funcione como clave principal: IdProducto para la tabla Productos, IdPedido para la tabla Pedidos, IdCliente para la tabla Clientes e IdProveedores para la tabla Proveedores.



Crear relaciones entre las tablas
Ahora que ha dividido la información en tablas necesita un modo de reunir de nuevo la información de forma provechosa. Por ejemplo, el siguiente formulario incluye información de varias tablas.


1.    La información de este formulario procede de la tabla Clientes...
2.    ...la tabla Empleados...
3.    ...la tabla Pedidos...
4.    ...la tabla Productos...
5.    ...y la tabla Detalles de pedidos.

SQL Server 2005 es un sistema de administración de bases de datos relacionales. En una base de datos relacional, la información se divide en tablas distintas en función del tema. A continuación, se utilizan relaciones entre las tablas para reunir la información según se precise.

Crear una relación de uno a varios
Considere este ejemplo: las tablas Proveedores y Productos de la base de datos de pedidos de productos. Un proveedor puede suministrar cualquier número de productos y, por consiguiente, para cada proveedor representado en la tabla Proveedores, puede haber muchos productos representados en la tabla Productos. La relación entre la tabla Proveedores y la tabla Productos es, por tanto, una relación de uno a varios.



Para representar una relación de uno a varios en el diseño de la base de datos, tome la clave principal del lado "uno" de la relación y agréguela como columna o columnas adicionales a la tabla en el lado "varios" de la relación. En este caso, por ejemplo, agregaría la columna Id. de proveedor de la tabla Proveedores a la tabla Productos. SQL Server utiliza entonces el número de identificador de proveedor de la tabla Productos para localizar el proveedor correcto de cada producto.

La columna Id. de proveedor de la tabla Productos se denomina clave externa.
* Una clave externa es la clave principal de otra tabla.
La columna Id. de proveedor de la tabla Productos es una clave externa porque también es la clave principal en la tabla Proveedores.



El punto de partida para la unión de tablas relacionadas se proporciona estableciendo parejas de claves principales y claves externas. Si no está seguro de las tablas que deben compartir una columna común, el identificar una relación de uno a varios asegura que las dos tablas implicadas requieren de una columna compartida.

Crear una relación de varios a varios
Considere la relación entre la tabla Productos y la tabla Pedidos.

Un solo pedido puede incluir varios productos. Por otro lado, un único producto puede aparecer en muchos pedidos. Por tanto, para cada registro de la tabla Pedidos puede haber varios registros en la tabla Productos. Y para cada registro de la tabla Productos puede haber varios registros en la tabla Pedidos. Este tipo de relación se denomina relación de varios a varios porque para un producto puede haber varios pedidos, y para un pedido puede haber varios productos. Tenga en cuenta que para detectar las relaciones de varios a varios entre las tablas, es importante que considere ambas partes de la relación.

Los temas de las dos tablas (pedidos y productos) tienen una relación de varios a varios. Esto presenta un problema. Para comprender el problema, imagine qué sucedería si intenta crear la relación entre las dos tablas agregando el campo Id. de producto a la tabla Pedidos. Para que haya más de un producto por pedido, necesita más de un registro en la tabla Pedidos para cada pedido y, en ese caso, tendría que repetir la información de pedido para cada fila relacionada con un único pedido, lo que daría lugar a un diseño ineficaz que podría producir datos inexactos. El mismo problema aparece si coloca el campo Id. de pedido en la tabla Productos: tendría varios registros en la tabla Productos para cada producto. ¿Cómo se soluciona este problema?

La solución a este problema consiste en crear una tercera tabla que descomponga la relación de varios a varios en dos relaciones de uno a varios. Inserte la clave principal de cada una de las dos tablas en la tercera tabla y, por consiguiente, la tercera tabla va a registrar todas las apariciones o instancias de la relación.



Cada registro de la tabla Detalles de pedidos representa un artículo de línea de un pedido. La clave principal de la tabla Detalles de pedidos consta de dos campos: las claves externas de las tablas Pedidos y Productos. El campo Id. de pedido no se puede utilizar en solitario como clave principal, ya que un pedido puede tener varios artículos de línea. El identificador de pedido se repite para cada artículo de línea del pedido, por lo que el campo no contiene valores únicos. Tampoco serviría utilizar solamente el campo Id. de producto, porque un producto puede aparecer en varios pedidos. Pero los dos campos juntos producen un valor exclusivo para cada registro.

En la base de datos de ventas de productos, la tabla Pedidos y la tabla Productos no se relacionan directamente entre sí, sino indirectamente a través de la tabla Detalles de pedidos. La relación de varios a varios entre los pedidos y los productos se representa en la base de datos mediante dos relaciones de uno a varios:

La tabla Pedidos y la tabla Detalles de pedidos tienen una relación de uno a varios. Cada pedido tiene varios artículos de línea, pero cada artículo está asociado a un único pedido.
La tabla Productos y la tabla Detalles de pedidos tienen una relación de uno a varios. Cada producto puede tener varios artículos asociados, pero cada artículo de línea hace referencia únicamente a un producto.

Desde la tabla Detalles de pedidos se puede determinar todos los productos de un determinado pedido, así como todos los pedidos de un determinado producto.

Después de incorporar la tabla Detalles de pedidos, la lista de tablas y campos sería similar a la siguiente:




Crear una relación de uno a uno
Otro tipo de relación es la relación de uno a uno. Suponga, por ejemplo, que necesita registrar información complementaria sobre productos que apenas va a necesitar o que sólo se aplica a unos pocos productos. Como no necesita la información con frecuencia, y como almacenar la información en la tabla Productos crearía un espacio vacío para todos los productos que no necesitan esa información, la coloca en una tabla distinta. Al igual que en la tabla Productos, utiliza el identificador de producto como clave principal. La relación entre esta tabla complementaria y la tabla Productos es una relación de uno a uno. Para cada registro de la tabla Productos hay un único registro coincidente en la tabla complementaria. Cuando identifique esta relación, ambas tablas deben compartir un campo común.

Cuando necesite crear una relación de uno a uno en la base de datos, considere si puede incluir la información de las dos tablas en una tabla. Si no desea hacer eso por algún motivo (quizás porque se crearía una gran cantidad de espacio vacío), puede representar esa relación en su diseño guiándose por las pautas siguientes:

  • Si las dos tablas tienen el mismo tema, probablemente podrá definir la relación utilizando la misma clave principal en ambas tablas.
  • Si las dos tablas tienen temas diferentes con claves principales distintas, elija una de las tablas (cualquiera de ellas) e inserte su clave principal en la otra tabla como clave externa.
Determinar las relaciones entre las tablas le ayudará a asegurarse de que tiene las tablas y columnas correctas. Cuando existe una relación de uno a uno o de uno a varios, las tablas implicadas deben compartir una o varias columnas comunes. Cuando la relación es de varios a varios, se necesita una tercera tabla para representar la relación.


Ajustar el diseño
Cuando tenga las tablas, los campos y las relaciones necesarias, debe crear y rellenar las tablas con datos de ejemplo y probar que funcionan con la información: creando consultas, agregando nuevos registros, etc. Esto permite encontrar posibles problemas, como la necesidad de agregar una columna que olvidó insertar durante la fase de diseño, o dividir una tabla en dos tablas para eliminar datos duplicados.

Compruebe si puede usar la base de datos para obtener las respuestas que desea. Compruebe si existen datos duplicados innecesarios y, si encuentra alguno, modifique el diseño para eliminar la duplicación.

Cuando pruebe la base de datos inicial, probablemente se dé cuenta de que se puede mejorar. Éstas son algunas comprobaciones que puede hacer:

  • ¿Olvidó incluir alguna columna? Y, en ese caso, ¿pertenece la información a alguna de las tablas existentes? Si se trata de información sobre otro tema, tal vez necesite crear otra tabla. Cree una columna para cada elemento de información que desee registrar. Si la información no se puede calcular a partir de otras columnas, es probable que necesite una nueva columna para esa información.
  • ¿Hay alguna columna innecesaria porque se puede calcular con los campos existentes? Si un elemento de información se puede calcular a partir de otras columnas existentes (como un descuento calculado a partir del precio de venta al público), normalmente es preferible que se calcule en lugar de crear una nueva columna.
  • ¿Ha proporcionada información duplicada en alguna de las tablas? Si es así, probablemente deba dividir la tabla en dos tablas que tengan una relación de uno a varios.
  • ¿Tiene tablas con muchos campos, un número limitado de registros y muchos campos vacíos en cada registro? En ese caso, considere la posibilidad de volver a diseñar la tabla de forma que tenga menos campos y más registros.
  • ¿Ha dividido cada elemento de información en sus partes lógicas más pequeñas? Si necesita generar informes, ordenar, buscar o calcular a partir de un elemento de información, incluya ese elemento en su propia columna.
  • ¿Contiene cada columna datos sobre el tema de la tabla? Si una columna no contiene información sobre el tema de la tabla, pertenece a una tabla distinta.
  • ¿Están representadas todas las relaciones entres las tablas mediante campos comunes o mediante una tercera tabla? Las relaciones de uno a uno y de uno a varios requieren columnas comunes. Las relaciones de varios a varios requieren una tercera tabla.

Ajustar la tabla Productos
Suponga que cada producto de la base de datos de ventas de productos pertenece a una categoría general, como bebidas, condimentos o marisco. La tabla Productos podría incluir un campo que mostrara la categoría de cada producto.

Suponga que después de examinar y ajustar el diseño de la base de datos, decide almacenar una descripción de la categoría junto con su nombre. Si agrega un campo Descripción de categoría a la tabla Productos, tendría que repetir la descripción de cada categoría para cada producto perteneciente a dicha categoría, lo cual no es una buena solución.

Una solución mejor es convertir las categorías en un nuevo tema de la base de datos, con su propia tabla y su propia clave principal. A continuación, puede agregar la clave principal de la tabla Categorías a la tabla Productos como clave externa.

Las tablas Categorías y Productos tienen una relación de uno a varios: una categoría puede incluir varios productos, pero un producto pertenece únicamente a una categoría.

Cuando examine las estructuras de las tablas, compruebe si existen grupos extensibles. Por ejemplo, considere una tabla con las siguientes columnas:

  • Id. de producto
  • Nombre
  • Id1 de producto
  • Nombre1
  • Id2 de producto
  • Nombre2
  • Id3 de producto
  • Nombre3
Aquí, cada producto es un grupo extensible de columnas que se diferencia de los demás solamente por el número agregado al final del nombre de columna. Si tiene columnas numeradas de esta forma, debe revisar el diseño.

Un diseño como éste tiene varios defectos. Para empezar, obliga a crear un límite máximo de número de productos. En cuanto supere ese límite, deberá agregar un nuevo grupo de columnas a la estructura de la tabla, lo que supone una tarea administrativa importante.
Otro problema es que se malgastará el espacio en aquellos proveedores que tengan menos que el número máximo de productos, ya que las columnas adicionales quedarán en blanco. El defecto más grave de este diseño es que muchas tareas son difíciles de realizar, como ordenar o indizar la tabla por identificador de producto o nombre.

Siempre que aparezcan grupos extensibles, revise atentamente el diseño con vistas a dividir la tabla en dos. En el ejemplo anterior, sería conveniente usar dos tablas, una para proveedores y otra para productos, vinculadas por el identificador de proveedor.

Aplicar las reglas de normalización
En el siguiente paso del diseño, puede aplicar las reglas de normalización de datos (denominadas a veces simplemente reglas de normalización). Estas reglas sirven para comprobar si las tablas están estructuradas correctamente. El proceso de aplicar las reglas al diseño de la base de datos se denomina normalizar la base de datos o, simplemente, normalización.

La normalización es más útil una vez representados todos los elementos de información y después de haber definido un diseño preliminar. La idea es asegurarse de que se han dividido los elementos de información en las tablas adecuadas. Lo que la normalización no puede hacer es garantizar que se dispone de los elementos de datos correctos para empezar a trabajar.

Las reglas se aplican consecutivamente en cada paso para garantizar que el diseño adopta lo que se conoce como "forma normal". Hay cinco formas normales ampliamente aceptadas: de la primera forma normal a la quinta forma normal. En este artículo se abordan las tres primeras, porque todas ellas son necesarias para la mayoría de los diseños de base de datos.

Primera forma normal

La primera forma normal establece que en cada intersección de fila y columna de la tabla existe un valor y nunca una lista de valores. Por ejemplo, no puede haber un campo denominado Precio en el que se incluya más de un precio. Si considera cada intersección de filas y columnas como una celda, cada celda sólo puede contener un valor.

Segunda forma normal
La segunda forma normal exige que cada columna que no sea clave dependa por completo de toda la clave principal y no sólo de parte de la clave. Esta regla se aplica cuando existe una clave principal formada por varias columnas. Suponga, por ejemplo, que existe una tabla con las siguientes columnas, de las cuales Id. de pedido e Id. de producto forman la clave principal:

  • Id. de pedido (clave principal)
  • Id. de producto (clave principal)
  • Nombre de producto

Este diseño infringe los requisitos de la segunda forma normal, porque Nombre de producto depende de Id. de producto, pero no de Id. de pedido, por lo que no depende de toda la clave principal. Debe quitar Nombre de producto de la tabla, ya que pertenece a una tabla diferente (a la tabla Productos).

Tercera forma normal
La tercera forma normal exige no sólo que cada columna que no sea clave dependa de toda la clave principal, sino también que las columnas que no sean clave sean independientes unas de otras.

O dicho de otra forma: cada columna que no sea clave debe depender de la clave principal y nada más que de la clave principal. Por ejemplo, considere una tabla con las siguientes columnas:

  • IdProducto (clave principal)
  • Nombre
  • PVP
  • Descuento
Suponga que la columna Descuento depende del precio de venta al público (PVP) sugerido. Esta tabla infringe los requisitos de la tercera forma normal porque una columna que no es clave, la columna Descuento, depende de otra columna que no es clave, la columna PVP. La independencia de las columnas implica que debe poder cambiar cualquier columna que no sea clave sin que ninguna otra columna resulte afectada. Si cambia un valor en el campo PVP, la columna Descuento cambiaría en consecuencia e infringiría esa regla. En este caso, la columna Descuento debe moverse a otra tabla cuya clave sea PVP.



Desnormalización

Microsoft SQL Server realiza operaciones de ordenación, intersección, unión y diferencia mediante una tecnología de ordenación en memoria y combinación hash. Con este tipo de plan de consulta, SQL Server acepta la partición vertical de tablas, a veces llamada almacenamiento en columnas.
SQL Server emplea tres tipos de operaciones de combinación:
  • Combinaciones de bucles anidados
  • Combinaciones de mezcla
  • Combinaciones hash
Si la entrada de una combinación es pequeña (menor de 10 filas), y la entrada de otra combinación es bastante grande y está indizada en las columnas de combinación, una combinación de bucles anidados de índices es la operación de combinación más rápida, debido a que requieren menos E/S y menos comparaciones.

Si las dos entradas de la combinación no son pequeñas pero están ordenadas por la columna de combinación (por ejemplo, si se obtuvieron al recorrer índices ordenados), una combinación de mezcla es la operación de combinación más rápida. Si ambas entradas de combinación son grandes y tienen tamaños similares, una combinación de mezcla con una ordenación previa y una combinación hash ofrecen un rendimiento similar. Sin embargo, las operaciones de combinación hash a menudo son más rápidas si los tamaños de las dos entradas difieren significativamente entre sí.

  • Las combinaciones hash pueden procesar eficazmente entradas grandes, sin ordenar y no indizadas. Son útiles para obtener resultados intermedios en consultas complejas debido a que:
  • Los resultados intermedios no están indizados (a menos que se hayan guardado explícitamente en disco y, después, se hayan indizado) y, a menudo, no tienen un orden adecuado para la siguiente operación del plan de consulta.
Los optimizadores de consultas sólo calculan los tamaños de resultados intermedios. Dado que las estimaciones pueden ser poco exactas en consultas complejas, los algoritmos utilizados para procesar los resultados intermedios no sólo deben ser eficaces, sino que también deben rebajarse si un resultado intermedio es mayor de lo previsto.

La combinación hash permite reducir el uso de la desnormalización. La desnormalización se suele utilizar para conseguir un rendimiento mejor mediante la reducción de las operaciones de combinación, a pesar del peligro de redundancia, como las actualizaciones incoherentes. Las combinaciones hash reducen la necesidad de desnormalización. Las combinaciones hash permiten que las particiones verticales (que representan grupos de columnas de una sola tabla en archivos o índices independientes) se conviertan en una opción viable para el diseño físico de bases de datos.

3.- Integridad Referencial



Al diseñar una base de datos, se divide la información en muchas tablas basadas en temas para minimizar la redundancia de los datos. A continuación, se proporciona a SQL Server los medios para recopilar de nuevo la información, colocando campos comunes en tablas relacionadas.

Por ejemplo, para representar una relación de uno a varios se toma la clave principal de la tabla "uno" y se agrega como un campo adicional a la tabla "varios". Para recopilar de nuevo los datos, SQL Server toma el valor de la tabla "varios" y busca el valor correspondiente en la tabla "uno". De este modo los valores de la tabla "varios" hacen referencia a los valores correspondientes de la tabla "uno".

Suponga que tiene una relación de uno a varios entre las tablas Transportistas y Pedidos y desea eliminar un transportista. Si el destinatario que desea quitar tiene pedidos en la tabla Pedidos, dichos pedidos quedarán "huérfanos" si elimina el registro Transportista. Los pedidos todavía contendrán un Id.de transportista, pero el Id. ya no será válido, porque el registro al que hace referencia ya no existe.

El propósito de la integridad referencial es evitar los registros huérfanos y mantener las referencias sincronizadas para que esta situación hipotética no ocurra nunca.

Una vez aplicada la integridad referencial, SQL Server rechazará todas las operaciones que infrinjan la integridad referencial de esa relación de tabla. Esto significa que SQL Server rechaza las actualizaciones que cambian el destino de una referencia, así como las eliminaciones que quitan el destino de una referencia.

* La integridad referencial es un sistema de reglas que garantizan que las relaciones entre filas de tablas relacionadas sean válidas y que no se eliminen ni cambien accidentalmente los datos relacionados.

Se puede establecer la integridad referencial cuando se cumplen las siguientes condiciones:

  • La columna coincidente de la tabla principal es una clave principal o tiene una restricción UNIQUE.
  • Las columnas relacionadas en la tabla externa tienen el mismo tipo de datos y el mismo tamaño.
Cuando se exige la integridad referencial, se deben observar las reglas siguientes:

  • No se puede especificar un valor en la columna de clave externa de la tabla relacionada si ese valor no existe en la clave principal de la tabla relacionada. Sin embargo, se puede especificar un valor NULL en la columna de clave externa. Por ejemplo, no se puede indicar que se asigna un trabajo a un empleado que no está incluido en la tabla Empleados, pero se puede indicar que un empleado no tiene trabajo asignado mediante la especificación de un valor NULL en la columna job_id de la tabla Empleados.
  • No se puede eliminar una fila de una tabla de clave principal si existen filas que coinciden con ella en una tabla relacionada. Por ejemplo, no se puede eliminar una fila de la tabla trabajos si hay empleados asignados al trabajo representado por esa fila en la tabla empleados.
  • No se puede cambiar un valor de clave principal en la tabla de clave principal si esa fila tiene filas relacionadas. Por ejemplo, no puede cambiar el valor job_id de una fila en la tabla trabajos si hay empleados con dicho job_id en la tabla empleados.
Comments