Documentos de Académico
Documentos de Profesional
Documentos de Cultura
MULTIMEDIA
MÓDULO DEL CURSO
ORIGEN
Con el paso de los años la información ha cobrado cada vez mayor importancia para el
desarrollo de todo tipo de organizaciones, este mismo fenómeno ocasiona que se
desarrollen formas eficientes para su recolección, proceso y almacenamiento.
Figura 1. Organización clásica: Sistemas Orientados al proceso. Tomado de: Piatinni, Mario G.; Marcos, Esperanza;
Calero, Coral y Vela, Belén. Tecnología y Diseño de Bases de Datos. Ed. Algaomega Ra-Ma. México, 2007. Pg. 18
Debido a estos inconvenientes surgidos, se busca una forma más eficiente para el
almacenamiento de datos y es cuando surgen las Bases de Datos como un repositorio
centralizado de datos independiente del tratamiento que se haga de ellos. Este nuevo
enfoque se centraba en los datos a diferencia del sistema de archivos que se centraba en
los procesos.
El término Bases de Datos surge a principios de los setenta, aunque su primera mención se
remonta a 1963 cuando se realizó en Estados Unidos un simposio en cuyo título se
encontraba la expresión Data Base y aunque durante dicho evento se propuso una
definición no fue aceptada y solamente hasta 1967 cuando el grupo de estandarización
Codasyl decidió cambiar su denominación por Data Base Task Group, el concepto empezó
a imponerse.
VENTAJAS
En su momento (años 70) se plantearon algunos inconvenientes para el uso de las bases
de datos, sin embargo, en este momento han perdido vigencia, ya que los costos de
instalación han bajado sustancialmente y existe personal capacitado para su manejo, por
lo tanto no se requiere una inversión adicional para la empresa; por otro parte, las
ventajas en el uso de Bases de Datos superan enormemente las posibles desventajas que
se pudieran presentar.
DEFINICIÓN
“Colección o depósito de datos, donde los datos están lógicamente relacionados entre sí,
tienen una definición y descripción comunes y están estructurados de una forma
particular. Una base de datos es también un modelo del mundo real y; como tal, debe
servir para toda una gama de usos y aplicaciones” (Conference des Statisticiens
Européens, 1977)
1
Piatinni, Mario G.; Marcos, Esperanza; Calero, Coral y Vela, Belén. Tecnología y Diseño de Bases de Datos. Ed.
Algaomega Ra-Ma. México, 2007. Pg. 24
“Conjunto de ficheros maestros, organizados y administrados de una manera flexible de
modo que los ficheros puedan ser fácilmente adaptados a nuevas tareas imprevisibles”
(Frand, 1985)
En una base de datos se distinguen tres estructuras, tal como se presenta en la Figura 2.
2 De Miguel, Adoración; Piattini, Mario. Fundamentos y Modelos de Bases de Datos. Ed. Alfa Omega Ra-Ma. Mexico.
1999. Pg28
La estructura lógica de usuario o Vista externa corresponde a la visión que cada
usuario tiene de la Base de Datos, estas vistas pueden ser diferentes para los diversos
usuarios y dependen de las funcionalidades que cada uno de ellos requiera de la Base
de Datos.
La estructura lógica global o Vista conceptual, es la visión global de los datos, desde el
punto de vista lógico, incluye la descripción de los datos y las relaciones que estos
guardan. Esta capa es un modelo de representación y debe guardar las características
que los datos mantienen en el mundo real.
El esquema interno o Vista física, corresponde a la forma como los datos se organizan
en el almacenamiento físico y es altamente dependiente del programa manejador,
algunos aspectos que involucra esta vista son la estrategia de almacenamiento, los
caminos de acceso, manejo de índices, administración de memoria y control de acceso
(físico).
Esta estructuración de las Bases de Datos en tres niveles, es los que permite mantener la
independencia entre los datos y las aplicaciones, además de garantizar un modelo
apropiado de los datos, que represente el mundo real.
Si bien el concepto y las características esenciales de las Bases de Datos se han mantenido
desde sus inicios, los modelos que se han empleado para representarlas han variado a lo
largo del tiempo.
Primera Generación: En los años sesenta y setenta surge la primera generación de Bases
de datos, que se basaban en modelos jerárquicos y en red, que proporcionaban una
estructura de los datos a manera de árboles o grafos.
(a) (b)
Segunda Generación: En 1970, el Dr. E.F. Codd, propuso el modelo relacional, el cual fue
considerado inicialmente como un buen modelo matemático pero no era clara su
implementación, sin embargo poco a poco se entendió su potencial por lo que llegó a
convertirse en el principal modelo para desarrollo de Bases de Datos, el cual se usa hasta
la actualidad.
3
Piatinni, Mario G.; Marcos, Esperanza; Calero, Coral y Vela, Belén. Tecnología y Diseño de Bases de Datos. Ed.
Algaomega Ra-Ma. México, 2007. Pg. 36
Figura 3. Estructura del DBMS. ElMasri, Ramez., Navathe, Shamkant. Sistemas de Bases de Datos. 2ª edición.
Addison Wesley.
Funciones
Las funciones del DBMS se pueden agrupar en tres categorías: Funciones de definición o
descripción, Funciones de Manipulación y Funciones de control.
Lenguajes
Para cumplir las funcionalidades descritas, el DBMS dispone de diferentes tipos de
lenguajes:
Lenguajes de Definición de Datos: Entre los que se incluyen Lenguajes de definición
de la estructura lógica global, lenguajes de definición de la estructura interna y
Lenguajes de definición de la estructura externa.
Lenguaje de Manipulación de Datos (DML): Que permite al usuario establecer las
condiciones para la actualización de los datos en la Base de Datos.
FUNCIONES
Las funciones del Administrador de la Base de Datos se pueden resumir de la siguiente
forma:
Definir políticas de instalación física: Establece las políticas de la ubicación física
para el manejo de la base de datos, por ejemplo partición de disco en el que se
ubicará y las condiciones de instalación.
Definir características técnicas servidor: Determina las características que debe
tener el servidor donde se alojará la base de datos, incluyendo capacidad de disco,
conexiones externas (a redes), capacidad de memoria.
Definir el esquema de la base de datos: Definir el esquema de la base de datos que
se instalará, el cual se basa en el diseño establecido para la misma.
Definir las estructuras de almacenamiento.
Mantener las estructuras físicas y lógicas: Asegurar que las estructuras que se han
definido a nivel físico y lógico se mantengan en las mismas condiciones durante el
periodo de utilización de la base de datos.
Autorizar el acceso: Crear usuarios y definir los privilegios respectivos para la
utilización de la base de datos.
Resguardar los datos: Generar el esquema de copias de seguridad para mantener
la integridad de los datos contenidos en la base de datos.
BASES DE DATOS MULTIMEDIA
Las bases de datos multimedia han cobrado importancia en respuesta a los cambios en la
tecnología que se emplea tanto en los entornos sociales como empresariales. Hasta hace
algunos años, la información que se intercambiaba a muchos niveles era básicamente
texto, pero en la actualidad esta información involucra diversos tipos de datos que
incluyen imágenes, video, sonido, animaciones y texto, es decir, información multimedia.
Por otro lado, los avances tecnológicos han posibilitado labores de administración,
indexación y consulta sobre diversos tipos de datos (como imagen o audio), posibilitando
el desarrollo de los sistemas manejadores de bases de datos multimedia. No obstante,
siguen existiendo dificultades respecto a las bases de datos tradicionales, especialmente
en cuanto a la manipulación, almacenamiento y recuperación de los diferentes tipos de
datos, ocasionados principalmente por la dimensión de este tipo de datos.
4
Dunckley, Lynne. Mutlimedia Databases. An object-relational approach. Ed. Addison-Wesley. Great
Britain. 2003. Pg. 6-9
MANEJADOR DE BASES DE DATOS MULTIMEDIA (MMDBMS)
Un Manejador de Bases de Datos Multimedia, debe realizar las mismas operaciones que
se han definido para cualquier DBMS, adicionalemnte, Subrahmanian establece las
siguientes habilidades adicionales que debe tener un MMDBMS6:
5 Subrahmanian, V.S. Principles of Multimedia Database Systems. Morgan Kaufmann Publishers. USA.1998. Pg.5-6
6 Ibid.
REFERENCIA
Piatinni, Mario G.; Marcos, Esperanza; Calero, Coral y Vela, Belén. Tecnología y Diseño
de Bases de Datos. Ed. Algaomega Ra-Ma. México, 2007
A través de la historia se han empleado varios tipos de diagramas para representar los
modelos de datos, en lo referente a Bases de Datos Relacionales, durante mucho tiempo
se ha empleado el Modelo Entidad – Relación y más recientemente se ha hecho una
aproximación del Modelo de Clases de UML para realizar el modelamiento de datos. El
siguiente cuadro presenta diferentes notaciones para el modelado de datos.
Figura 5. Comparativo de los elementos en las principales notaciones de modelo de datos .Quintero, Juan B,;
Hernández, Diana M. y Yanza, Andrea. Directrices para la construcción de artefactos de persistencia en el proceso
de desarrollo de Software. En: Revista EIA, Numero 9, Julio 2008. Medellín. Pag. 77-90.
Entidades: Una entidad es la representación de una “cosa” u “objeto” físico o lógico que
existe en el mundo real. Algunas reglas básicas permiten definir si un objeto es una
entidad válida para el modelo:
Múltiples ocurrencias: Las entidades deben tener múltiples ocurrencias, si para el
modelo propuesto, solamente existe una ocurrencia de una entidad, debe
examinarse mejor, ya que lo más posible es que no se requiera modelar como
entidad independiente. Se entiende por ocurrencia un caso particular de la
entidad, por ejemplo la UAO es una ocurrencia de la entidad Universidad, Juan
Gómez es una ocurrencia de la entidad Estudiante.
Múltiples atributos: Toda entidad contendrá atributos o características que la
definen, por ejemplo la entidad persona, puede tener como atributos: nombre,
edad, sexo, teléfono, dirección. Una entidad válida debe contener varios
atributos, si una entidad tiene solamente un atributo es posible que corresponda a
otra entidad.
Exclusividad de ocurrencias: Las ocurrencias de una entidad deben pertenecer
solamente a ella; en ningún caso, una ocurrencia puede corresponder a dos
entidades. Por ejemplo, si todas las ocurrencias de la entidad Profesor, también
son ocurrencias de la entidad empleado, es muy probable que una de las dos
entidades sobre.
Exclusividad de atributos: Cada atributo debe ser definido dentro de una entidad,
no es válido que el mismo atributo pertenezca a dos entidades diferentes. Por
ejemplo, si todos los atributos de la entidad programa se repiten en la entidad
grupo, es probable que una de las dos entidades sobre.
Observación: Dos entidades pueden tener atributos con el mismo nombre, siempre
y cuando no hagan referencia a lo mismo. Por ejemplo el empleado tiene código y
el departamento también tiene código; lo cual es válido si el primero se refiere al
código del empleado y el segundo al código del departamento.
Gráficamente las entidades se representan como clases, en las que se incluyen solamente
los atributos. Por convención el nombre de la clase (o entidad) se escribe en singular.
Por ejemplo:
PERSONA ESCENA
Los atributos se escriben en singular, con un nombre corto que indique con claridad
aquella característica que representan. Para facilitar la implementación posterior de la
Base de Datos, conviene indicar el tipo de dato que se maneja en el atributo (carácter,
texto, numérico, booleano o fecha). Si un atributo es opcional, se puede indicar que su
multiplicidad es de 0 a 1 ([0..1]), entendiendo que puede presentarse 0 ó 1 vez.
Por ejemplo:
PERSONA
Nombre: texto
Cedula: numerico
Direccion: texto [0..1]
Telefono: numerico
Relaciones: Las relaciones en un modelo de datos, definen cuales entidades tienen alguna
relación con otra, estas relaciones pueden ser de múltiples tipos y nuevamente, serán
importantes o no, dependiendo de la situación que están representando.
En las bases de datos relacionales, cada relación es realmente una interrelación, es decir
que representa las dos relaciones que existen entre dos entidades (de la entidad A hacia la
entidad B y de la entidad B hacia la entidad A). Si la entidad Persona tiene una relación con
compra, es porque la entidad compra tiene una relación con persona.
Cada una de las relaciones tiene algunas características que la definen:
Nombre: identifica la relación que representa, generalmente es un verbo de una o dos
palabras y debe ser claro, sencillo y representativo (se sugiere evitar verbos genéricos
como tiene o es).
Sentido: Debido a que una relación, realmente representa dos relaciones, es
conveniente indicar el sentido en el que se está manejando la relación (de A hacia B o
de B hacia A).
Cardinalidad: Indica el número de ocurrencias que pueden eventualmente participar
en la relación. Aunque se entiende que en una relación particular participa una
ocurrencia de cada entidad, la Base de Datos va a representar muchas relaciones en el
tiempo, por lo tanto, bajo esta consideración, las cardinalidades pueden ser múltiples
(con número definido de ocurrencias o con número indeterminado de ocurrencias).
Bajo este mismo concepto se puede incluir la obligatoriedad de la relación, de forma
que se especifique si la relación debe ocurrir siempre o no.
Por ejemplo:
El siguiente diagrama indica que existe una relación entre la entidad Persona y la Entidad
escena, pero no indica más características. La relación podría ser: crea, publica, juega,
termina, etc. por ello es importante indicar el nombre de la relación.
PERSONA ESCENA
Nombre: texto
Cedula: numerico Tipo: texto
Direccion: texto [0..1] Nivel: numerico
Telefono: numerico
PERSONA ESCENA
crea
Nombre: texto
Cedula: numerico Tipo: texto
Direccion: texto [0..1] Nivel: numerico
Telefono: numerico
Sin embargo, aún faltaría mucha información respecto a la relación: ¿cuántas personas
crean una escena?¿cuántas escenas puede crear una persona? ¿todas las persona debe
crear una escena o pueden existir personas que no creen escenas? ¿todas las escenas
deben ser creadas por una persona o pueden existir escenas anónimas?
Las respuestas a estas preguntas dependen del contexto de la aplicación, una empresa en
particular puede exigir que toda escena tenga una persona como creador, mientras para
otra empresa, este requisito no es necesario.
PERSONA ESCENA
1 crea 0..*
Nombre: texto
Cedula: numerico Tipo: texto
Direccion: texto [0..1] Nivel: numerico
Telefono: numerico
La cardinalidad de la relación se puede marcar con número exactos o con * para indicar
que son muchos. Por ejemplo:
Relaciones recursivas
La relación recursiva o auto-asociación, es una forma particular de relación que se puede
hallar en el modelo de datos es la relación recursiva, como su nombre lo indica se refiere a
relaciones de una entidad consigo misma.
Por ejemplo:
En este caso, la relación indica que una página puede enlazar a otra u otras páginas. Se
entiende que una página no enlaza a sí misma sino a otras ocurrencias de la misma
entidad.
En el modelo relacional, es obligatorio definir una llave primaria para cada entidad, ya
que esta permitirá realizar las búsquedas y enlazar las entidades entre sí.
CLIENTE COMPRA
Para el ejemplo anterior, el Cliente se identifica mediante la cedula y la compra tiene una
llave compuesta por fecha y consecutivo (en este caso se entiende que es un consecutivo
por fecha, al cambiar de día el consecutivo se reinicia).
OBSERVACIÓN: Debe recordarse que una entidad solamente tiene una llave primaria, si
varios atributos están estereotipados con PK, es porque la llave es compuesta.
Relaciones redundantes y ciclos
En ocasiones durante el desarrollo del Modelo Entidad – Relación, se incluyen algunas
relaciones que sí bien tienen información válida para el modelo pueden ser eliminadas sin
afectar la información que brinda el modelo; esta situación ocurre debido a que la
información que contiene la relación redundante puede ser recuperada a través de otras
relaciones.
Una forma de identificar las relaciones redundantes es identificando ciclos, en los cuales
se forma un circuito cerrado de relaciones entre tres o más entidades. Por ejemplo:
NOTA: Debe prestarse atención, ya que no todos los circuitos cerrados de entidades,
corresponden a ciclos, estos solamente se forman si las relaciones implicadas se refieren a
lo mismo.
Esta nueva entidad, debe tener un nombre apropiado que indique la relación que
representa y las relaciones hacia las entidades que le dieron origen se deben establecer,
sin embargo, se pueden seguir algunas directrices:
Las relaciones que salen de la entidad asociativa hacia las entidades que le dieron
origen deben ser obligatorias, ya que para que exista esta entidad deben existir
ocurrencias de las otras dos.
Las relaciones que llegan a la entidad asociativa tienen cardinalidad múltiple (a
muchos), debido a que una ocurrencia de cualquiera de las otras entidades estará
asociada con varias ocurrencias en esta entidad.
Las relaciones que llegan a cada una de las entidades origen tienen cardinalidad única
(a uno), debido a que cada ocurrencia de la entidad asociativa se vincula con una
ocurrencia de cada una de las otras.
La obligatoriedad de las relaciones que salen de cada una de las entidades origen,
dependen de la relación original.
Para este caso en particular (Actuación), se pueden incluir varios atributos que no son ni
de la película ni del actor sino que corresponden a la participación de un actor particular
en una película en particular. Como siempre, debe asegurarse la necesidad de guardar
esta información en la base de datos. Por ejemplo:
Como se mencionó, puede suceder que la entidad asociativa no tenga atributos propios,
no obstante, siempre debe tener un identificador o llave primaria. En estos casos, puede
recurrirse a emplear como llave primaria, la llave de una o varias de las entidades con las
que se relacionan.
En el caso anterior, los atributos incluidos en Actuación no sirven para identificar cada
ocurrencia de la entidad y por tanto no pueden ser llave primaria. En este caso
(entendiendo que cada actor actúa un solo papel en una película), se puede identificar la
entidad actuación, empleando la llave primaria de actor y la llave primaria de película.
Para representar esto en el diagrama de clases, se hará uso de otro estereotipo: <<FK>>,
que representa una llave foránea o heredada.
La llave foránea permitirá representar cada una de las relaciones cuando se implemente la
base de datos; en general, no es indican en el modelo de datos, sin embargo por claridad
cuando la llave primaria es heredada de otra entidad, se incluye la respectiva llave
foránea.
Por ejemplo:
Supertipos y subtipos
Cuando un grupo de entidades se pueden agrupar en un mismo conjunto y tienen
atributos y/o relaciones comunes, se puede emplear un esquema de Supertipo y Subtipo,
donde el Supertipo corresponde a la entidad que agrupa y en ella se incluyen los atributos
y relaciones que sean comunes a todas las entidades subtipo, estas últimas incluirán
solamente aquellos atributos o relaciones que le sean propios. Los subtipos que se
incluyan deben ser mutuamente excluyentes.
Los supertipos y subtipos se representan mediante relaciones de herencia entre las clases
involucradas. Tal como sucede en este tipo de relaciones, cada una de las clases puede
tener atributos y relaciones propias, además de las que tenga la clase padre.
Por ejemplo:
En este caso se representa que los empleados (supertipo) pueden ser de dos clases
(subtipos): fijos o temporales. Todos los empleados, independiente de su tipo, se
identifican con la cedula y deben tener un nombre, adicionalmente están asignados a un
departamento. Los empleados fijos son los únicos que tienen definido un salario. Los
empleados temporales tienen asignado un valor por hora y pertenecen a una empresa de
temporales.
Al igual que otras entidades, los supertipos y subtipos deben tener una clave o llave; si la
clave se ha definido para el supertipo (como en el ejemplo anterior), se entiende que es la
misma para todos los subtipos; de otra forma, cada subtipo deberá definir su propia clave.
Cuando se realiza el diseño de una Base de Datos, es común que se generen errores en la
medida en que avanza el proceso mismo, por ello es conveniente revisar algunos aspectos
(de lógica) para verificar que el modelo esté correcto7.
Aspectos a revisar:
1. Cada atributo debe ser único e indivisible, cada atributo de cada entidad debe
corresponder a un valor único para cada ocurrencia, no deben existir atributos
compuestos (que correspondan a una estructura de datos más que a un dato
atómico), ni atributos múltiples (varios valores del atributo para una misma ocurrencia
de la entidad).
Por ejemplo:
Sugiere que un empleado puede
tener varias áreas, lo cual no es
correcto.
SOLUCIÓN: Estos casos pueden seleccionarse de dos formas: separar el atributo dentro de
la misma entidad o crear otra entidad.
Si el atributo es compuesto, por ejemplo horario que en realidad incluye fecha y hora, se
pueden incluir los dos atributos (fecha y hora) en lugar de horario.
7Este es el objetivo de la normalización de las Bases de Datos, sin embargo, si el diseñador es cuidadoso, cuando realice
su modelo, estará en Tercera Forma Normal y no será necesario normalizar.
2. Cada atributo dentro de la entidad debe corresponder a una característica de dicha
entidad y no de otra.
Por ejemplo:
SOLUCIÓN: En estos casos, es mejor que se genere otra entidad que incluya los
atributos que le corresponden, por ejemplo, en el caso anterior, se generaría otra
entidad llamada Producto que incluye como atributos: código, valor_unitario y
nombre. Debe prestarse especial atención a la conformación de la llave primaria
en la entidad origen, en este caso, la llave de DETALLE_PEDIDO está formada por
número y código de producto, por lo cual, la clase DETALLE_PEDIDO, debe incluir
como llave primaria la llave foránea heredada de PRODUCTO.
3. Los atributos de las entidad asociativas deben corresponder a la relación que
representan y no a las entidades relacionadas.
Por ejemplo:
SOLUCIÓN: Debe revisarse que cada atributo incluido en una entidad corresponda
a ella, en caso de no ser así, ubicarse en la entidad que le corresponde.
SOLUCIÓN: Debe establecerse una llave primaria para cada entidad, si no se logra
definir una con los atributos existentes, debería adicionarse un atributo que pueda
ser empleado como llave primaria.
Modelo Relacional de Datos
El modelo Relacional de Datos o MRD fue introducido por Edgar Codd en 1970; es una
representación lógica de la Base de Datos y se puede entender como el paso intermedio
entre el modelo entidad – relación, que es el modelo conceptual de la base de datos, y su
implementación física.
Debido a que el MRD es otra representación de la Base de Datos, debe ser consistente
con el diseño realizado a través del Modelo de Datos.
En el MRD la información se presenta en tablas, cada una de las cuales tiene un nombre
definido y unos campos o columnas; a su vez, para cada campo debe declararse: el
nombre, tipo de dato que contiene, longitud, obligatoriedad, dominio y restricciones (si
tiene) y tipo de llave (si aplica).
Las definiciones que se hacen en el MRD, permiten establecer las llamadas restricciones de
integridad de la base de datos; de forma que el DBMS pueda realizar las validaciones
apropiadas sobre los datos. Existen diferentes tipos de restricciones de integridad:
Integridad de entidad: ningún componente de una clave primaria puede ser null
(opcional)
Integridad referencial: todo valor de una clave foránea debe existir en la clave
primaria a la que hace referencia o ser null.
Integridad de columna: toda columna debe contener valores acordes con su dominio
y formato, por ejemplo, si se define una columna como numérica no debe aceptar
caracteres en su contenido.
Restricciones del sistema impuestas por los usuarios: corresponden a las reglas del
negocio, por ejemplo, se define que las notas de un estudiante deben estar en el
rango [0.0, 5.0].
REPRESENTACIÓN
En el MRD cada tabla se representará con un nombre y 5 filas para cada campo o
columna, estos corresponden a:
<NOMBRE DE LA TABLA>
Nombre Es el nombre asignado al campo o columna
Corresponde al tipo de dato que almacenará el campo, se sugiere
emplear: Texto, Numérico, Fecha, Booleano.
NOTA: tanto el nombre de la tabla como el de los campos, deben iniciar con letras, no
incluir espacios o caracteres especiales y por incompatibilidad con algunos manejadores,
se sugiere no utilizar la letra Ñ.
Para el anterior Modelo de Datos, el Modelo de Datos Relacional equivalente para las
entidades sería:
CLIENTES
Nombre nombre login contrasena email
Tipo Varchar2(20) Varchar2(15) Varchar2(15) Varchar2(15)
Obligatoriedad NN NN NN NN
Funcion PK
Dominio
MEDIOS_PAGO
Nombre tipo numero fecha_venc
Tipo Varchar2(1) Number Date
Obligatoriedad NN NN N
Funcion PK PK
Dominio T','P'
5. Cada relación se traduce como una llave foránea (FK). En una relación uno a muchos,
la relación que tiene el lado de muchos (subordinada) recibe la llave primaria de la
otra entidad como foránea. La obligatoriedad es determinada por el tipo de relación.
6. Para relaciones uno a uno, se presentan las siguientes situaciones:
a. Opcional – Obligatorio: se toma como maestro la entidad que se encuentra al
lado opcional y como detalle la del lado obligatorio. La entidad detalle lleva la
FK.
b. Opcional – Opcional: se toma como maestro la entidad que nace primero o que
tenga mayor permanencia en el tiempo.
c. Obligatorio – Obligatorio: son relaciones raras, pero si ocurren, se toma como
maestro la entidad que nace primero o que tenga mayor permanencia en el
tiempo.
MEDIOS_PAGO
Nombre tipo numero fecha_venc log_cliente
Tipo Varchar2(1) Number Date Varchar2(15)
Obligatoriedad NN NN N NN
Funcion PK PK FK(Clientes)
Dominio T','P'
Para el caso:
CANCIONES
nombre codigo titulo Cedula_int codigo_orquesta codigo_grupovocal
tipo Numerico(6) Caracter(20) Numerico(12) Numerico(12) Numerico(12)
función PK FK(Interpretes) FK(orquestas) FK(Grupos_vocales)
obligatoriedad NN NN N N N
dominio
La tabla de Canciones en la forma genérica, quedarían así:
CANCIONES
nombre codigo titulo cod_interprete tipo_interprete
tipo y longitud Numerico(6) Caracter(20) Numerico(12) Numerico(1)
FK(solista u orquesta o
función PK grupo vocal)
obligatoriedad NN NN NN NN
dominio 1, 2, 3
a. Una tabla para el supertipo: se considera el supertipo como una tabla simple con los
atributos del supertipo y los subtipos, se adiciona un atributo que indique el tipo de
subtipo la que se hace referencia. Se pierde la obligatoriedad de los atributos y de las
relaciones de los subtipos.
9. Una tabla por cada subtipo: se consideran los subtipos como entidades simples que
heredan los atributos del supertipo. No se pierde la obligatoriedad de los atributos y
relaciones de los subtipos, pero si la clave primaria es un consecutivo será más difícil
de manejar. Es mejor cuando se dispone de muchos atributos y relaciones propias a
cada subtipo.
EMPLEADOS_FIJOS
nombre cedula nombre salario cod_dpto
tipo y longitud numerico(12) Caracter(30) numerico(10,2) Numerico(6)
función PK FK(Departamentos)
obligatoriedad NN NN NN NN
dominio
EMPLEADOS_TEMPORALES
nombre cedula nombre valor_hora cod_dpto nit_empresatemp
tipo y longitud numerico(12) Caracter(30) numerico(10,2) Numerico(6) Caracter(20)
función PK FK(Departamentos) FK(Empresas_Temp)
obligatoriedad NN NN NN NN NN
dominio
a. Implementar los subtipos con un arco: se tiene una tabla para el supertipo y
una para cada subtipo. Se convierte de la forma como se trabajan los arcos.
1) De forma genérica:
EMPLEADOS
nombre cedula nombre tipo cod_dpto
tipo y longitud numerico(12) Caracter(30) Caracter(1) Numerico(6)
FK(Departamentos
función PK )
obligatoriedad NN NN NN NN
dominio F, T
EMPLEADOS_FIJOS
nombre cedula salario
tipo y longitud numerico(12) numerico(10,2)
función PK, FK (Empleados)
obligatoriedad NN NN
dominio
EMPLEADOS_TEMPORALES
nombre cedula valor_hora nit_empresatemp
tipo y longitud numerico(12) numerico(10,2) Caracter(20)
función PK, FK (Empleados) FK(Empresas_Temp)
obligatoriedad NN NN NN
dominio
CASO 1: En una tienda de vídeo se rentan películas a las personas inscritas (que comúnmente se
conocen como socios). Los videos se rentan por un día si la renta ocurre en un día de semana o
dos si la renta ocurre un sábado. En general, se desea conocer datos sobre quienes son socios de
la video tienda (incluyendo una foto que se toma al momento de la inscripción), las películas
disponibles y los vídeos que ha rentado cada socio.
Para facilitar la búsqueda de las películas se dispondrá de un quisco que permitirá al usuario
consultar las películas por título, categoría, actores participantes o director; adicionalmente se
dispondrá de imágenes de la película, los actores y directores y en algunos casos del triller para
ayudar al usuario en su ubicación.
CASO 2: CINENACIONAL es la cadena de cine más grande del país, tienen distribuidos teatros
multiplex en diferentes ciudades, cada uno de los cuales incluye entre 4 y 10 salas. Se quiere
diseñar una base de datos, para almacenar los datos básicos de cada cliente (todos los clientes
tienen una tarjeta con la que realizan la compra de sus boletas), los datos de las películas que se
presentan y los datos básicos de las salas y teatros. La idea es que se puedan realizar consultas
sobre las películas más vistas, las películas que se presentan en determinada ciudad o teatro, las
ventas que se realizan a los clientes y las salas con mayor ocupación. Igualmente, la cadena de
cines quiere llevar un ranking de las películas que proyecta, para lo cual consulta entre 50 y 100
clientes que hayan asistido a una película su opinión de la misma (Excelente, Buena, Regular o
Mala).
CASO 3: Un grupo de estudiantes de la UAO quiere diseñar un sitio similar a e-bay, donde las
personas puedan inscribirse y participar en subastas virtuales sobre diferentes productos, para
ello, se requiere una Base de datos que pueda tener los datos de los productos en subasta, la
subasta misma (incluyendo fecha de inicio, fecha de terminación y precio base), la persona que
pone el producto en subasta y los diferente oferentes del mismo; igualmente las personas que
reciben los productos tendrán la posibilidad de calificar al vendedor, considerando si la descripción
que hizo del producto fue apropiada y el tiempo de entrega. Cada vendedor sube la información
que considere pertinente de su producto, lo cual puede incluir una descripción textual, imágenes,
vídeo o audio. Para facilitar la búsqueda, los productos se definen por categorías.
CASO 4: Una compañía productora de vídeos desea crear una aplicación que le permita almacenar
y acceder rápidamente a los diferentes productos que elaboran. Se sabe que la compañía tiene 4
sucursales en el país y en cada una de ellas se realizan producciones de diferente tipo, por
ejemplo, vídeos musicales, comerciales para televisión, cortometrajes y algunos largometrajes. Es
necesario que se conozca el o los directores de cada trabajo (pueden ser hasta 3), el o los
productores del mismo, aunque algunos trabajos no cuentan con productor, el cliente al que se le
realizó el trabajo (con sus datos de localización), la fecha de realización, los datos de la cuenta de
cobro que se entregó al cliente (el valor, fecha de entrega, persona que recibió la cuenta y fecha
de pago).
La aplicación debe permitir realizar búsquedas por tipo de producción, director, productor, cliente
o fecha de producción.
CASO 6: Una compañía de Videojuegos está realizando una novedosa aplicación que permite a los
usuarios crear juegos de manera colaborativa, si el resultado es atractivo, es posible que la
compañía adquiera los derechos sobre él, si no es así, se dispondrá de forma gratuita para que
pueda ser jugado en línea.
Su equipo de trabajo ha sido contratado para desarrollar la base de datos que soporte la creación
del juego, el cual debe permitir crear el juego asignando un nombre, una imagen, un video de
introducción; igualmente debe permitir crear niveles del juego, cada nivel se compone de varias
escenas, en las escenas se encuentran elementos (para lo cual la compañía dispone de un librería
de elementos o el usuario puede adicionarlos) que pueden ser adaptados a la escena (esto implica
dar su ubicación, cambiar el tamaño, la textura, el color o girarlo n grados), igualmente cada
escena puede llevar una imagen de fondo (deben usarse las que dispone la compañía) y música
(esta debe ser provista por el usuario).
Considerando que la idea es que sea un trabajo colaborativo, varios usuarios pueden participar en
su creación, es decir que cada escena puede ser desarrollada entre varios usuarios y todos
aquellos que participen en la creación de escenas se considerarán autores del juego. Para esto,
cada usuario debe registrarse indicando sus datos básicos y una cuenta de correo electrónico que
servirá para contactarlo; la única condición es que un usuario no puede alterar algo que haya
hecho otro usuario, sin embargo la aplicación le permitirá enviar una sugerencia por correo
electrónico para realizar un cambio, todos estos comentarios deben quedar almacenados para su
posterior revisión.
CASO 7: En una tienda de vídeo se rentan películas a las personas inscritas (que comúnmente se
conocen como socios). Los videos se rentan por un día si la renta ocurre en un día de semana o
dos si la renta ocurre un sábado. En general, se desea conocer datos sobre quienes son socios de
la videotienda (incluyendo una foto que se toma al momento de la inscripción), las películas
disponibles y los vídeos que ha rentado cada socio.
Para facilitar la búsqueda de las películas se dispondrá de un quisco que permitirá al usuario
consultar las películas por título, categoría, actores participantes o director; adicionalmente se
dispondrá de imágenes de la película, los actores y directores y en algunos casos del triller para
ayudar al usuario en su ubicación.
Tenga en cuenta que de una película pueden existir varias copias en la tienda, las cuales se
identificarán con el código de la película más un consecutivo.
CASO 8: Una agencia matrimonial quiere desarrollar un software que le permita llevar un control
de las personas que se han inscrito, incluyendo sus datos personales como nombre, sexo, edad,
profesión, ciudad y país de vivienda, e-mail, una foto y si la persona está de acuerdo, puede incluir
un vídeo de presentación. Al momento de la inscripción cada persona escribe un pequeño texto en
donde indica sus preferencias acerca de las posibles parejas.
Igualmente se debe llevar control de las citas concertadas (hora, fecha y lugar) y cada uno de los
participantes escribe un comentario sobre la cita; si las personas involucradas en una cita llegan a
casarse, también se incluyen los datos del matrimonio. Una persona puede inactivarse cambiando
su estado a no disponible y obviamente cuando se casan, el estado cambia a casado, lo cual,
también lo inactiva.
CASO 10: Se quiere desarrollar una base de datos que soporte una aplicación para almacenar y
consultar accidentes de tránsito. Es necesario conocer la información propia del accidente (dónde,
cuándo y qué ocurrió exactamente); las personas implicadas, las cuales pueden ser conductores de
vehículos, pasajeros o peatones, igualmente se debe indicar si cada una de las personas sufrió
heridas o muerte en el accidente; los vehículos implicados, incluyendo su dueño y los seguros que
pueda tener (SOAT, seguro de accidentes, etc.); el agente de tránsito que sigue el caso.
CASO 11: En una Universidad se quiere tener una base de datos que tenga los datos de los
profesores que dictan cada una de las asignaturas y de los estudiantes que toman estas mismas
asignaturas. Se sabe que para cada asignatura se programan varios cursos por periodo académico
y obviamente, cada curso es asignado a un único profesor. Adicionalmente, debe verificarse que
un estudiante que desee tomar una asignatura haya aprobado el prerrequisito correspondiente
(un estudiante aprueba una asignatura si tiene una nota de 3.0 o superior).
CASO 12: CINENACIONAL es la cadena de cine más grande del país, tienen distribuidos teatros
multiplex en diferentes ciudades, cada uno de los cuales incluye entre 4 y 10 salas. Se quiere
diseñar una base de datos, para almacenar los datos básicos de cada cliente (todos los clientes
tienen una tarjeta con la que realizan la compra de sus boletas), los datos de las películas que se
presentan y los datos básicos de las salas y teatros. La idea es que se puedan realizar consultas
sobre las películas más vistas, las películas que se presentan en determinada ciudad o teatro, las
ventas que se realizan a los clientes y las salas con mayor ocupación.
CASO 13: Una compañía de transporte de mercancías, está diseñando la Base de Datos para el
control de sus operaciones; sobre estas se sabe que los clientes pueden enviar o recibir paquetes
de la compañía, por facilidad, cada cliente se identifica mediante el número telefónico y de ellos se
debe conocer una identificación (si es una persona natural), el nombre, la dirección y algunas
observaciones (que se usa principalmente si el cliente es una institución). Un cliente puede remitir
varios paquetes, si todos van al mismo destino, entonces se agrupan en un envío que se radica con
un número, la fecha y hora de envío y se guarda el valor del envío. Por su parte, cada paquete
incluye un consecutivo por envío y se hace una descripción, para cierto tipo de mercancías debe
incluirse el valor aproximado del paquete, por posibles reclamos de seguros.
Los envíos son transportados en camiones, aunque puede ocurrir que un camión solamente haga
una parte del recorrido del paquete; cada camión cubre una ruta entre dos ciudades, aunque
también podría ser un recorrido interno dentro de una ciudad.
NORMALIZACIÓN
Para los siguientes casos, debe verificarse que el modelo está en 3FN y si no es así, debe llevarse a
esa forma normal, si el
CASO 14: Se quiere desarrollar un sistema de información para las consultas en el centro médico
“SANITOS”, sobre el sistema, se tiene la siguiente información:
Se sabe que un paquete puede estar compuesto de varios artículos, por ejemplo Juan Pérez envía
el paquete número 01200 y en este envía dos libros, un reloj y una loción; por ello es necesario
conocer todos los artículos que componen cada paquete (su peso, descripción y valor
aproximado), como medida de control, los artículos se numeran de forma consecutiva por cada
paquete.
El director de logística, al saber que se estaba desarrollando una Base de Datos, solicitó que se
incluyeran los datos de los camiones que transportan los paquetes, sabiendo que un paquete
desde su origen hasta su destino puede ser transportado por varios camiones. En la empresa cada
camión está identificado mediante un código asignado al momento de comprar el camión.
CASO 16: En una Universidad se quiere tener una base de datos que almacene los datos de los
profesores que dictan cada una de las asignaturas y de los estudiantes que toman estas mismas
asignaturas. Se sabe que para cada asignatura se programan varios cursos por periodo académico
y obviamente, cada curso es asignado a un único profesor. Adicionalmente, debe verificarse que
un estudiante que desee tomar una asignatura haya aprobado el prerrequisito correspondiente
(un estudiante aprueba una asignatura si tiene una nota de 3.0 o superior).
CASO 17: En la empresa EQUIPOS INDUSTRIALES, tienen diferente clase de equipos que
distribuyen en sus departamentos, cada equipo se encuentra a cargo de un empleado, que debe
responder por el mismo y en caso de ausencia, el jefe de ese empleado, será quien responda por
el equipo. La empresa requiere una base de datos que le permita conocer sobre los
mantenimientos que se solicitan y/o realizan a cada equipo, incluyendo los datos de la persona
que realizó el mantenimiento, que puede ser un empleado de la empresa o una persona externa
que se contrata para tal fin; igualmente debe tenerse información de las piezas que se cambian
durante el mantenimiento, indicando cuál pieza se elimina del equipo y cual pieza entra a
remplazarla.
CASO 18: En una empresa se quiere llevar un estricto control de sus pedidos. Cada pedido se
compone de varias líneas, en cada una de las cuales se determina un artículo solicitado con su
código y nombre, la cantidad que se solicita, su precio unitario, el precio total por dicho artículo y
el porcentaje de descuento sobre el mismo.
CASO 19: En la venta de autos “El pichirilo” se quieren guardar los datos de cada venta que se
realiza, incluyendo datos del auto, el vendedor y la venta misma. Es necesario aclarar que cada
vendedor tiene un porcentaje de comisión asignado, el cual es invariable, independiente del valor
de la venta que realice. Igualmente, se tiene establecido, que en ciertas fechas se realizan
descuentos especiales.
NOTA: Si observan bien, la entidad no tiene clave, por lo tanto, su primer trabajo es determinar la
clase apropiada.
CASO 20: Se desea implementar una base de datos para una biblioteca, de forma que se puedan
consultar rápidamente los datos de los libros bien sea por título, por el código asignado en la
biblioteca, por el nombre de algún autor o por el tema al que pertenecen; igualmente se quiere
consultar los nombres de las personas que han prestado el libro (lectores), ordenado por apellido.
CASO 21: En un restaurante se contratan diferentes chefs para que construyan los menús que se
ofrecerán a los clientes, cada menú tiene un tiempo de vigencia, por ello es importante
determinar cuál es el que está vigente. Cada menú incluye varios platos que serán presentados a
los clientes con el nombre respectivo y el valor comercial, pero para el trabajo interno del
restaurante se debe conocer cuáles ingredientes (nombre, cantidad y valor promedio) se incluyen
en el plato, cuál es el valor real del plato, el número de veces que se ha pedido en el restaurante y
la receta, está última se maneja como un archivo de texto.
Inicialmente se ha definido el siguiente modelo, que debe ser revisado y llevado a 3FN y ajustado.
CASO 22: En una organización se desarrollan diferentes proyectos, los cuales son asignados a un
departamento específico, cada proyecto tiene asignado un número consecutivo por
departamento, nombre, presupuesto total, un periodo de trabajo (desde qué fecha y hasta qué
fecha se realizará), una duración real (puede ser diferente a lo planeado inicialmente), un
encargado (que debe pertenecer al departamento del proyecto), unos participantes (que también
son empleados del departamento) y una actividades definidas, para cada actividad se tiene un
nombre, fecha de inicio, fecha de fin y si tiene otra actividad predecesora, es decir, si se debe
terminar otra actividad antes de realizar esta (cada actividad tiene máximo una predecesora).
CASO 23: Una asociación de ingenieros internacional ha decidido desarrollar una Base de Datos
que le permita llevar el control de sus publicaciones seriadas (revistas). Cada revista tiene un título
y un código internacional llamado ISSN, cada publicación de la revista tiene se identifica con un
volumen (que generalmente corresponde al año) y un número y corresponde a un periodo en
particular (por ejemplo, enero – mayo de 2012).
Generalmente se hace convocatoria abierta para las publicaciones, es decir, que se reciben
artículos de forma permanente para ser evaluados, los artículos deben ser entregados en formato
pdf, pero debe entregarse de forma separada un resumen del mismo; cada artículo debe incluir un
titulo en español y en ingles, el o los temas que trata (generalmente se toman de un listado de
temas que maneja la asociación), los autores (incluyendo nombre, grado académico, institución a
la que pertenecen y e_mail); cuando se recibe un artículo se le asigna un código y se envía a
evaluar por parte de 2 ó 3 personas, dependiendo de la temática.
De los evaluadores se tienen sus datos básicos (nombre, identificación, profesión, grado
académico), los datos de la institución a la que se encuentre vinculado (siglas, nombre, web
institucional) y el o las área(s) de trabajo que maneja, este último dato facilita la asignación de
evaluadores para los artículos. A los evaluadores se les paga una comisión por el trabajo de
evaluación del artículo, la cual depende del grado académico que tenga.
Cada evaluador, califica en una escala de 1 a 10 cuatro aspectos del artículo: calidad, pertinencia,
aplicabilidad y desarrollo general; de acuerdo a las calificaciones que den los evaluadores, la
asociación decide publicar o no el artículo y en cual revista hacerlo. Para asegurar la transparencia
del proceso, se guardan las evaluaciones de todos los artículos.
CASO 24: En una Universidad se quiere tener una base de datos que tenga los datos de los
profesores que dictan cada una de las asignaturas y de los estudiantes que toman estas mismas
asignaturas. Se sabe que para cada asignatura se programan varios cursos por periodo académico
y obviamente, cada curso es asignado a un único profesor. Adicionalmente, debe verificarse que
un estudiante que desee tomar una asignatura haya aprobado el prerrequisito correspondiente
(un estudiante aprueba una asignatura si tiene una nota de 3.0 o superior).
MODELAMIENTO
Para cada uno de los casos planteados, presente:
Un modelo entidad-relación inicial.
Indique en qué forma normal se encuentra el modelo (justifique) y si es necesario, indique
los cambios requeridos para llevarlo a 3FN.
Presente el modelo entidad – relación final que se encuentre en 3FN, no tenga ciclos ni
relaciones muchos a muchos.
Presente el Modelo Relacional de Datos equivalente al MER presentado.
CASO 25: En el torneo de fútbol profesional colombiano participan equipos de las principales
ciudades del país de las cuales necesitamos conocer su población, altura y temperatura promedio.
Hay ciudades que tienen más de un equipo y deben tener por lo menos un estadio, del cual
necesitamos conocer su nombre, la ciudad de ubicación el equipo al cual pertenece, su capacidad
y el largo y ancho de la cancha. Todo equipo debe tener un estadio aunque los estadios pueden
ser compartidos por varios equipos.
Los equipos tienen un grupo de jugadores, unos en préstamo y otros propios. Los jugadores no
pueden cambiar de equipo durante el campeonato pero nos interesa saber en qué equipos han
jugado y quién es el dueño de su pase. Ellos se identifican por un código dado por la FIFA y
guardamos sus apellidos, nombres, equipo al cual pertenecen, equipo en el cual están jugando
actualmente, número de goles anotados en el presente campeonato y número de tarjetas
amarillas y rojas acumuladas en el presente campeonato.
En los partidos de cada fecha un equipo juega de local y otro de visitante; aunque no siempre se
juega en el estadio del local. De cada partido registramos las alineaciones de cada equipo y sus
goles, el estadio en el cual se jugó, el número de personas que asistieron, el valor de la taquilla, las
tarjetas amarillas y rojas y los jugadores a quienes se las impusieron, los goles anotados por cada
jugador, los cambios que se realizaron, el árbitro central y los jueces de línea. De los árbitros
guardamos su código dado por la FIFA, apellidos, nombre y tiempo de experiencia.
Aunque es información derivable, también guardamos la tabla actualizada de posiciones del
campeonato, para no calcularla cada vez que se consulta. Esta tabla contiene la posición del
equipo, el número de partidos jugados, empatados y perdidos, el número de goles a favor y en
contra y el número total de puntos.
CASO 26: La editorial ABC trabaja con varios autores diferentes que escriben los libros que publica
y normalmente lleva registro del título del libro, su número de páginas, código, los nombres de los
autores, su cédula, dirección y teléfono.
Algunos de nuestros autores han escrito sólo un libro, mientras que otros han escrito varios;
además, algunos libros tienen coautoría. Los libros tienen un autor principal y algunos un coautor
o varios. Obviamente, es necesario sabe quién es su autor principal o quienes sus coautores.
ABC también trabaja con múltiples imprentas de las cuales registra su nombre, dirección y
teléfono. Un libro dado lo imprime una sola imprenta.
Los editores, empleados de ABC, trabajan con diversos autores al mismo tiempo, editando y
produciendo sus libros; es labor del editor dar a la imprenta la copia final y revisada y esto lo hace
sólo un editor. Llevamos un registro histórico de qué autores han trabajado con qué autor.
Cada autor recibe un salario mensual básico, diferente para los distintos editores; además, recibe
también una comisión por cada libro editado y producido ese mes, que depende de la antigüedad
del editor y el número de páginas del libro. ABC necesita esta información para poder pagar a sus
editores cada mes8.
CASO 27: En una galería de arte se quiere llevar la información de las exposiciones realizadas, los
artistas contratados y los cuadros vendidos; se le ha solicitado a su equipo de trabajo que diseñe
una base de datos que permita recoger la siguiente información:
Fechas y nombre de las exposiciones realizadas (considere que las exposiciones duran
entre 1 y 3 semanas).
Fecha y costo del lanzamiento de la exposición, refiriéndose al acto con el que se da inicio
a la exposición; en general es el primer día de la exposición, pero en algunas ocasiones se
ha realizado el lanzamiento hasta una semana antes de iniciar la exposición.
Nombre de las obras expuestas en cada exposición.
Fecha de creación de una obra en particular (en general los artistas solamente incluyen el
año, pero algunos incluyen mes y año).
Nombre del o de los artistas que se incluyeron en una exposición.
Datos de contacto de un artista (dirección, teléfono fijo, celular, ciudad, e-mail, usuario en
Facebook, usuario en twitter, página web).
Nombre y ubicación de los clientes, es decir, las personas que han comprado cuadros en la
galería.
Nombre de la persona que compró un cuadro en particular.
Estilo y técnica utilizada en cada obra expuesta.
Nombre del artista que desarrolló cada obra expuesta o vendida en la galería.
Nombre de los clientes que han comprado obras de un artista en particular.
Datos de cada compra: fecha, valor, nombre de la obra, nombre del artista, nombra del
cliente, forma de pago (efectivo, tarjeta debito, tarjeta crédito, cheque).
Comentarios que han realizado los clientes sobre una obra o una exposición.
8
Tomado de Notas de Clase: Ingeniería de Software. ICESI. Guillermo Londoño.
REFERENCIAS
Entre las principales característica del SQL se encuentra su simplicidad, lo que permite que
personas no expertas en el manejo de Bases de Datos puedan emplearlo para realizar consultas y
operaciones sencillas y la portabilidad, que brinda la opción de ser utilizado por diferentes
manejadores de bases de datos relacionales. Adicionalmente SQL establece reglas para el manejo
de la base de datos, de tal forma que se asegura la integridad y consistencia de los datos.
Por ejemplo:
CREATE DATABASE nomina; lo cual creará una base de datos llamada nomina
Una vez creada la base de datos se puede empezar a trabajar con ella, basta seleccionarla cada vez
que se vaya a trabajar con ella, para esto se emplea el comando USE.
Por ejemplo:
USE nomina;
TIPOS DE DATOS
SQL maneja tipos de datos estándar, sin embargo algunos manejadores han hecho variación sobre
estos datos; la tabla a continuación presenta los tipos estándar de SQL y su equivalente en Oracle.
9
Últimas versiones de MySQL solamente aceptan VARCHAR, a diferencia de Oracle donde el VARCHAR
fue reemplazado por VARCHAR2.
DATE Datos fecha y hora. DATETIME, DATE, TIMESTAMP,
TIME y YEAR.
CREACIÓN DE TABLAS
Para la creación de una Bases de datos a través del manejador, básicamente se deben crear las
tablas que se incluyen en la base de datos, especificando sus características.
Por ejemplo:
Restricciones
Para adicionar restricciones a las columnas se pueden emplear las palabras que se muestran en la
siguiente tabla:
Palabra Descripción
Por ejemplo:
En el caso anterior, se está especificando que todos los campos son obligatorios y que el
login es la llave primaria de la tabla.
La llave primara es una llave compuesta de nombre y anho, por esta razón no puede
incluirse en los nombres de las columnas (sería como si tuvieras dos llaves primarias lo
cual no es válido), en estos casos, debe crearse una restricción (CONSTRAINT) a la cual se
asigna un nombre que la identifique (album_pk), se indica que restricción de llave primaria
(PRIMARY KEY) y los campos que la conforman (nombre y anho).
Finalmente se ha adicionado una restricción que permite asegurar que el valor del año sea
mayor que 0, nuevamente se indicar que es una restricción (CONSTRAINT), se le agrega el
nombre (anho_album) se indica que es una restricción de chequeo (CHECK) y se incluye la
condición respectiva (anho >0).
La restricción FOREIGN KEY marca la llave foránea de la tabla, en este caso se incluye un nombre
para la restricción (mp_fk), el tipo de restricción (FOREIGN KEY), el campo dentro de la tabla actual
que es llave foránea (log_cliente) y la referencia, que indica a cuál campo (login) de cuál tabla
(clientes) hace referencia esta llave foránea.
Adicionalmente, en la restricción de llave foránea se pueden incluir dos instrucciones que ayudan
a mantener la integridad de las tablas:
ON DELETE CASCADE: indica que si se elimina la fila en la tabla padre, se eliminen las filas
relacionadas en las tablas hijas.
ON DELETE SET NULL: cuando se elimina un valor en la tabla padre, los valores de las llaves
foráneas en las hijas se vuelven nulos.
10
Inicialmente no se van a ingresar datos de tipo BLOB, así que es conveniente dejar como NULL
(opcionales), todos los atributos de este tipo.
AUTOINCREMENTO
MySQL tiene una opción para manejar los tipos consecutivos o autoincrementales, con los cuales
se genera de forma automática un identificador único para cada nueva fila de la tabla; para ello,
basta adicionar a la definición de la columna la palabra AUTO_INCREMENT.
Por ejemplo:
MODIFICACIÓN DE TABLAS
Una vez creadas las tablas es posible que se requiera hacer cambios sobre la estructura de las
mismas, las siguientes instrucciones permiten realizar estos cambios:
1. Renombrar una tabla: Permite cambiar el nombre de la tabla después que ha sido creada-
Por ejemplo:
ALTER TABLE Clientes
RENAME Usuarios;
2. Adicionar columnas a una tabla: Permite agregar columnas a una tabla ya creada, debe
tenerse en cuenta que esta nueva columna no puede tener restricción Not Null, especialmente
si ya existen datos ingresados en la tabla.
ALTER TABLE <nombre_tabla>
ADD <columna> <definiciones>
Por ejemplo:
ALTER TABLE clientes
ADD tipo_pago varchar(10) NULL;
Modificar una columna de una tabla: Permite variar las especificaciones de una columna en
una tabla, nuevamente debe tenerse en cuenta que si ya existen datos ingresados en la tabla,
los cambios admitidos sobre la columna serán limitados.
Por ejemplo:
ALTER TABLE clientes
MODIFY login varchar(45) NOT NULL;
3. Borrar una columna de una tabla: Permite eliminar una columna de una tabla, esta operación
será posible si no corresponde a una llave primaria o foránea.
Por ejemplo:
4. Renombrar una columna de una tabla: Permite cambiar el nombre a una columna de una
tabla, esta operación será posible si no corresponde a una llave foránea.
Por ejemplo:
5. Adicionar restricciones de una tabla: Esta operación permite adicionar restricciones a una
tabla, esta operación será válida si la columna sobre la cual se implementa la restricción no
tiene valores.
Por ejemplo:
6. Borrar una tabla: Esta operación borrará todos los datos de la tabla y su estructura de la Base
de Datos, nuevamente debe considerarse si la tabla que se pretende eliminar se encuentra
enlazada a otra mediante una llave foránea y que tipo de borrado se implementó en la llave
foránea.
Por ejemplo:
1. Insertar datos en la tabla: Para insertar datos en la tabla se emplea la instrucción INSERT
INTO, la cual varía si se van a insertar todos los campos de la tabla o solamente algunos.
Si se van a insertar todos los campos de la tabla, en el orden definido al crearla, la instrucción
es la siguiente:
Por ejemplo:
Por otra parte, si no se van a insertar todos los campos de la tabla o se quieren insertar en un
orden diferente al que se estableció cuando se creó la tabla, es necesario indicar los nombres
de las columnas (o campos) a insertar:
Por ejemplo:
NOTA: En MySQL el tipo de dato DATE se almacena en formato YYYY-MM-DD, aunque existen
varias formas de realizar la inserción: '03-05-21’, '04.05.21', '05/05/21', '06@05@21', NOW();
Observación 1: Debe tenerse en cuenta que las columnas o campos no insertados deben ser no
obligatorios, de otra forma se generaría un error en el proceso de inserción.
UPDATE <nombre_tabla>
SET <columna> = <valor>
WHERE <condicion>;
Por ejemplo:
UPDATE medio_pago
SET tipo = ‘T’;
En este caso, se modifica el campo tipo de la tabla medio_pago, poniendo el valor ‘T’ para
TODOS los registros de la tabla.
UPDATE medio_pago
SET tipo = ‘P’
WHERE numero=987654321;
En este caso, se modifica el tipo de la tabla medio_pago, poniendo el valor ‘P’ solamente para
el o los registros que tengan número = 987654321.
UPDATE empleado
SET salario = salario*1.1;
En caso anterior muestra cómo se pueden realizar operaciones sobre los campos para realizar
la actualización de los mismos.
3. Borrado de datos: Esta es la operación para eliminar datos que se han insertado en la tabla,
nuevamente la condición es opcional, si no es incluye, se eliminarán todos los datos de la
tabla.
Por ejemplo:
Eliminará de la tabla medio_pago, aquellos registros que tengan como numero 987654321
CONSULTAS
El lenguaje SQL fue diseñado originalmente para realizar consultas en las bases de datos, con esta
intención se proporciona una sentencia, comúnmente llamada SELECT.
En el SELECT se especifican las columnas que se quieren consultar o * si se quieren consultar todas
las columnas de la tabla y en el FROM se indica la tabla sobre la que se está haciendo la consulta.
Por ejemplo:
SELECT *
FROM medios_pago;
Consulta todos los datos (campos) de todos los registros de la tabla medios_pago.
Este último ejemplo muestra cómo se pueden realizar operaciones básicas en el momento
de la consulta.
Operador Descripción
Por ejemplo:
Consulta el nombre y año de los registros de la table albunes cuyo año sea mayor a 1990.
SELECT *
FROM medio_pago
WHERE tipo = ‘T’;
Consulta todos los datos de los medios de pago que sean de tipo ‘T’.
Consulta el nombre y constraseña de los clientes cuyo nombre empiece por Jul.
SELECT *
FROM medio_pago
WHERE tipo = ‘T’ AND fecha_vencimiento > ‘2011-01-01’;
Consulta todos los datos de la tabla medios de pago, que tengan como tipo ‘T’ y cuya fecha
de vencimiento sea mayor al 01 de enero de 2011.
Ordenamiento
Los datos obtenidos de la consulta pueden ser ordenados por alguno de los campos, por defecto el
ordenamiento se hace de forma Ascendente, si se quiere cambiar esto, se debe indicar poniendo
la palabra DESC en la sentencia de ordenamiento.
Por ejemplo:
SELECT *
FROM usuarios
ORDER BY login, password;
Agrupamiento
En algunas ocasiones los resultados de la consulta pueden generar datos repetidos, por ejemplo
en la siguiente consulta:
SELECT login
FROM compras;
Si se quiere consultar solamente los datos que sean diferentes, sin considerar repetidos, se puede
realizar un agrupamiento; para esto, debe tener en cuenta que el agrupamiento debe realizarse
por uno de los campos consultados.
Por ejemplo:
SELECT login
FROM compras
GROUP BY login;
Operación Descripción
SUM Suma el valor de los registros
AVG Promedio de los valores de registro
COUNT Conteo de Registros
MIN Valor mínimo del conjunto
MAX Valor máximo del conjunto.
Por ejemplo:
SELECT COUNT(*)
FROM vendedores;
SELECT AVG(numero_orden)
FROM ventas
WHERE precio>200;
Si se quiere agregar una condición sobre los valores calculados, se puede hacer con la cláusula
HAVING, aunque debe tenerse en cuenta que la operación haya sido incluida en el Select.
Por ejemplo:
Por ejemplo:
Cuando se quiere hacer mayor claridad sobre cada campo, se puede adicionar el nombre
de la tabla antes del nombre del campo:
Cuando las tablas involucradas en la consulta tienen campos con el mismo nombre, se
debe asignar a cada tabla un alias (nombre temporal) para referirse con precisión a los
campos de cada una:
Arquitectura
El JDBC permite trabajar con arquitecturas de software de 2 o 3 capas. En una arquitectura de dos
capas (aplicación y datos), el JDBC se ubica en la capa de aplicación; en una arquitectura de tres
capas (aplicación, control y datos), el JDBC se ubica en la capa del control, desde donde se realiza
el acceso a los datos.
En cualquier caso, el JDBC debe entenderse como el intermediario entre la aplicación que se
realiza en Java y el DBMS correspondiente que se esté usando (por ejemplo Oracle), lo que da
como ventaja, entre otras cosas, que se pueda cambiar fácilmente de manejador para la base de
datos, sin que esto afecte las sentencias de la aplicación. La siguiente figura presenta un esquema
de las conexiones entre la aplicación, el JDBC y el DBMS.
USANDO EL JDBC
Para acceder a una Base de Datos desde Java, lo primero que se debe hacer es establecer la
conexión con la Base de Datos.
Generalmente una aplicación JDBC se conecta a una fuente de datos usando dos mecanismos:
• DriverManager: Permite cargar un driver específico usando una dirección URL (lo que permite
acceder a una Base de Datos que se encuentre en otro sitio físico). Como parte de la
inicialización, el DriverManager carga las clases driver referenciadas.
• DataSource: Esta interface es preferida sobre el DriverManager, ya que permite manejar
detalles adicionales sobre la fuente de datos.
Para establecer la conexión se requieren dos pasos: cargar el driver y crear la conexión
efectivamente.
1. Cargar el Driver
Para realizar la carga del driver, se debe verificar que este se encuentre disponible desde Java,
si no es así, se debe buscar el driver en la página del fabricante e instalarlo en el directorio
respectivo de Java. En la documentación asociada al driver se indica el nombre que debe
usarse para su acceso.
Por ejemplo:
Para MySQL:
Class.forName("com.mysql.jdbc.Driver");
Para Oracle:
Class.forName("oracle.jdbc.driver.OracleDriver")
2. Establecer la Conexión
Una vez se ha establecido la conexión, se empleará esta para realizar las diferentes operaciones
que se requieran sobre la base de datos.
• Debe crearse una sentencia (statement) para realizar la consulta, esta sentencia será un objeto
de alguna clase que implemente java.sql.Statement
• Debe construirse la consulta a realizar como una cadena, esta consulta debe escribirse tal
como se haría en el manejador sin incluir el punto y coma final.
ResultSet rs = stmt.executeQuery(query);
11
En el caso de MySQL el usuario por defecto es root, así que este debería ser el login aemplear.
ACTUALIZACIÓN DE LA BASE DE DATOS
Si se desea realizar una operación de inserción, borrado o actualización de datos sobre la Base de
Datos, debe emplearse el método executeUpdate() en lugar del executeQuery, este método
retorna un entero donde indica cuántas filas o registros de la Base de Datos se afectaron al
ejecutar la instrucción.
EL RESULTSET
ResultSet es una tabla de datos que representa el conjunto de resultados que se obtienen de una
consulta a una base de datos; un objeto derivado de ResultSet mantiene un cursor a una fila de la
tabla, inicialmente se ubica antes de la primera posición y va cambiando a la siguiente cada vez
que se da la instrucción next(), cuando no hay más filas en la tabla, este método retornará false.
Método Accion
next() mueve el cursor a la siguiente fila.
previous() mueve el cursor a la fila anterior.
first() mueve el cursor a la primera fila.
last() mueve el cursos a la última fila.
beforeFirst() posiciona el cursor al inicio del ResultSet, antes de la primera
fila.
afterLast() posiciona el cursor al final del ResultSet, después de la última
fila.
relative(int rows) mueve el cursos a una posición relativa a la actual.
absolute(int row) mueve el cursos a una posición absoluta.
getXxx() retorna el valor de la columna especificada por el nombre o
indice. Los tipos válidos son: double, byte, int, Date, String,
float, short, long, Time, Object
La forma más sencilla de recorrer un ResultSet es la siguiente:
while (rs.next()) {
System.out.println(“SSN: “+ rs.getInt(“ssn”).trim());
System.out.println(“Name: “+rs.getString(“cust_name”).trim());
System.out.println(“Address: “+rs.getString(“address”).trim();
System.out.println(“ ”);
}
En este caso, se ejecuta el ciclo mientras existan más registros o filas en la tabla del
resultSet, para cada registro se recupera el campo denominado ssn, el campo cust_name y
el campo address; estos campos pueden recuperarse con el nombre del campo o con el
número de la posición en que se encuentra el campo, por ejemplo ssn sería el campo 1,
cust_name el campo 2 y address el campo, por lo tanto la misma porción de código se
podría escribir así:
while (rs.next()) {
System.out.println(“SSN: “+ rs.getInt(1).trim());
System.out.println(“Name: “+rs.getString(2).trim());
System.out.println(“Address: “+rs.getString(3).trim();
System.out.println(“ ”);
}
Observe que en la primera forma, los nombres de las columnas se escriben entre comillas,
ya que son cadenas; en la segunda forma son enteros por tanto, no deben incluirse
comillas.
Para realizar una correcta recuperación de datos, es preciso conocer el tipo de cada
columna en la Base de datos, en este caso, el ssn es un entero y por ello se recupera con
getInt(),a diferencia del nombre y dirección que son cadenas y se recuperan con getString().
Ejemplo 1:
La siguiente clase, permite consultar los datos de la tabla llamada PROFESORES, en la base
de datos denominada OBJETOS.
results.append( "\n" );
}
} // end try
Procedimiento:
1. Ingrese a través del “Asistente de configuración de la Base de Datos” y cree una nueva
base de datos llamada Tienda.
2. Ingrese a través del “SQL Plus”, con el login: system, password: system y Hot String:
Tienda.
3. Cree las tablas de la base de datos, de acuerdo a lo indicado en el siguiente modelo
relacional de datos. Recuerde que el orden de creación es importante, ya que para
crear una restricción de llave foránea, debe estar creada la tabla y columna a la que
hace referencia.
CLIENTES
Nombre nombre login contrasena email
Tipo Varchar2(20) Varchar2(15) Varchar2(15) Varchar2(15)
Obligatoriedad NN NN NN NN
Llaves PK
Dominio
ALBUNES
Nombre caratula nombre anho precio
Tipo BLOB Varchar2(20) Number Number(10,2)
Obligatoriedad N NN NN NN
Llaves PK PK
Dominio
ARTISTAS
Nombre genero_1 genero_2 genero_3 casa_disquera nombre foto
Tipo Varchar2(10) Varchar2(10) Varchar2(10) Varchar2(20) Varchar2(30) BLOB
Obligatoriedad NN N N N N N
Llaves
Dominio
MEDIOS_PAGO
Nombre tipo numero fecha_venc log_cliente
Tipo Varchar2(1) Number Date Varchar2(15)
Obligatoriedad NN NN N NN
Llaves PK PK FK(Clientes)
Dominio T','P'
COMPRAS
Nombre fecha numero tipo_mp numero_mp
Tipo Date Number Varchar2(1) Number
Obligatoriedad NN NN NN NN
Llaves PK FK(medios_pago) FK(medios_pago)
Dominio
CANCION
Nombre duracion nombre genero tamano formato
Tipo Numbre Varchar2(20) Varchar2(20) Number Varchar2(10)
Obligatoriedad NN NN NN NN NN
Llaves
Dominio
DETALLES_CARRITO
Nombre fecha cod_cancion log_cliente
Tipo Date Number Varchar2(15)
Obligatoriedad NN NN NN
Llaves FK(canciones), PK FK(Clientes), PK
Dominio
PISTAS
Nombre numero nom_album anho_album cod_cancion
Tipo Number Varchar2(20) Number Number
Obligatoriedad NN NN NN NN
Llaves PK FK(albunes),PK FK(albunes),PK FK(canciones)
Dominio >0
DETALLES_COMPRA
Nombre precio num_descargas cod_cancion num_compra
Tipo Number(10,2) Number Number Number
Obligatoriedad NN NN NN NN
Llaves FK(canciones), PK FK(Compras),PK
Dominio
Valor Defecto 0
PAGOS
Nombre fecha nom_artista
Tipo Date Varchar2(30)
Obligatoriedad NN NN
Llaves PK FK(Artistas),PK
Dominio
CANCIONES_PAGADAS
Nombre valor_pagado fecha_pago nom_artista cod_cancion
Tipo Number(10,2) Date Varchar2(30) Number
Obligatoriedad NN NN NN NN
Llaves FK(Pagos),PK FK(Pagos),PK FK(canciones), PK
Dominio >0
CLIENTES
Nombre login contrasena email
Jonathan Acosta jacosta 123juanito jacosta@hotmail.com
Raul Martinez rmartinez raulito rmartinez@hotmail.com
Nicolas Tafur ntafur nico1999 nico_nico@gmail.com
Miguel Morales mmorales mmorales miguelito@yahoo.com
Holmes Osorio hosorio oso23rio98 hjulianosorio@yahoo.com
ALBUNES
nombre anho precio
No culpes a la noche 2009 65
The number of the beast 1982 120
ARTISTAS
genero_1 genero_2 genero_3 casa_disquera nomb_artistico
Baladas Boleros Sony Music Luis Miguel
Heavy Metal Iron Maiden
CANCIONES
duracion nombre genero tamano formato precio porcentaje codigo nom_artista
200 alguien como tu Balada 30 mp3 3 3,4 1000 Luis Miguel
260 eres Balada 37 wav 3 3,4 1001 Luis Miguel
180 suave Balada 20 mp3 10 3,4 1002 Luis Miguel
The number of the Heavy
290 beast Metal 47 mp3 15 6 2000 Iron Maiden
Heavy
268 Total Eclipse Metal 42 wav 4 5 2001 Iron Maiden
PISTA
numero nombre anho cod_cancion
1 No culpes a la noche 2009 1000
2 No culpes a la noche 2009 1001
3 No culpes a la noche 2009 1002
The number of the
5 beast 1982 2000
The number of the
8 beast 1982 2001
MEDIOS_PAGO
tipo numero fecha_vencimiento log_cliente
'T' 1230000 rmartinez
'P' 9870101 10/06/2012 ntafur
'T' 1212121 rmartinez
'T' 7676767 12/12/2013 mmorales
COMPRAS
fecha numero tipo_mp numero_mp
01/03/2011 1 'P' 9870101
16/02/2011 2 'T' 1212121
16/02/2011 3 'T' 1230000
03/03/2011 4 'T' 1230000
DETALLES_COMPRA
precio num_descargas num_compra cod_cancion
3 1 1 1000
3 3 1 1001
15 2 2 2000
10 1 3 1002
5. Ingrese a Oracle utilizando la Base de Datos Tienda que creó en la práctica anterior.
6. Realice las siguientes consultas sobre la base de datos; para cada una de ellas debe
indicar cuál es la instrucción para realizarla y el resultado obtenido.
a. Consultar todos los datos del artista que tiene como nombre artístico “Luis
Miguel”.
b. Consultar el nombre y duración de las canciones que de género Balada.
c. Consultar el número y nombre de las pistas que tienen año superior a 1999.
d. Consultar todas las compras de tipo T ordenadas por fecha.
e. Consultar todos los datos de los clientes cuyo email empieza por ‘m’ o ‘n’.
f. Consultar las canciones agrupadas por artista, totalizando el precio de las mismas
(obviamente por artista).
g. Consultar las canciones (nombre, duración y precio) de género Heavy Metal en
formato wav.
h. Consultar el nombre del artista, género, nombre del álbum y año.
i. Consultar todos los datos de los medios de pago de Raúl Martinez (OJO debe
consultarse por este nombre, no vale consultar por el email).
j. Consultar la fecha de compra, nombre y tipo del medio de pago, nombre y login
del cliente, para cada compra.
k. Consultar todos los datos de las canciones (incluyendo el nombre del artista) que
se encuentren en albunes del año 2000 o posterior.
l. Consultar todas las compras (incluyendo las canciones compradas) que ha hecho
Nicolás Tafur (OJO debe consultarse por este nombre, no vale consultar por el
email).
7. Ingrese a través del “Asistente de configuración de la Base de Datos” y cree una nueva
base de datos llamada FotoAlbum.
8. Ingrese a través del “SQL Plus”, con el login: system, password: system y Hot String:
FotoAlbum.
9. Cree las tablas de la base de datos, de acuerdo a lo indicado en el siguiente modelo
relacional de datos. Recuerde que el orden de creación es importante, ya que para
crear una restricción de llave foránea, debe estar creada la tabla y columna a la que
hace referencia.
USUARIOS
fecha_nacimient contrasen
Nombre nombre correo o a pais calificacion
Texto(20 Numerico(2
Tipo Texto(30) Texto(20) Fecha Texto(15) ) )
Obligatoriedad NN NN NN NN NN N
Llaves AK PK
Dominio >0
ALBUNES
SESIONES
FOTOS
ETIQUETAS
COMENTARIOS
USUARIOS
ALBUNES
CONTACTOS
privacidad Numero categoria calificacion u_recibe u_contacto
T 1 10 mlgomez@uniweb nenita@msn.net
P 2 Amigo mlgomez@uniweb fmarro@yahoo.com
P 3 jpm42@yahoo.es fmarro@yahoo.com
FOTOS
ETIQUETAS
cod_foto email_usuario
1 nenita@msn.net
1 fmarro@yahoo.com
COMENTARIOS
11. Ingrese a Oracle utilizando la Base de Datos FotoAlbum que creó en la práctica
anterior.
12. Realice las siguientes consultas sobre la base de datos; para cada una de ellas debe
indicar cuál es la instrucción para realizarla y el resultado obtenido.
MySQL define varios tipos de datos BLOB, dependiendo del tamaño que se desea almacenar:
Si se van a almacenar solamente datos de tipo texto (caracteres), se recomienda emplear los tipo
TEXT:
NOTA: Es necesario indicar todo el camino (path) completo donde se encuentra el archivo,
teniendo en cuenta que para sistemas Windows, MySQL no acepta nombres de archivos o
carpetas que tengan espacios (por ejemplo d:\Mis documentos no sería válido) y que debe
incluirse doble barra para indicar las carpetas.
El manejo de los datos grandes desde JDBC se realiza haciendo uso de la clase java.sql.Blob.
Por ejemplo:
Recupera los datos que trae la consulta como Objetos y hace el casting
respectivo para tener la referencia como Blob.
Una vez obtenida la referencia BLOB, el objeto se puede manipular en JAVA dependiendo del tipo
de información que tenga (texto, imagen, audio o video), para ello, se emplearían las APIs
correspondientes en Java: Java 2D, Java 3D, Java Advance Image, Java Image I/O o JMF- Java
Media Framework.
Para realizar la inserción de un dato tipo BLOB desde el JDBC, se emplea un PreparedStament , al
que se asignará un archivo del tipo que se desea.
Por ejemplo:
stmt.setBinaryStream(1,fis,(int)imagen.length());
stmt.setString(2,"dukito");
stmt.setInt(3,2011);
stmt.setInt(4,45000);
stmt.execute();
Los signos de interrogación corresponden a datos que se van a adicionar posteriormente, en este
caso los cuatro datos: caratula, nombre, anho y precio se adicionar después.
Para adicionar el archivo, en este caso para la carátula que es de tipo BLOB, se carga el archivo
correspondiente como un File a través de un FileInputStream; entonces se asigna al campo
correspondiente (1) el archivo correspondiente:
stmt.setBinaryStream(1,fis,(int)imagen.length());
los otros campos se asignan de forma sencilla, según su tipo (String o Int). Finalmente se ejecuta la
sentencia, mediante el comando execute().