Modelos de Bases de Datos Relacionales
Modelos de Bases de Datos Relacionales
relacionales.
¿Qué sería entonces un modelo de datos? Aquél que nos permite describir los elementos que
intervienen en una realidad o en un problema dado y la forma en que se relacionan dichos
elementos entre sí.
Contextualizando, un modelo de datos es por tanto un conjunto de métodos y reglas que indican
cómo se ha de almacenar la información y cómo se han de manipular los datos.
Los SGBD comerciales se basan en un modelo lógico concreto. Por ej. Oracle en el modelo
relacional.
UD2: Base de datos
relacionales.
El modelo relacional fue propuesto por Edgar Frank Codd en los laboratorios de IBM en
California. Como hemos visto, se trata de un modelo lógico que establece una estructura
sobre los datos, independientemente del modo en que luego los almacenemos. Es como si
guardamos nuestra colección de libros, dependiendo del número de habitaciones que tenga en
casa, del tamaño y forma de nuestras estanterías, podremos disponer nuestros libros de un
modo u otro para facilitarnos el acceso y consulta. Los libros serán los mismos pero puedo
disponerlos de distinta forma.
Es importante recordar que el diseño de las tablas del modelo relacional es la segunda fase del
diseño de la base de datos y previamente se ha realizado el diseño conceptual identificando, tras
el análisis, las tablas o relaciones resultantes, sus atributos, restricciones y relaciones.
El nombre de modelo relacional viene de la estrecha relación entre el elemento básico de este
modelo y el concepto matemático de relación. Si tenemos dos conjuntos A y B, una relación
entre estos dos conjuntos sería un subconjunto del producto cartesiano AxB.
El producto cartesiano nos dará la relación de todos los elementos de un conjunto con todos los
elementos de los otros conjuntos de ese producto. Al estar trabajando con conjuntos, no puede
haber elementos repetidos.
Por ejemplo para los dos conjuntos que se presentan en la imagen, uno denominado Marcas que
contiene marcas de coches y otro denominado Modelos que contiene diferentes modelos el
resultado de la operación de producto cartesiano será la combinación de todos los elementos
de un conjunto con los del otro.
UD2: Base de datos
relacionales.
Tuplas: Se refiere a cada elemento de la relación o tabla. En la tabla alumnos hay 5 tuplas
con los atributos DNI, nombre y apellidos de cada uno de los alumnos..
Cada una de las filas de la tabla se corresponde con la idea de registro y tiene que cumplir
que:
Está claro que un atributo en una tupla no puede tomar cualquier valor. No sería lógico que en un
atributo Población se guarde "250€". Estaríamos cometiendo un error. Para evitar este tipo de
situaciones obligaremos a que cada atributo sólo pueda tomar los valores pertenecientes a un
conjunto de valores previamente establecidos, es decir, un atributo tiene asociado un dominio de
valores.
A menudo un dominio se define a través de la declaración de un tipo para el atributo (por ejemplo,
diciendo que es un número entero entre 1 y 16), pero también se pueden definir dominios más
complejos y precisos. Por ejemplo, para el atributo Sexo de los usuarios, podemos definir un
dominio en el que los valores posibles sean "M" o "F" (masculino o femenino).
Una característica fundamental de los dominios es que sean atómicos, es decir, que los valores
contenidos en los atributos no se pueden separar en valores de dominios más simples.
Nombre: Sueldo.
Definición lógica: Sueldo neto del empleado
Tipo de datos: número entero.
Formato: 9.999€.
UD2: Base de datos
relacionales.
Las posibles relaciones que obtenemos al realizar el producto cartesiano (recuerda, el producto
cartesiano consiste en combinar todas las filas de cada columna con las demás) AxBxC da
como resultado una relación de grado 3, ya que tiene 3 columnas
Si cogemos un subconjunto de ésta con 5 filas, tendríamos una relación de cardinalidad 5. Por ej.
UD2: Base de datos
relacionales.
2.3.- Sinónimos.
Los términos vistos hasta ahora tienen distintos sinónimos según la nomenclatura utilizada.
Trabajaremos con tres:
Como hemos visto antes, cada atributo (columna) de la tabla toma un solo valor en cada
tupla (fila).
Cada atributo (columna) tiene un nombre distinto en cada tabla (pero puede ser el mismo en
tablas distintas).
No puede haber dos tuplas (filas) completamente iguales.
Todos los datos de un atributo (columna) deben ser del mismo [Link] hemos definido
que el dominio del atributo Nota sólo admite los valores Aprobado o Suspenso entonces el
dato NOTABLE sería incorrecto ya que no pertenece al dominio.
Aquí lo tenemos un poco más claro, evidentemente es un número entero o con decimales. (En
ocasiones podremos encontrarnos con valores decimales guardados como números enteros. Por
ejemplo, en un campo de “importe” 53.15 se guardaría como 5315 y 47 como 4700).
Hasta ahora hemos visto que vamos a guardar información relacionada en forma de filas y
columnas. Las columnas son los atributos o información que nos interesa incluir del mundo real
que estamos modelando.
Hemos visto que esos atributos se mueven dentro de un dominio, que formalmente es un
conjunto de valores. Pues bien, en términos de sistemas de base de datos, se especifica indicando
el tipo de dato (de forma general) y el conjunto de valores que puede tomar (de forma
restringida). El conjunto de valores restringidos se le indicará en la definición de la tabla si el
SGBD lo permite.
Por ejemplo para un atributo que va a guardar el género (M masculino o F femenino), el tipo de
UD2: Base de datos
relacionales.
datos será carácter o texto de longitud 1. Los valores posibles M o F se indicarán en la definición
de la tabla.
Al crear la relación (tabla) decidimos qué conjunto de datos deberá ser almacenado en los atributos de
las filas. Tenemos que asignar un tipo de dato a cada atributo.
Con la asignación de tipos de datos, también habremos seleccionado un dominio para cada
atributo.
Cada campo:
Existen distintas formas de nombrar los tipos de datos dependiendo del lenguaje que
utilicemos ( C, Java, PHP, MySQL, SQL, Pascal, etc.).
Veamos cuales son los tipos de datos más comunes y habituales, existentes en la mayoría de los
lenguajes, que posteriormente se definirán utilizando la sintaxis específica del lenguaje
elegido.
Texto: almacena cadenas (conjunto) de caracteres: números con los que no vamos a
realizar operaciones matemáticas, letras o símbolos.
Numérico: almacena números. Si dudamos entre numérico o texto tendremos en cuenta si
vamos a realizar operaciones matemáticas con ellos, en cuyo caso será numérico.
Fecha/hora: almacena fechas y horas.
Sí/No: almacena datos que solo tienen dos posibilidades (verdadero/falso). Autonumérico:
se puede considerar un subtipo de Numérico ya que almacena valores numéricos
secuenciales que el SGBD incrementa de modo automático al añadir un registro (fila).
Memo: almacena texto largo (mayor que un tipo texto).
Moneda: pero con una característica especial, y es que los valores representan
cantidades de dinero.
Objeto OLE: almacena gráficos, imágenes o textos creados por otras aplicaciones.
Para determinar qué tipo de dato se asocia a cada atributo se tiene en cuenta el conjunto de
valores que puede tomar y las operaciones que hay que realizar con él.
Un código postal, por ejemplo 06800, a pesar de estar formado por dígitos numéricos, es mejor
definirlo como una cadena de 5 caracteres por dos motivos: porque no se va a realizar
operaciones matemáticas con él y porque los ceros a la izquierda no deben ser obviados como si
fuera numérico. El número de teléfono se encuentra en un caso similar.
Es fundamental determinar de forma correcta el tipo de dato y tamaño para cada atributo, ya que
si se define mal, no permitirá almacenar la información deseada o puede que almacene
información incompleta. Por ejemplo, si se define de un tamaño o longitud inferior al valor que
va a contener. Supongamos que nos precipitamos y definimos el DNI como un campo de tipo
cadena de 8 caracteres; si se quiere registrar el DNI 89234432B que tiene 9 caracteres, es posible
que el sistema lo almacene mal, dejando atrás el carácter sobrante. De ahí la importancia de este
proceso.
UD2: Base de datos
relacionales.
5.- Claves.
UD2: Base de datos
relacionales.
¿Cómo diferenciamos unos usuarios de otros? ¿Cómo sabemos que no estamos recogiendo la misma
información? ¿Cómo vamos a distinguir unas tuplas de otras? Lo haremos mediante los valores de sus
atributos. Para ello, buscaremos un atributo o un conjunto de atributos que identifiquen de modo
único las tuplas (filas) de una relación (tabla). A ese atributo o conjunto de atributos lo llamaremos
superclaves.
Hemos visto que una característica de las tablas era que no puede haber dos tuplas (filas)
completamente iguales, con lo que podemos decir que toda la fila como conjunto sería una
superclave.
Tendríamos que elegir alguna de las superclaves para diferenciar las tuplas. En el modelo
relacional trabajamos con tres tipos de claves:
Claves candidatas.
Claves primarias.
Claves alternativas.
Claves ajenas.
Siguiendo con nuestro ejemplo, podríamos considerar los atributos Login o E_mail como
claves candidatas, ya que sabemos que el Login debe ser único para cada usuario, a E_mail le sucede
lo mismo. Pero también cabe la posibilidad de tomar: Nombre, Apellidos y F_nacimiento, las tres
juntas como clave candidata.
Las claves candidatas pueden estar formadas por más de un atributo, siempre y cuando éstos
identifiquen de forma única a la fila. Cuando una clave candidata está formada por más de un
atributo, se dice que es una clave compuesta.
Unicidad: no puede haber dos tuplas (filas) con los mismos valores para esos atributos.
Irreductibilidad: si se elimina alguno de los atributos deja de ser única.
con el mismo nombre y apellidos o con el mismo nombre y fecha de nacimiento, por lo
que son necesarios los tres atributos (campos) para formar la clave.
Para identificar las claves candidatas de una relación no nos fijaremos en un momento concreto
en el que vemos una base de datos. Puede ocurrir que en ese momento no haya duplicados para
un atributo o conjunto de atributos, pero esto no garantiza que no se puedan producir. El único
modo de identificar las claves candidatas es conociendo el significado real de los atributos
(campos), ya que así podremos saber si es posible que aparezcan duplicados. Es posible
desechar claves como candidatas fijándonos en los posibles valores que podemos llegar a
tener. Por ejemplo, podríamos pensar que Nombre y Apellidos podrían ser una clave candidata,
pero ya sabemos que cabe la posibilidad de que dos personas puedan tener el mismo Nombre y
Apellidos, así que lo descartamos.
Hasta ahora, seguimos teniendo varias claves con las que identificamos de modo único nuestra
relación. De ahí el nombre de candidatas. Hemos de quedarnos con una.
La clave primaria de un relación es aquella clave candidata que se escoge para identificar sus
tuplas de modo único. Ya que una relación no tiene tuplas duplicadas, siempre hay una clave
candidata y, por lo tanto, la relación siempre tiene clave primaria. En el peor caso, la clave
primaria estará formada por todos los atributos de la relación, pero normalmente habrá un
pequeño subconjunto de los atributos que haga esta función. En otros casos, podemos crear un
campo único que identifique las tuplas, por ejemplo un código de usuario, que podrían estar
constituidos por valores autonuméricos.
Las claves candidatas que no son escogidas como clave primaria son denominadas
claves alternativas.
Si en nuestra tabla Usuarios escogemos Login como clave primaria, el E_mail o {Nombre,
Apellidos, F_Nacimiento} serán nuestras claves alternativas.
Una clave ajena, también llamada externa, foránea o secundaria, es un atributo o conjunto
de atributos de una relación cuyos valores coinciden con los valores de la clave primaria de
alguna otra relación (o de la misma). Las claves ajenas representan relaciones entre datos. Dicho
de otra manera, son los datos de atributos de una tabla cuyos valores están relacionados con
atributos de otra tabla.
En la tabla Partidas, se recogen datos como Cod_partida, Fecha y Hora de creación, Nombre
de la partida, etc. ¿Qué campo utilizaremos para relacionarla con la tabla Usuarios? Si nos
basamos en la definición, deberíamos utilizar la clave primaria de la tabla Usuarios. Por tanto, el
atributo Login que es la clave principal en su tabla aparecerá en la tabla Partidas como clave
ajena, externa o secundaria. El Login en Partidas hace referencia a cada jugador que juega esa
partida. En lugar de guardar todos los datos de ese jugador en la misma tabla, lo hacemos en otra
y lo "referenciamos" por su clave primaria tomándola como ajena.
UD2: Base de datos
relacionales.
Es lógico que las claves ajenas no tengan las mismas propiedades y restricciones que
tienen como clave primaria en su tabla, por tanto, sí que pueden repetirse en la tabla. En nuestro
ejemplo, un mismo jugador puede jugar varias partidas.
Las claves ajenas tienen por objetivo establecer una conexión con la clave primaria que
referencian. Por lo tanto, los valores de una clave ajena deben estar presentes como clave
primaria en la tabla a la que hacen referencia, o bien deben ser valores nulos. En caso
contrario, la clave ajena representaría una referencia o conexión incorrecta, lo que supondría que
la información almacenada es inconsistente (no fiable). Imagina un código de jugador en la tabla
Partidas que no se corresponde con ningún jugador de la tabla Usuarios.
Pues bien, en las bases de datos, cada tabla se divide internamente en páginas de datos, y se
define el índice a través de un campo (o campos), y es a partir de este campo desde donde se
busca.
Un índice es una estructura de datos que permite acceder a diferentes filas de una misma tabla, a
través de varios campos. Esto permite un acceso mucho más rápido a los datos.
Los índices son útiles cuando se realizan consultas frecuentes a un rango de filas o una fila de
una tabla. Por ejemplo, si consultamos los usuarios cuya fecha de ingreso es anterior a una fecha
concreta.
Los cambios en los datos de las tablas (agregar, actualizar o borrar filas) son incorporados
automáticamente a los índices con transparencia total.
Debes saber que los índices son independientes, lógica y físicamente de los datos. Es por eso que
pueden ser creados y eliminados en cualquier momento, sin afectar a las tablas ni a otros índices.
¿Cuándo indexamos? No hay un límite de columnas a indexar, si quisiéramos podríamos crear un
índice para cada columna, pero no sería operativo. Normalmente tiene sentido crear índices para
ciertas columnas ya que agilizan las operaciones de búsqueda de bases de datos grandes. Por
ejemplo, si la información de nuestra tabla Usuarios se desea consultar por apellidos a menudo y
se necesita agilidad en los accesos, tiene sentido indexar por esa columna. No conviene
indexar por columnas de gran tamaño porque puede resultar contraproducente.
Al crear índices, las operaciones de modificar o agregar datos se ralentizan, ya que al realizarlas
es necesario actualizar tanto la tabla como el índice. Por tanto hay que pensar bien cuándo
interesa definir o no un índice.
Si se elimina un índice, el acceso a datos puede ser más lento a partir de ese momento.
UD2: Base de datos
relacionales.
El SGBD utiliza índices para la gestión de las claves ajenas y de las claves primarias. En el caso
de las claves primarias serán índices únicos (no admiten valores repetidos).
Cuando por cualquier motivo se desconoce el valor de un campo, por ejemplo, desconocemos el
teléfono del usuario, o
bien ese campo carece de sentido (siguiendo con el mismo ejemplo, puede que el usuario no
tenga teléfono), podemos asignar a ese campo el valor especial NULO.
Cuando trabajamos con claves secundarias el valor nulo indica que la tupla o fila no está relacionada
con ninguna otra tupla o fila. Este valor NULO es común a cualquier dominio.
Pero ten en cuenta una cosa, no es lo mismo valor NULO que ESPACIO EN BLANCO.
Tampoco será lo mismo valor NULO que el valor CERO.
Un ordenador tomará un espacio en blanco como un carácter como otro cualquiera. Por tanto, si
introducimos el carácter "espacio en blanco" estaríamos introduciendo un valor que pertenecería al
dominio texto y sería distinto al concepto "ausencia de valor" que sería no incluir nada (nulo).
Este valor se va a utilizar con frecuencia en las bases de datos y es imprescindible saber cómo
actúa cuando se emplean operaciones lógicas sobre ese valor. En la lógica booleana tenemos
los valores VERDADERO y FALSO, pero un valor NULO no es ni verdadero ni falso.
Cuando necesitemos comparar dos campos, si ambos son nulos no podremos obtener ni
verdadero ni falso. Necesitaremos definir la lógica con este valor. Veamos los operadores lógicos
más comunes y sus resultados utilizando el valor nulo:
En todas las bases de datos relacionales se utiliza un operador llamado IS NULL (ES
NULO) que devuelve VERDADERO si el valor con el que se compara es NULO.
8.- Vistas.
Cuando vimos los distintos tipos de relaciones, aprendimos que, entre otros, estaban las vistas. Ahora
ya tenemos más conocimientos para comprender mejor este concepto.
Una vista es una tabla "virtual" cuyas filas y columnas se obtienen a partir de una o de varias tablas
que constituyen nuestro modelo. Lo que se almacena no es la tabla en sí, sino su definición, por eso
decimos que es "virtual". Una vista actúa como filtro de las tablas a las que hace referencia en ella.
La consulta que define la vista puede provenir de una o de varias tablas, o bien de otras vistas de la
UD2: Base de datos
relacionales.
Podemos dar dos razones por las que queramos crear vistas:
Seguridad, nos puede interesar que los usuarios tengan acceso a una parte de la
información que hay en una tabla, pero no a toda la tabla.
Comodidad, como veremos al pasar nuestras tablas/relaciones a un lenguaje de base de
datos, puede que tengamos que escribir sentencias bastante complejas, las vistas no son tan
complejas.
Las vistas no tienen una copia física de los datos, son sentencias de consultas a los datos que hay
en las tablas, por lo que si actualizamos los datos de una vista, estamos actualizando realmente
la tabla, y si actualizamos la tabla estos cambios serán visibles desde la vista.
Aunque no siempre podremos actualizar los datos de una vista. Dependerá de la complejidad
de la misma y del gestor de base de datos. No todos los gestores de bases de datos permiten
actualizar vistas, Oracle, por ejemplo, no lo permite, mientras que SQL Server sí.
Es el propietario de ciertos objetos (tablas, vistas, etc.). Realiza las copias de seguridad.
Tiene asignada una cuota de almacenamiento.
Tiene asignado un tablespace por defecto para los objetos en Oracle.
Pero no todos los usuarios deberían poder hacer lo mismo cuando acceden a la base de datos. Por
ejemplo, un administrador debería tener más privilegios que un usuario que quiere realizar una
simple consulta.
¿Qué es un privilegio? No es más que un permiso dado a un usuario para que realice
ciertas operaciones, que pueden ser de dos tipos:
¿Y no sería interesante poder agrupar esos permisos para darlos juntos? Para eso tenemos
el rol.
Un rol de base de datos no es más que una agrupación de permisos de sistema y de objeto.
Podemos tener a un grupo determinado de usuarios que tengan permiso para consultar los datos
de una tabla concreta y no tener permiso para actualizarlos. Luego un rol permite asignar un
UD2: Base de datos
relacionales.
grupo de permisos a un usuario. De este modo, si asignamos un rol con 5 permisos a 200
usuarios y luego queremos añadir un permiso nuevo al rol, no tendremos que ir añadiendo este
nuevo permiso a los 200 usuarios, ya que el rol se encarga de propagarlo automáticamente.
Los Roles de los usuarios toman un papel muy impotante en los CMS (Sistemas Gestores de
Contenidos) pues, a partir de ellos, se definen todas las interacciones de los usuarios y gestores
con el entorno.
10.- SQL.
SQL (Structured Query Language ) es un lenguaje de dominio específico utilizado en
programación, diseñado para administrar, y recuperar información de sistemas de gestión de
bases de datos [Link] el lenguaje fundamental de los SGBD relacionales. Es uno de los
lenguajes más utilizados en informática en todos los tiempos. Es un lenguaje declarativo y por
tanto, lo más importante es definir qué se desea hacer, y no cómo hacerlo. De esto último ya
se encarga el SGBD.
Hablamos por tanto de un lenguaje normalizado que nos permite trabajar con cualquier tipo de
lenguaje (ASP o PHP) en combinación con cualquier tipo de base de datos ( Access, SQL
Server, MySQL, MariaDB, Oracle, etc.).
El hecho de que sea estándar no quiere decir que sea idéntico para cada base de datos. Así es,
determinadas bases de datos implementan funciones específicas que no tienen necesariamente que
funcionar en otras.
Aunque SQL está estandarizado, siempre es recomendable revisar la documentación del SGBD con el qu
SQL posee dos características muy apreciadas, potencia y versatilidad, que contrastan con su
facilidad para el aprendizaje, ya que utiliza un lenguaje bastante natural. Es por esto que las
instrucciones son muy parecidas a órdenes humanas. Por esta característica se le considera un
Lenguaje de Cuarta Generación.
Aunque frecuentemente oigas que SQL es un "lenguaje de consulta", ten en cuenta que no es
exactamente solo eso ya que contiene muchas otras capacidades además de la de consultar la
base de datos:
Por tanto, el lenguaje estructurado de consultas SQL es un lenguaje que permite operar con los
datos almacenados en las bases de datos relacionales.
SQL embebido: las sentencias se escriben dentro de un programa escrito en otro lenguaje
como Java, PHP,etc..
SQL interpretado: Podemos usar un entorno gráfico para escribir y ejecutar las sentencias
(nosotros utilizaremos SQLDeveloper) o bien desde SQL*Plus que es el programa de línea
de comandos de Oracle que permite ejecutar comandos SQL y PL/SQL de forma
interactiva.
UD2: Base de datos
relacionales.
El lenguaje SQL está compuesto por comandos, cláusulas, operadores, funciones y literales .
Todos estos elementos se combinan en las instrucciones o setencias y se utilizan para crear,
actualizar y manipular bases de datos. Estos conceptos son bastante amplios por eso será mejor
que vayamos por partes.
COMANDOS: Van a ser las instrucciones que se pueden crear en SQL. Se pueden
distinguir en tres grupos que veremos con más detenimiento a lo largo de las siguientes
unidades:
De definición de datos (DDL, Data Definition Language), que permiten crear y definir
nuevas bases de datos, tablas, campos, etc.
De manipulación de datos (DML, Data Manipulation Language), que permiten generar
consultas para ordenar, filtrar y extraer datos de la base de datos.
De control y seguridad de datos (DCL, Data Control Language), que administran los
derechos y restricciones de los usuarios.
CLÁUSULAS: Llamadas también condiciones o criterios, son palabras especiales que permiten
modificar el funcionamiento de un comando.
OPERADORES: Permiten crear expresiones complejas. Pueden ser aritméticos (+, -,
*, /, ...) o lógicos (< , >, , < >, And, Or, etc.).
FUNCIONES: Para conseguir valores complejos. Por ejemplo, la función promedio
para obtener la media de un salario.
LITERALES: Les podemos llamar también constantes y serán valores concretos, como
por ejemplo un número, una fecha, un conjunto de caracteres, etc.
Juan le ha dicho a Ana que es hora de ponerse a trabajar con la aplicación. Para aprender mejor le
ha pedido permiso a Juan para instalar Oracle en su ordenador y así ir probando todo sobre la
marcha para no cometer errores. El SQL estándar y el SQL de Oracle son bastante parecidos,
pero con algunas diferencias.
Es cierto que estas herramientas nos facilitan el trabajo, pero resulta imprescindible comprender
y conocer en profundidad el lenguaje, ya que nos veremos en muchas situaciones donde
necesitaremos crear un objeto, modificarlo o eliminarlo sin depender de esas herramientas
visuales.
En Oracle, cada usuario de una base de datos tiene un esquema, que tendrá el mismo
nombre que el usuario con el que se ha accedido y sirve para almacenar los objetos que posea ese
usuario.
¿De qué objetos estamos hablando? Éstos podrán ser tablas, vistas, índices u otros objetos
relacionados con la definición de la base de datos. ¿Y quién puede crearlos y manipularlos?
En principio el usuario propietario (el que los creó) y los administradores de la base de datos.
Más adelante veremos que podemos modificar los privilegios de los objetos para permitir el
acceso a otros usuarios.
Las instrucciones DDL generan acciones que no se pueden deshacer, por eso es conveniente usarla
Crear una base de datos implica indicar los archivos y ubicaciones que se van a utilizar además de
otras indicaciones técnicas y administrativas. Es obvio que todo esto sólo se puede realizar si se tiene
privilegio de Administrador.
Con el estándar de SQL la instrucción a usar sería Create Database, pero cada SGBD tiene un
procedimiento para crear las bases de datos. Crearíamos una base de datos con el nombre que se
indique a continuación.
Ana va a crear la primera tabla llamada USUARIOS con un solo campo de tipo VARCHAR:
Por ejemplo, a la base de datos que están creando Juan y Ana se le va a llamar RyMjuegos,
entonces nos quedaría:
UD2: Base de datos
relacionales.
Hemos estado hablando de objetos de la base de datos, ahora veremos a qué nos referimos.
Según los estándares, una base de datos es un conjunto de objetos que nos servirán para
gestionar los datos. Estos objetos están contenidos en esquemas y éstos a su vez suelen estar
asociados a un usuario. De ahí que antes dijéramos que cada base de datos tiene un esquema que
está asociado a un usuario.
En oracle la sentencia "create database" tiene un sentido distinto a otros SGBD como Mysql.
Nosotros trabajaremos en oracle creando las tablas en el esquema del usuario creado
previamente, es decir, no utilizaremos la sentencia "create database".
Antes de crear la tabla es conveniente tener a mano la siguiente información que se obtiene en la
fase de diseño lógico de la BD
Y debemos tener en cuenta otras reglas que se deben cumplir para los nombres de las tablas:
La sintaxis básica del comando que permite crear una tabla es la siguiente:
UD2: Base de datos
relacionales.
donde:
columna1, columna2, ..., columnaN son los nombres de las columna que contendrá la tabla.
Tipo_Dato indica el tipo de dato de cada columna.
Ana va a crear la primera tabla llamada USUARIOS con un solo campo de tipo VARCHAR:
Recuerda que solo podrás crear tablas si posees los permisos necesarios para ello.
11.3.- Restricciones.
Hay veces que necesitamos que un dato se incluya en una tabla de manera obligatoria, otras veces
necesitaremos definir uno de los campos como llave primaria o ajena. Todo esto podremos hacerlo
cuando definamos la tabla, además de otras opciones.
Una restricción es una condición que una o varias columnas deben cumplir obligatoriamente.
Cada restricción que creemos llevará un nombre, si no se lo ponemos nosotros lo hará Oracle o el
SGBD que estemos
utilizando. Es conveniente que le pongamos un nombre que nos ayude a identificarla y que sea
único para cada esquema (usuario). Es buena idea incluir de algún modo el nombre de la tabla,
los campos involucrados y el tipo de restricción en el nombre de la misma. La sintaxis en SQL
estándar es la siguiente:
Veamos un ejemplo:
Otra opción es definir las columnas de la tabla y después especificar las restricciones, de este
modo podrás referir varias columnas en una única restricción.
En los siguientes apartados veremos cada una de las restricciones, su significado y su uso.
Recomendación
Oracle nos aconseja la siguiente regla a la hora de poner nombre a las restricciones:
Tres letras para el nombre de la tabla. Carácter de subrayado.
Tres letras con la columna afectada por la restricción. Carácter de subrayado.
Dos letras con la abreviatura del tipo de restricción. La abreviatura puede ser:
PK = Primary Key. FK = Foreign Key. NN = Not Null.
UK = Unique.
CK = Check (validación).
Base de datos relacionales.
Podremos ponerlo cuando creamos o modificamos el campo añadiendo la palabra NOT NULL
después de poner el tipo de dato.
Si en la tabla USUARIOS queremos que el campo "F_Nacimiento" sea obligatorio ponerlo, nos
quedaría así:
Debemos tener cuidado con los valores nulos en las operaciones, ya que 1*NULL es igual a NULL.
También para esta restricción tenemos dos posibles formas de ponerla, veámoslo con un ejemplo.
Supongamos que el campo Login de nuestra tabla va a ser único. Lo incluiremos en la tabla que
estamos creando. Nos quedaría así:
CREATE TABLE USUARIOS ( Login VARCHAR2 (25)
CONSTRAINT Usu_Log_UK UNIQUE);
También podemos poner esta restricción a varios campos a la vez, por ejemplo, si queremos
que Login y correo electrónico sean únicos podemos ponerlo así:
Base de datos relacionales.
Si te fijas, detrás del tipo de datos de Correo hay una coma, eso es así porque la restricción es
independiente de ese campo y común a varios. Por eso después de UNIQUE hemos puesto
entre paréntesis los nombres de los campos a los que afecta la restricción.
Sólo puede haber una clave primaria por tabla pero ésta puede estar formada por varios campos.
Dicha clave podrá ser referenciada como clave ajena en otras tablas.
La clave primaria hace que los campos que forman sean NOT NULL y que los valores de los
campos sean de tipo UNIQUE.
Si la clave está formada por más de un campo, por ejemplo Nombre, Apellidos y Fecha de
Nacimiento, entonces hay que utilizar este formato, después de la definición de todos los
campos y antes del paréntesis de cierre de la sentencia:
KEY.
Ya vimos que las claves ajenas, secundarias o foráneas eran campos de una tabla que se relacionaban
con la clave primaria (o incluso con la clave candidata) de otra tabla.
Cuando creemos la tabla tendremos que indicar de alguna forma quién es clave ajena. Lo haremos
"haciendo referencia" a la tabla y los campos de donde procede.
En nuestra tabla vamos a tener una clave ajena procedente de la tabla PARTIDAS que será su
Cod_Partida, por tanto tendremos que hacer referencia a éste:
Si el campo al que hace referencia es clave principal en su tabla no es necesario indicar el nombre del
campo:
Si la definición de la clave ajena se pone al final, tendremos que colocar el texto FOREIGN
KEY para especificar a qué campo se está refiriendo.
Vamos a verlo en el caso en que la clave ajena estuviera formada por Cod_Partida y Fecha de la
partida de la tabla PARTIDAS:
Al relacionar campos necesitamos que el dato del campo que es clave ajena en una tabla (que
llamaremos secundaria) previamente haya sido incluido en su tabla de procedencia donde es
clave primaria o candidata. En nuestro ejemplo, cualquier código de partida que incluyamos en la
tabla USUARIO, debería estar previamente en la tabla de la que procede,
es decir, en la tabla PARTIDAS. A esto se le llama Integridad Referencial. Sino, tendremos
que dejarlo en valor nulo.
Al crear tablas, si existen claves foráneas, debemos tener un orden concreto. Siempre debemos
crear las tablas que tienen claves foráneas después de aquéllas donde esos campos aparecen como
Base de datos relacionales.
Si hacemos referencia a una tabla que no está creada: Oracle buscará la tabla referenciada y
al no encontrarla dará fallo. Esto se soluciona creando en primer lugar las tablas que no
tengan claves ajenas.
Si queremos borrar las tablas tendremos que proceder al contrario, borraremos las tablas
que tengan claves ajenas antes.
ON DELETE CASCADE: permitirá borrar todos los registros cuya clave ajena sea igual a
la clave del registro borrado.
ON DELETE SET NULL: colocará el valor NULL en todas las claves ajenas relacionadas
con la borrada.
ON DELETE DEFAULT xxxx: colocará el valor xxxx en todas las claves ajenas
relacionadas con la borrada.
En nuestro ejemplo vamos a añadir a la tabla USUARIOS el campo País y le daremos por
defecto el valor "España".
Si queremos incluir en un campo la fecha actual, independientemente del día en el que estemos,
podremos utilizar la función SYSDATE como valor por defecto:
También vamos a necesitar que se compruebe que los valores que se introducen son adecuados
para ese campo. Para ello utilizaremos CHECK.
Base de datos relacionales.
Esta restricción comprueba que se cumpla una condición determinada al rellenar una columna.
Dicha condición se puede construir con columnas de esa misma tabla.
Si en la tabla USUARIOS tenemos el campo Crédito y éste sólo puede estar entre 0 y 2000, lo
especificaríamos así:
Una misma columna puede tener varios CHECK asociados a ella, para ello ponemos varios
CONSTRAINT seguidos y separados por comas.
Esta instrucción borrará la tabla de la base de datos incluido sus datos (filas). También se borrará
toda la información que existiera de esa tabla en el Diccionario de Datos.
La opción CASCADE CONSTRAINTS se puede incluir para los casos en que alguna de las
columnas sea clave ajena en otra tabla secundaria, lo que impediría su borrado. Al colocar esta
opción se borrarán antes y a continuación se eliminará la tabla en cuestión.
Ten cuidado al utilizar este comando, el borrado de una tabla es irreversible y no hay una petición de
confirmación antes de ejecutarse.
Si queremos añadir columnas a una tabla: las columnas se añadirán al final de la tabla.
Si queremos eliminar columnas de una tabla: se eliminará la columna indicada sin poder
deshacer esta acción. Además de la definición de la columna, se eliminarán todos los datos
que contuviera. No se puede eliminar una columna si es la única que forma la tabla, para
ello tendremos que borrar la tabla directamente.
Si queremos modificar columnas de una tabla: podemos modificar el tipo de datos y las
propiedades de una columna. Todos los cambios son posibles si la tabla no contiene datos.
En general, si la tabla no está vacía podremos aumentar la longitud de una columna,
aumentar o disminuir el número de posiciones decimales en un tipo NUMBER, reducir la
anchura siempre que los datos no ocupen todo el espacio reservado para ellos.
Nos gustaría incluir una nueva columna llamada User que será tipo texto y clave primaria:
Nos damos cuenta que ese campo se llamaba Login y no User, vamos a cambiarlo:
Ejercicio resuelto
Tenemos creada la siguiente tabla:
Ahora queremos poner una restricción a sueldo para que tome valores entre 1000 y 1200, ¿cóm
Mostrar retroalimentación
ALTER TABLE EMPLEADOS MODIFY (Sueldo NUMBER(2) CHECK (Sueldo BETWEEN 1000
Base de datos relacionales.
La opción CASCADE desactiva las restricciones que dependan de ésta. Para activar de nuevo la
restricción:
No es aconsejable que utilices índices sobre campos de tablas pequeñas o que se actualicen con
mucha frecuencia. Tampoco es conveniente si esos campos no se usan en consultas de manera
frecuente o en expresiones.
El diseño de indices es un tema bastante complejo para los Administradores de Bases de Datos,
ya que una mala elección ocasiona ineficiencia y tiempos de espera elevados. Un uso excesivo de
ellos puede dejar a la Base de Datos colgada simplemente con insertar alguna fila.
La mayoría de los índices se crean de manera implícita cuando ponemos las restricciones PRIMARY K
CREATE USER NombreUsuario IDENTIFIED BY ClaveAcceso [DEFAULT TABLESPACE tablespace ] [TEMPORARY TABLESPACE tabl
donde:
CREATE USER: crea un nombre de usuario que será identificado por el sistema.
IDENTIFIED BY: permite dar una clave de acceso al usuario creado.
DEFAULT TABLESPACE: asigna a un usuario el Tablespace por defecto para almacenar los
objetos que cree. Si no se asigna ninguna, será SYSTEM.
TEMPORARY TABLESPACE: especifica el nombre del Tablespace para trabajos
temporales. Por defecto será SYSTEM.
QUOTA: asigna un espacio en Megabytes o Kilobytes en el Tablespace asignado. Si no
se especifica el usuario no tendrá espacio y no podrá crear objetos.
PROFILE: asigna un perfil al usuario. Si no se especifica se asigna el perfil por defecto.
Recuerda que para crear usuarios debes tener una cuenta con privilegios de Administrador.
Para ver todos los usuarios creados utilizamos las vistas ALL_USERS y DBA_USERS. Y para ver en mi ses
Practiquemos un poco con este comando. Creemos una cuenta de usuario limitado, que no tenga
derecho ni a guardar datos ni a crear objetos, más tarde le daremos permisos:
Podemos modificar usuarios mediante el comando ALTER USER, cuya sintaxis es la siguiente:
ALTER USER NombreUsuario IDENTIFIED BY clave_acceso [DEFAULT TABLESPACE tablespace ] [TEMPORARY TABLESPACE tabl
Un usuario sin privilegios de Administrador únicamente podrá cambiar su clave de acceso. Debemos de
tener en cuenta que a la hora de modificar una contraseña, si el campo está cifrado, el contenido de este
campo ha de insertarse ya cifrado en la base de datos.
Para eliminar o borrar un usuario utilizamos el comando DROP USER con la siguiente sintaxis:
La opción CASCADE borra todos los objetos del usuario antes de borrarlo. Sin esta opción no
nos dejaría eliminar al usuario si éste tuviera tablas creadas.
Para poder acceder a los objetos de una base de datos necesitamos tener privilegios (permisos).
Éstos se pueden agrupar formando roles, lo que simplificará la administración. Los roles pueden
activarse, desactivarse o protegerse con una clave. Mediante los roles podemos gestionar los
comandos que pueden utilizar los usuarios. Un permiso se puede asignar a un usuario o a un rol.
donde:
En el siguiente ejemplo Juan ha accedido a la base de datos y ejecuta los siguientes comandos:
Los privilegios de sistema son los que dan derecho a ejecutar comandos SQL o acciones sobre
objetos de un tipo especificado. Existen gran cantidad de privilegios distintos.
Donde
TO señala a los usuarios o roles a los que se conceden privilegios.
WITH ADMIN OPTION es una opción que permite al receptor de esos privilegios
que pueda conceder esos mismos privilegios a otros usuarios o roles.
PUBLIC hace que un privilegio esté disponible para todos los usuarios.
Base de datos relacionales.
Concede a Ana el rol de CONNECT con todos los privilegios que éste tiene asociados.
Concede a Ana el privilegio de borrar usuarios y que ésta puede conceder el mismo privilegio
de borrar usuarios a otros.
COMANDOS:
Comandos DDL. Lenguaje de Definición de Datos:
Comando: Descripción:
Comando: Descripción:
Comando: Descripción:
Cláusulas
Cláusulas: Descripción:
Se utiliza para especificar las condiciones que deben reunir las filas que
WHERE
se van a seleccionar.
GROUP
Se utiliza para separar las filas seleccionadas en grupos específicos.
BY
Operadores lógicos
Operadores lógicos.
Operadores: Descripción:
Operadores de comparación.
Operadores: Descripción:
Operadores: Descripción:
= Igual.
Funciones de agregado:
Funciones de agregado.
Función: Descripción:
Literales
Literales: Descripción:
5 Literal número.