Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Una vez que hemos terminado de desarrollar el modelo de datos para el sistema y que
ste es correcto desde un punto de vista lgico, podemos comenzar con xito el
desarrollo fsico y crear aplicaciones. Sin embargo, no hay que decir que habr que
optimizar el diseo creado para llevar a buen puerto ste objetivo. Tampoco existir
ningn motivo para afirmar que el modelo de datos existente es inadecuado.
Nota: Normalmente, deber mantener su modelo fsico tan cerca como sea posible de su
modelo lgico.
En los ltimos aos de la dcada de los ochenta era muy comn desnormalizar
fuertemente los modelos de datos. Los registros detallados se reorganizaban en registros
maestros, cuyas estructuras se colapsaban en archivos planos, y las estructuras lgicas
limpias y transparentes se convertan en estructuras que resultaban familiares para los
programadores en COBOL/VSAM. Esta forma de proceder era el resultado del elevado
precio de los equipos informticos y de que los mdulos (engine) de las bases de datos
relacionales eran bastantes lentos. Los consultores afirmaban que podan multiplicar por
diez el rendimiento de la base de datos si realizaban una desnormalizacin masiva. La
creencia ms extendida era que los modelos normalizados eran buenos en teora, pero
no funcionaban correctamente en la prctica. La solucin era crear modelos de datos
lgicos normalizados y construir base de datos basadas en archivos planos.
Esta estrategia tuvo resultados desastrosos. Cuando estos sistemas entraron en la fase
productiva, se encontraron con los mismos problemas que tuvieron en los sistemas
tradicionales de archivos planos. Especficamente eran poco flexibles y cualquier
modificacin resultaba extremadamente cara. Si se necesitaba utilizar una funcionalidad
no diseada explcitamente en la base de datos, haca falta realizar modificaciones muy
profundas en la estructura de datos. Hacia finales de 1980, la comunidad de las base de
datos comenz a darse cuenta de su error de diseo. A pesar de que el rendimiento del
sistema mejoraba cuando ste entraba en funcionamiento, el coste de mantener y
modificar estos sistemas era prohibitivo.
Sin embargo se pueden llevar a la prctica cierto tipo de desnormalizacin que no tendr
un impacto muy profundo en la capacidad del sistema para dar respuesta a los futuros
requisitos. En ste captulo analizaremos algunas de las tcnicas de desnormalizacin
mas conocidas que se pueden utilizar sin impactar profundamente en la naturaleza
flexible de un modelo de datos de calidad.
Hay que tener presente que nunca se puede realizar una desnormalizacin sin algn
coste. En la mayora de los casos, cuando se mejora el rendimiento en una parte del
sistema, se degrada en otra parte. La normalizacin es un estilo de de modelizacin que
la mayora de los diseadores de datos tienen bastante claro.
La denormalizacin es un arte idiosincrsico. Cuanto ms estructuras se encuentres
desnormalizadas, ms difcil ser que otros diseadores puedan trabajar con ellas.
Se trata de un problema de extrema gravedad. Los diseadores vienen y van. Contar
con modelos que puedan leer y comprender los futuros diseadores es de trascendental
importancia.
Tampoco se debe tomar a la ligera a la denormalizacin, puede o no mejorar el
rendimiento. Ciertamente, dificultar la lectura del modelo. Salvo que se realice de una
manera muy cuidada, se reducir la flexibilidad del modelo. Entonces. para que
desnormalizar? Hay varias situaciones en las que pueden ser necesarios:
abreviaturas de una manera inconsistente. Para resolver este problema se puede utilizar
el siguiente algoritmo.
1.- Convertir la direccin a maysculas.
2.- Eliminar todos los caracteres extraos, tales como tabuladores, espacios, retornos
duros de lnea, signos de puntuacin.
3.- Homogeneizar las abreviaturas de todas las palabras (por ejemplo, Oeste se
convertir en O u Oest).
4.- Sustituir texto del tipo 1 por PRIMERO para crear consistencia.
5.- Coger nicamente los diez primeros caracteres.
Mediante este algoritmo, conseguir comparar de manera bastante fiable las direcciones.
Cuando se tenga que enfrentar con bsquedas de nombres y direcciones en sistemas de
gran tamao, podr almacenar cada palabra en su propia columna e indexar cada
columna para realizar bsquedas eficientes en millones de registros para localizar la
informacin apropiada. Cualquiera de estos mtodos se puede llevar a cabo con
facilidad mediante desencadenadores de la base de datos. El diseador de aplicaciones
slo tendr que utilizar estas columnas en caso necesario. Como las desencadenadores
no necesitan interactuar con el disco, el rendimiento resultante es bastante bueno.
Este mtodo derrocha bastante espacio en el disco. Sin embargo, el cuello de botella de
las aplicaciones no suele encontrarse en el espacio de disco, sino en su rendimiento.
COLUMNAS ADICIONALES DE CLAVES EXTERNAS EN EL LUGAR EL
QUE NO PERTENECEN
Cuando tenga que trabajar con una cadena particularmente larga de relaciones maestro
detalle que se extiende por varias clases de objetos, podr introducir una clave externa o
una referencia a un puntero de objeto desde un extremo de la cadena al otro, tal y como
se muestra en la Figura 18.1.
En este ejemplo queremos realizar bsquedas por nombre en un subconjunto de los
detalles de la reclamacin. Tradicionalmente, deberamos unir tablas para lograr este
objetivo. En cambio, al introducir una referencia de objeto o una clave externa en
Detalle de reclamaciones que apunte a Grupo, podremos recuperar con rapidez los
detalles de la reclamacin que se encuentren asociados con el grupo. Esta introduccin
Detalle
Reclamaciones
Reclamacin
Pliza
Coste
Plan
Grupo
UML
Detalle
Reclamaciones
Reclamacin
Pliza
1
Coste
1
Plan
1
Grupo
efectu dicha venta, entonces resultara sencillo agregar ventas por departamentos. En
ocasiones, podr utilizarse esta tcnica en lugar de tener que analizar la informacin
histrica. En el ejemplo anterior, el nico motivo para tener que analizar la historia del
empleo de un determinado empleado ser para poder asignar el volumen correcto de
ventas al departamento adecuado. Si ste es el nico requisito del sistema, podr
modelizar la relacin tal y como se mue4stra en la Fig 18.3
Si utiliza esta estructura, nunca necesitaremos la clase historia del ejemplo, ya que todas
las relaciones se podrn describir mediante las relaciones adicionales existentes entre
Dep. y Ventas. Tendremos que agregar un desencadenador con el fin de poblar
automticamente la referencia Dep. cada vez que se genere una nueva venta.
Este ejemplo es de gran importancia, ya que demuestra que estamos intentando
encontrar las reglas del sistema que definen nuestro modelo de datos. Como se podr
imaginar, podremos plasmar las mismas reglas del sistema utilizando modelos
diferentes. Sin embargo, una simplificacin de este tipo slo deber realizarse despus
de haber realizado un anlisis profundo. En este caso, no creemos adecuado simplificar
el modelo eliminando la estructura de la historia del Empleo. Para hacerlos, tendr que
estar absolutamente convencido de que el nico motivo para seguir conservando la
historia del empleo es analizar el funcionamiento del departamento mediante la
contabilidad histrica de ventas. Recientemente, trabajamos en un proyecto en el que
deba mantenerse la historia, finalmente, la opinin del cliente fue la que se logr
imponer. Antes de que el sistema llegara a ponerse en marcha, descubrimos que varios
de los informes necesarios no se podan producir de manera segura sin mantener la
historia del empleo.
Nota: El coste asociado con el hecho de tener que modelizar una entidad de manera
ms flexible es, normalmente, mucho menor que el vernos obligados despus a tener
que modificar un sistema completo para acomodar un requisito nuevo o, simplemente,
que fue pasado por alto.
ERD
Departament
o
Historia
del empleo
Venta
Empresa
Realizado por
Venta
Empresa *
Departamento
Venta
Empresa
Departamento
UML
Venta
Realizado por
Empresa
Trabaja actualmente para
Acreditado para
Departamento
Nivel de Recursividad
Para ciertas aplicaciones que contengas estructuras recursivas que representan un rbol,
red lista vinculada, etc. Resulta til en que nivel de una jerarqua se encuentra un
determinado registro. Si utiliza CONNECT BY podr conocer el nivel como un valor
almacenado en una columna del sistema. Si no utiliza CONNECT BY o si no ha
comenzado en el nivel superior de la jerarqua, tal ves no resulte posible determinar el
nivel deseado o los niveles devueltos tendrn un elevado grado de inexactitud. La
columna Nivel no resulta necesaria con frecuencia. Sin embrago, puede resultar de
utilidad durante la fase de depuracin de aplicaciones. El desencadenador que se
necesita para mantener esta funcin es barato y ocupa un espacio despreciable.
La existencia de la columna Nivel tambin alerta a los diseadores de la presencia de
una estructura recursiva. Por nuestra parte, recomendamos la inclusin de Nivel como
columna redundante en muchas estructuras recursivas.
Escritura de tablas maestras
Si una clase de generalizacin no es abstracta (es decir, que se haya instanciado en
forma de tabla), no existe manera de determinar con facilidad el tipo de cada registro al
analizar una fila de la tabla de generalizacin. Ser necesario mirar todos los registros
contenidos en cada una de las tablas de especializacin para determinar el lugar en el
que se encuentra un determinado registro. Una solucin a este problema es almacenar el
nombre de la tabla de especializacin aplicable en la generalizacin. De esta forma, tal y
como se encuentra en la figura 18.4 podremos modificar nuestro ejemplo de
generalizacin estndar de los empleados por horas y asalariados.
Utilizando esta estructura, almacenaremos el tipo de empleo (asalariado o por horas) en
la tabla Empleado.
UML
Empleado
Tipo de empleo
1
Consistente con
Asalariado
Por horas
Figura 18.4. Tabla redundante que
muestra la generalizacin.
UML
ERD
Detalle
Presupuesto.
Detalle
presupuesto
Trimestre 1
Trimestre 2
Trimestre 3
Trimestre 4
Presupuesto
Presupuesto
Figura 18.5 de la Primera Forma Normal.
Detalle
presupuesto
ERD
Prorrateo
Detalle presupuesto
Presupuest
o
UML
Prorrateo
Detalle presupuesto
Detalle presupuesto
FECHA _ INICIO
FECHA _ FINAL
1
Presupuesto
Columnas Sobrecargadas
Sobrecargar columnas puede disminuir el nmero de atributos que se deben mantener en
una tabla. No recomendamos el empleo de esta estrategia.
Nota.- Es importante que cada atributo almacene uno y slo un tipo de informacin.
Las nicas excepciones a esta regla pueden ocurrir en modelizaciones genricas en las
que se utilice columnas del tipo valor. Cada vez que se almacenen diferentes tipos de
informacin en la misma columna, inevitablemente surgen los problemas. Un ejemplo
de las dificultades que se presentan cuando utilizan columnas sobrecargadas ocurre en
un sistema de control de contratos. A nivel detalle, los contratos se descomponen en
materiales y trabajo. A nivel material, los fabricantes ofertan un precio para los
materiales necesitados. El precio del trabajo se encuentra fijado y los fabricantes
facturan el nmero de horas de trabajo que han sido necesarias. A nivel factura, el
vendedor factura un nmero que representa una cantidad de dinero o el nmero de otras
que han sido necesarias dependiente de lo que se est facturando. Esta forma de
modelizar la estructura disminuye en una unidad el nmero de atributos que hay que
mantener, pero incrementa en docenas de horas el tiempo de desarrollo de la aplicacin
para manejar este error al sobrecargar una columna. No confunda este error con una
columna utilizada en la generalizacin a nivel clase., que puede ser de mucha ayuda.
Por ejemplo, en un mdulo denominado Demogrfico, los pases se dividen en
subunidades para enviar el correo. Estas subunidades pueden ser estados, provincias o
algn otro tipo de unidad.
Normalmente para manejar esta situacin, existir una nica clase para pases y otra
clase para las subdivisiones del pas que pueden representar un estado, provincia, etc.
En este caso, el atributo nombre de la subdivisin se referir al nombre del estado o
de la provincia. Desde una perspectiva terica, los nombres de estado provienen de un
dominio diferente que los nombres de las provincias, pero ambos se utilizan en la
misma forma. Desde una perspectiva del sistema, ambos nombres son equivalentes. Por
tanto, si el sistema siempre utiliza igual la informacin, estamos ante un caso claro de
empleo de columna sobrecargada. En caso contrario, la columna sobrecargada causar
problemas de manera inevitable en algn instante posterior.
Columnas Multiatributos
Una estrategia utilizada con frecuencia en campos tales como Nmeros de Partes o
Nmeros de contratos es incluir la informacin en la columna. Solo deber utilizar esta
estrategia si la nica actividad que va a realizar con los componentes pertenecientes al
campo es ensamblarlos. Por ejemplo, siempre se almacenarn juntos el ao con un ID
generado por el sistema. Una ves que se instancia el campo nunca se deber alterar los
componentes. Si se cumplen todas estas condiciones, se podrn utilizar las columnas
multiatributos.
Sin embargo, hay que reconocer que esta forma de proceder no es la mejor forma de
modelizar un sistema. La informacin del sistema cambiar de manera inevitable. Es
muy raro que todos los campos mantengan siempre fija la informacin que almacenan.
Tablas Histricas Redundantes
Si estamos intentando controlar la contabilidad almacenada en el libro mayor, la
actividad de una cartera de valores, o contabilizar los gastos de un departamento, el
volumen de estas transacciones suele ser suficientemente elevado y requiere una
estructura muy compleja. Para generar informes, solo tendremos que recoger la
informacin perteneciente al primer nivel de agregacin. Para calcular los gastos totales
o los ingresos obtenidos durante un determinado periodo de tiempo, necesitaremos
agregar todas las transacciones que hayan tenido lugar durante dicho periodo de tiempo.
Resolver un problema de este tipo puede ser un autentico quebradero de cabeza desde
el punto de vista del rendimiento del sistema. Se podra utilizar una tabla redundante
para almacenar la informacin peridica sobre una estructura. Tal y como se muestra
en la figura 18.7, esta estructura incluir una clase compuesta que comtendra toda la
informacin que deseamos supervisar.
Los campos contenidos en la tabla historia son los siguientes:
el nmero de ingresos/gastos
ERD
Histori
a
cartera
valores
UML
Historia cartera valores
Fecha valor
Valor de la cartera
Gastos mensuales
Gastos anuales
Gastos acumulados
Revisin mensual
Revisin anual
Revisin acumulada
*
1
Cartera
valores
la desnormalizacin
se
Tcnicas de desnormalizacin
Hemos identificado 11 tipos de de desnormalizacin que pueden ser necesarios para
facilitar el cdigo o por motivos de rendimiento. Describiremos cada una de estas
tcnicas y mostraremos ejemplos que harn referencia a las descripciones utilizadas en
primera parte de este capitulo para ilustrarlos.
tabla OC. Esta columna se actualizar con el valor total en dlares de la OC si mas que
sumar los valores individuales en dlares de cada OC_DTL asociada con una OC
determinada. Para el presente ejemplo, hemos creado tres tablas OC, OC_DTL y
X_OC_DTLy un desencadenador AIU_X_OC_DTL para la tabla X_OC_DTL, tal y
como se muestra en el cdigo ejemplo18.1
CREATE TABLE OC (
OC_ID
NUMBER (10)
NOTNULL,
DESCR_TXT
VARCHAR2 (100)
NOTNULL,
DIREC_ID_COM_TO NUMBER (10)
NOTNULL,
DIREC_ID_FACT_TO NUMBER (10)
NOTNULL,
CTCT_ID
NUMBER (10)
NOTNULL,
VENDEDOR_ID
NUMBER (10)
NOTNULL,
X_CANT
NUMBER (10,2)
NOTNULL )
/
CREATE TABLE OC_DTL (
OC_ID
NUMBER (10)
NOTNULL,
OC_DTL_ID
NUMBER (10)
NOTNULL,
ARTIC_ID
NUMBER (10)
NOTNULL,
ORDEN_CANT
NUMBER (10,2)
NOTNULL,
ORDEN_PRC
NUMBER (10,2)
NOTNULL )
/
CREATE TABLE X_OC_DTL (
OC_ID
NUMBER (10)
NOTNULL,
OC_DTL_ID
NUMBER (10)
NOTNULL,
ARTIC_ID
NUMBER (10)
NOTNULL,
ORDEN_CANT
NUMBER (10,2)
NOTNULL,
ORDEN_PRC
NUMBER (10,2)
NOTNULL )
/
CREATE TABLE OR REPLACE TRIGGER AIU_OC_DTL
AFTER INSERT OR UPDATE
ON X_OC_DTL
FOR EACH ROW
DECLARE
CURSOR C1 IS
SELECT ORDEN_CANT * ORDEN_PRC X_CANT_OC_DTL
FROM X_OC_DTL
WHERE OC_ID =:NEW.OC_ID;
X_CANT_OC
OC.X_CANT%TYPE :=0;
BEGIN
FOR C1_REC IN C1 LOOP
X_CANT_OC :=X_CANT_OC + C1_REC.X_CANT_OC_DTL;
END LOOP;
UPDATE OC SET X_CANT =X_CANT_OC WHERE OC_ID =:NEW.OC_ID;
END;
/
Otra opcin seria convertir al identificador nico de cada una de estas tablas en una
clave concatenada. De esta forma, podr informar de los Detalles de las Reclamaciones
mediante Reclamacin, Pliza, Coste, Plan o Grupo, y su consulta solo tendr que
acceder a Reclamacin Detallada y, opcionalmente, a una o mas de otras tablas, si en la
consulta solicitada se comprueba que solo se podr obtener informacin adicional de
una de estas tablas. El cdigo correspondiente a esta opcin se muestra en el Cdigo
ejemplo 18.3.
CREATE TABLE GRP (
GRP_ID
NUMBER (10) NOT NULL PRIMARY KEY,
DESCR_TX VARCHAR2 (40) NOT NULL)
/
CREATE TABLE PLAN (
PLAN_ID
NUMBER (10) NOT NULL,
DESCR_TX VARCHAR2 (40) NOT NULL,
GRP_ID
NUMBER (10) NOT NULL
REFERENCES GRP (GRP_ID),
PRIMARY KEY (PLAN_ID, GRP_ID))
/
CREATE TABLE COSTE (
COSTE_ID NUMBER (10) NOT NULL,
CANT
NUMBER (10,2) NOT NULL,
PLAN_ID
NUMBER (10) NOT NULL,
GRP_ID
NUMBER (10) NOT NULL,
PRIMARY KEY (COSTE_ID, PLAN_ID, GRP_ID),
FOREING KEY (PLAN_ID, GRP_ID)
REFERENCES PLAN (PLAN_ID, GRP_ID))
/
CREATE TABLE POLIZA (
POLIZA_ID
NUMBER (10) NOT NULL,
DESCR_TX VARCHAR2 (40) NOT NULL,
COSTE_ID
NUMBER (10) NOT NULL,
PLAN_ID
NUMBER (10) NOT NULL,
GRP_ID
NUMBER (10) NOT NULL,
PRIMARY KEY (PLIZA_ID, COSTE_ID, PLAN_ID, GRP_ID),
FOREING KEY (COSTE_ID, PLAN_ID, GRP_ID)
REFERENCES COSTE (COSTE_ID, PLAN_ID, GRP_ID))
/
CREATE TABLE RECLAM (
RECLAM_ID NUMBER (10) NOT NULL,
PACIENTE_APELL VARCHAR2 (40) NOT NULL,
PACIENTE_NOMBP VARCHAR2 (40) NOT NULL,
CREAR _ FECHA
DATE,
POLIZA_ID
NUMBER (10) NOT NULL,
COSTE_ID
NUMBER (10) NOT NULL,
PLAN_ID
NUMBER (10) NOT NULL,
GRP_ID
NUMBER (10) NOT NULL,
PRIMARY KEY (RECLAM_ID,
PLIZA_ID,
COSTE_ID,
PLAN_ID,
GRP_ID),
FOREING KEY (PLIZA_ID,
COSTE_ID,
PLAN_ID,
GRP_ID)
REFERENCES
POLIZA (PLIZA _ ID,
COSTE_ID,
PLAN_ID,
GRP_ID))
/
CREATE TABLE RECLAM_DTL (
RECLAM_ID NUMBER (10) NOT NULL,
RECLAM_DTL_ID NUMBER (3) NOT NULL,
DESCR_TX
VARCHAR2 (40),
Como puede ver, la concatenacin de claves primarias puede hacer que sus requisitos
de almacenamiento de datos se vayan por las nubes. Realizando un cuidadoso anlisis,
podr determinar la ruta ptima para su proyecto.
Columnas redundantes para el histrico
Podr desarrollar las columnas redundantes para el histrico en la misma forma que
utilizamos la tcnica de la desnormalizacin para las columnas adicionales de claves
externas no necesitara informacin adicional.
Escritura de tablas de detalle
Esta aproximacin es similar a la clave externa adicional y a las columnas redundantes
para las tcnicas del historial, aunque en este caso una clave externa redundante es una
clave externa de la tabla maestra ( al contrario de ser una clave primaria de la tabla
maestra). De nuevo, esta forma de actuar sirve para facilitar la elaboracin de informes,
aunque dificultara la comprensin del modelo.
Violaciones de la primera forma normal
Violar la primera forma normal implica que esta codificando una regla del sistema que
su empresa suele tener almacenada en la estructura de la base de datos. Una decisin tal
como esta no deber tomarse a la ligera. El cdigo ejemplo 18.4 indica que la actual
estrategia presupuestaria de esta empresa se lleva a cabo por trimestres. Pero que
ocurrir si esta divisin temporal cambia en el futuro? Una modificacin de esta
magnitud exigira cambios sustanciales en la base de datos, en todas las aplicaciones
(por ejemplo, formularios e informes) y en cualquier interfaz que intercambia
informacin con esta base de datos. Estos inconvenientes son lo suficientemente
costosos y no se pueden tomar a la ligera.
CREATE TABLE PRESUP (
PRESUP_ID
NUMBER
(10) NOT NULL,
DESCR_TXT
VARCHAR2 (100) NOT NULL,
CUENT_CD
VARCHAR2 (20) NOT NULL,
/
CREATE TABLE PRESUP_DTL (
PRESUP_ID
NUMBER
(10) NOT NULL,
TRM1_CANT
NUMBER
(10, 2) NOT NULL,
TRM2_CANT
NUMBER
(10, 2) NOT NULL,
TRM3_CANT
NUMBER
(10, 2) NOT NULL,
TRM4_CANT
NUMBER
(10, 2) NOT NULL,
Codigo ejemplo 18.4
Por el contrario podemos llevar a cabo un modelo mas flexible que pueda acomodar con
el tiempo las modificaciones que tengan lugar sobre la estructura del presupuesto. Esta
aproximacin exigir nuevas estructuras de datos que utilizaremos para definir la
estructura presupuestaria.
Columnas sobrecargadas
Para desarrollar el ejemplo de la subdivisin geogrfica tendremos que definir dos
tablas, PAS y ST_PROV, tal y como se muestra en el cdigo ejemplo 18.5.
CREATE TABLE PAS (
PAS_ID
NUMBER (10) NOT NULL PRIMARY KEY,
DESCR_TXT
VARCHAR2 (50) NOT NULL)
/
CREATE TABLE ST_PROV (
PAS_ID
NUMBER (10) NOT NULL
REFERENCES PAS (PAS_ID),
ST_PROV_ID
NUMBER (10) NOT NULL,
DESCR_TXT
VARCHAR2 (50) NOT NULL,
ESTADO_YN
VARCHAR2 (1) NOT NULL)/
Cdigo ejemplo 18.5
La columna DESCR_TXT perteneciente a la tabla DT_PROV almacena los nombres de
estados y provincias. En principio, no est claro que un valor determinado contenido en
la columna DESCR_TXT de la tabla ST_PROV sea un estado o una provincia si no se
consulta tambin el contenido de la columna ESTADO_YN, que indica si un
determinado registro se ha definido como ESTADO O PROVINCIA.
Columnas Multiatributos
Un lugar muy normal en donde ocurre este tipo de desnormalizacin es en el caso de los
identificadores de inventario. En ocasiones, el identificador nico de un elemento se
encuentra almacenado en una nica columna, pero, en realidad, puede descomponerse
en varios componentes, tales como el nmero de almacn, tipo de elemento y nmero de
elemento. En lugar de introducir estos valores de datos distintos en una nica columna,
recomendamos descomponerlos de manera individual. Ciertamente, esta forma de
actuar simplifica la lectura del modelo y los valores se podrn seguir mostrando juntos
para satisfacer las preferencias del usuario, tal y como se muestra en el cdigo ejemplo
18.6.
CREATE TABLE ARTIC (
ARTIC_ID
NUMBER (10) NOT NULL, PRIMARY KEY,
DESCR_TX
VARCHAR2 NOT NULL)
/
INSERT INTO ARTIC (ARTIC_ID, DESCR_TX)
VALUES (0113561111, WIDGET)
/
Cdigo ejemplo 18.6
El cdigo ejemplo 18.6 utiliza la columna ARTIC_ID para almacenar una cadena
combinada que contiene el tipo del elemento (por ejemplo, 011 caracteres 1-3), el
identificador del elemento (por ejemplo, 1111 caracteres 7-10).
Esta forma de actuar presenta un par de problemas. En primer lugar, los usuarios de este
sistema deben saber lo que significa 011, porque el sistema no almacena una
descripcin para este cdigo. En segundo lugar, consultar las ventas de artculos por tipo
de artculo es una tarea que no puede ser indexada, porque tendr que analizar el tipo
empleo de la funcin SUBSTR, que, de manera inherente, ignora los ndices. En tercer
lugar, qu ocurrira si su elemento fuera reclasificado como algn otro tipo de artculo
o fuera almacenado en algn otro almacn en el futuro? Estos cambios exigiran la
actualizacin de la clave primaria, un extremo bastante inconveniente.
La forma ms correcta de trabajar ser normalizar cuando vea este tipo de escenarios y
est convencido de que su estructura puede cambiar y, probablemente pueda, cambiar en
el futuro. Las estructuras mostradas en el Cdigo ejemplo 18.7 seran seguras.
ARTIC_TIPO_CD
VARCHAR2 (3) NOT NULL
REFENBRENCES ARTIC_TIPO (ARTIC_TIPO_CD)
/
Cdigo ejemplo 18.7
Este ejemplo, identificara de manera nica los artculos utilizando el cdigo de artculo,
no la combinacin de cdigo de artculo, cdigo de almacn y cdigo de tipo de
artculo. De esta forma, se permitira que el tipo de artculos o el almacn cambien con
el tiempo. Si est convencido que estos valores no van a cambiar con el tiempo, podr
seguir utilizando este diseo y , simplemente, modificar la clave primaria de la tabla
ARTIC para incluir los cdigos de almacn y de tipo de artculo. De esta forma,
obtendr el texto descriptivo de los tipos de almacenes y artculos, y garantizar que la
combinacin de estos tres campos representa un nico artculo.
Naturalmente, existen datos que nunca necesitarn este tipo de descomposicin. El
tpico ejemplo son los cdigos postales. Muchos de nosotros no somos concientes de
que, en la mayora de los pases, el cdigo postal esta realmente formado por varios
cdigos de menor extensin. En realidad, la mayora de nosotros nunca nos hemos
preocupado por este hecho. Lo que realmente interesa en la mayora de los sistemas es
el cdigo postal completo; por tanto, no requiere una normalizacin como suceda en el
ejemplo del artculo que hemos analizado anteriormente.
Conclusin:
Cada uno de los sistemas de desnormalizacin que hemos comentado aqu, con la
excepcin de la primera forma normal (que no se ha recomendado), comienzan con un a
base de datos en la tercera forma normal plenamente normalizada a la que se agrega una
columna redundante. Se trata de un concepto clave para obtener buenos modelos, ya que
ayuda a mantener un esquema conceptualmente claro. Todo lo que hemos tenido que
hacer es agregar al modelo sin sacrificar ni su flexibilidad ni su claridad conceptual.
Agregando trozos que han sido claramente identificados como desnormalizados gracias
a las convenciones de denominacin utilizadas, generando una documentacin
cuidadosa que indiquen de donde vienen dichos campos y plasmando estos mediante
desencadenadores de base de datos, obtendremos lo mejor de ambos mundos: Un
modelo claro y tericamente correcto y un rendimiento adecuado.
Funcionaria siempre esta forma de trabajar? No. Para los grandes sistemas bancarios
de elevado nmero de transacciones, grandes sistemas comerciales al por menor,
sistemas de reservas de lneas areas, o cualquier otro sistema que tenga que almacenar
miles de transacciones por segundo, debern sacrificarse ciertas correcciones tericas
para alcanzar el rendimiento adecuado. Esta forma de proceder deber utilizarse como
ltima alternativa. Los beneficios de un modelo de datos ntido son su facilidad de
mantenimiento y la facilidad con la que los nuevos grupos de diseadores lo entendern.