1.2. Creación del esquema de la base de datos

El esquema de una base de datos (en inglés, Database Schema) describe la estructura de una Base de datos, en un lenguaje formal soportado por un Sistema administrador de Base de datos (DBMS). En una Base de datos Relacional, el Esquema define sus tablas, sus campos en cada tabla y las relaciones entre cada campo y cada tabla.

El esquema es generalmente almacenado en un Diccionario de Datos. Aunque generalmente el esquema es definido en un lenguaje de Base de datos, el término se usa a menudo para referirse a una representación gráfica de la estructura de base de datos (Diseño de lógico de la base de datos).

En la práctica el término esquema de la base de datos se refiere al diseño físico de la base de datos.

Oracle define esquema como la colección de objetos o estructuras lógicas que corresponden directamente a los datos almacenados, y crea un nuevo esquema por cada usuario que crea objetos en la base de datos.

Los objetos de un esquema se crea y se manipula con SQL.

Un usuario de base de datos tiene una contraseña y diversos privilegios de base de datos. Cada usuario posee un solo esquema, que tiene el mismo nombre que el usuario. El esquema contiene los datos para el usuario propietario del esquema. Por ejemplo, el usuario hr posee el esquema hr, que contiene objetos de esquema tales como la tabla de empleados. En una base de datos de producción, el propietario del esquema general representa una aplicación de base de datos en lugar de una persona.

Cada vez que se crea una base de datos nueva, hay una serie de elementos que no pueden faltar en ella y siempre se crean. Los dos principales elementos que se crean son el usuario SYS y el usuario SYSTEM. Toda base de datos Oracle tiene siempre estos dos usuarios.

¿Por qué se crean estos dos usuarios automáticamente?. Para poder gestionar la base de datos recién creada, el sistema Oracle necesita tener información sobre las tablas que existen en la base de datos, los usuarios que existen, los índices que se van creando y borrando, la cantidad de datos que hay en cada tabla, etc. Por lo tanto, necesita unas tablas en las que ir almacenando toda esta información. A este conjunto de tablas se le llama diccionario de la base de datos y, como hemos dicho, toda tabla de una base de datos Oracle debe pertenercer a un usuario, por eso se crean siempre estos dos usuarios especiales, SYS y SYSTEM que son los propietarios de las tablas del diccionario de la base de datos y, por lo tanto, son lo más importante para que funcione correctamente la base de datos. Si por algún error se borraran tablas de alguno de estos usuarios especiales, se podría corromper toda la base de datos

Sintaxis básica para crear una base de datos en Oracle ( No aplica en Oracle Express)

CREATE DATABASE nombre_baseDatos

Actualización, modificación y eliminación del esquema de base de datos

Una tabla es un sistema de elementos de datos (atributo - valores) que se organizan que usando un modelo vertical - columnas (que son identificados por su nombre)- y horizontal filas. Una tabla tiene un número específico de columnas, pero puede tener cualquier número de filas. Cada fila es identificada por los valores que aparecen en un subconjunto particular de la columna que se ha identificado por una llave primaria.

Una tabla de una base de datos es similar en apariencia a una hoja de cálculo, en cuanto a que los datos se almacenan en filas y columnas. Como consecuencia, normalmente es bastante fácil importar una hoja de cálculo en una tabla de una base de datos. La principal diferencia entre almacenar los datos en una hoja de cálculo y hacerlo en una base de datos es la forma de organizarse los datos.

Oracle

Por lo tanto, la creación de las tablas en el proceso de programación en Oracle juegan un papel muy importante. En el momento de crear las tablas se definen características a dos niveles: Tabla y Columna, como se muestra a continuación:

A nivel de tabla: Refieren a una o a varias columnas, donde cada columna se define individualmente.

Nombre:

Nombre de la tabla puede ser de 1 a 30 caracteres.

Hay que tener en cuenta también ciertas restricciones con los nombres de las tablas: longitud máxima de 30 caracteres, no puede haber nombres de tabla duplicados, deben comenzar con un carácter alfabético, permitir caracteres alfanuméricos y el guión bajo '_', y Oracle no distingue entre mayúsculas y minúsculas.

Propietario:

La tabla tiene como propietario al usuario que las crea En nuestro caso somos el usuario ALUMNO.

Cantidad de Columnas: Una tabla puede tener un máximo de 254 columnas.

A nivel de Columna el nombre de la columna puede tener un máximo de 30 caracteres.

En Oracle podemos implementar diversos tipos de tablas. A continuación se presenta una recompilación no exhaustiva de ellas.

Tipo Tabla Descripción

Regular

(heap)

Son el mecanismo de almacenamiento de los datos en una base de datos Oracle. Contienen un conjunto fijo de columnas. Las columnas de una tabla describen los atributos de la entidad que se representa con la tabla. Cada columna tiene un nombre y características específicas: tipo de dato y longitud, restricciones, etc.

Clustered

Un cluester proporciona un método opcional de almacenar datos de tabla. Un cluster está compuesto de un grupo de tablas que comparten los mismos bloques de datos. Las tablas son agrupadas mediante columnas comunes.

Index

Aquí una tabla es almacenada en la estructura de un índice. Esto impone orden físico a las filas por si mismas. A diferencia de un heap, donde los datos son almacenados en donde caben, en una tabla IOT (Tabla Organizada por Indices) los datos son almacenados en el orden de la clave primaria.

Particionadas

Es un esquema de organización de los datos con el cual podemos dividirla en múltiples objetos de almacenamientos llamados particiones de datos o rangos, dependiendo los valores puede ser dividido en uno o más columnas de la tabla. Cada particiones de datos es almacenado separadamente. Estos objetos almacenados pueden estar en diferentes tablespaces, en el mismo o en una combinación de ambos.

Temporales

Son tablas cuyos datos permanecerán en el sistema sólo durante el tiempo que dure la transacción o sesión involucrada. No obstante, al igual que para las tablas permanentes, la definición de las tablas temporales se almacena en las tablas del sistema.

La sintaxis del comando que permite crear un tabla es la siguiente:

Del examen de la sintaxis de la sentencia Create Table se pueden concluir que necesitamos conocer los distintos tipos de columna y las distintas restricciones que se pueden imponer al contenido de las columnas.

Existen varios tipos de datos en SQL. De esta manera, cada columna puede albergar una información de naturaleza distinta. Los tipos de datos más comunes y sus características en Oracle Express (10 Y 11g) se resumen en la siguiente tabla. Las versiones de Oracle comercial soportan una gama mucho más amplia de tipos de datos.

Tipo de Dato Descripción
BLOB

Contiene datos binarios con un tamaño máximo de 4 gigabytes. Los datos binarios nos van a permitir guardar en la base de datos archivos, imagenes, sonidos, etc ...

Casi siempre es preferible guardar la ruta del archivo en la base de datos en lugar del propio archivo en modo binario, pero existen ciertas circunstancias en las que no nos queda otra solución.

BINARY_DOUBLE Presición doble
BINARY_FLOAT Presición simple
CLOB Un tipo de datos CLOB de Oracle contiene datos de caracteres basados en el juego de caracteres predeterminados del servidor. Su tamaño máximo es de 4 gigabytes. Se asigna a cadena.

Use la siguiente expresión para una consulta de un campo CLOB

SELECT DBMS_LOB.substr(campo, DBMS_LOB.getlength(campo),1)

FROM tablaprueba;

CHAR Almacena datos de tipo carácter alfanumérico de longitud fija, con un tamaño máximo de 2000. caracteres
DATE Almacena fechas desde el 1-Ene-4712 AC hasta el 31-Dic-4712 DC.
NUMBER(dig [, dec]) Datos numéricos de n dígitos, de los cuales dec son decimales. El tamaño máximo es de 38 dígitos.
NVARCHAR2 Almacena un valor alfanumérico de longitud variable en caracteres Unicode con las mismas restricciones de varchar.
TIMESTAMP Fecha y hora (incluidos los segundos), con un tamaño que abarca desde 7 a 11 bytes.
VARCHAR2(tamaño) Guarda datos de tipo carácter alfanumérico de longitud variable, con un tamaño máximo de 4,000 caracteres.

Ejemplo: Considere la siguiente tabla de datos correspondientes a los campeones de Formula 1 (1950 - 2015) y sus escuderias. Y su traducción a sentencias Oracle.

Año Campeón Escudería
2015 Lewis Hamilton Mercedes AMG F1 Team*
2014 Lewis Hamilton Mercedes AMG F1 Team*
2013 Sebastian Vettel Red Bull Racing
2012 Sebastian Vettel Red Bull Racing
2011 Sebastian Vettel Red Bull Racing
2010 Sebastian Vettel Red Bull Racing
2009 Jenson Button Brawn GP
2008 Lewis Hamilton McLaren
2007 Kimi Raikkonen Ferrari
2006 Fernando Alonso Renault
2005 Fernando Alonso Renault
2004 Michael Schumacher Ferrari
2003 Michael Schumacher Ferrari
2002 Michael Schumacher Ferrari
2001 Michael Schumacher Ferrari
2000 Michael Schumacher Ferrari

CREATE TABLE f1 ( 
  year      INTEGER PRIMARY KEY,
  campeon   CHAR(30),
  escuderia CHAR(20)
  );

Ejemplo: Estados, capitales, densidad de población y superficie de la República Mexicana

CREATE TABLE estados (
 idEstado     INTEGER  PRIMARY KEY,
 nombreEstado CHAR(25) NOT NULL,
 capital      CHAR(25) NOT NULL,
 densidad     INTEGER  NOT NULL,
 poblacion    INTEGER  NOT NULL
);

Tablas Temporales. Oracle permite la creación de tablas temporales para mantener datos propios y exclusivos a una sesión Oracle determinada. Estos datos permanecerán en el sistema sólo durante el tiempo que dure la transacción o sesión involucrada. No obstante, al igual que para las tablas permanentes, la definición de las tablas temporales se almacena en las tablas del sistema.

La siguiente sintaxis permite crear una tabla temporal personal para cada sesion. Eso significa que los datos no se comparten entre sesiones y se eliminan al final de la misma.

CREATE GLOBAL  TEMPORARY TABLE [ schema.]
  table (   nombreColumna tipoDato  [DEFAULT expresión]
  NOT NULL],  [,nombre_columna   tipo_dato [DEFAULT expresión]
  [restricción_columna] ...
  |restricción_tabla];
ON COMMIT { DELETE | PRESERVE } ROWS ] [ physical_properties ]

Con la opcion ON COMMIT DELETE ROWS se borran los datos cada vez que se hace COMMIT en la sesion.

Con la opcion ON PRESERVE DELETE ROWS los datos no se borran hasta el final de la sesion.

Sus ventajas son varias, la información contenida en ella esta solo disponible para la sesión actual, cualquier inserción, borrado, actualización solo se refleja en la sesión activa.

Muchas funcionalidades de cualquier tabla normal se mantienen en ella, como triggers a nivel tabla, vistas, indices, exportar e importar (claro solo la definición de la tabla).

No es posible declarar llaves foraneas en una tabla temporal.

(DROP) Eliminación

Cuando una tabla ya no es útil y no vamos a volver a necesitarla debe ser borrada. Esta operación se puede realizar con el comando DROP TABLE.

DROP TABLE nombre_tabla> [CASCADE CONSTRAINTS][PURGE]

Se borra la tabla de la base de datos, borrando toda la información contenida en la tabla, es decir, todas las filas. También se borrará toda la información que sobre la tabla existiera en el diccionario.

Si alguna columna de la tabla a borrar sirve como clave ajena de alguna tabla detalle, impide la eliminación de la tabla, ya que existe una restricción que requiere de la existencia de la tabla maestra. Esto se puede areglar colocando la sentencia.

CASCADE CONSTRAINTS.

Esto produce que las restricciones de la tabla detalle se borren antes de borrar la tabla maestra. PURGE evita que los objetos borrados se vayan a la papelera

La siguiente sentencia produce la eliminación de la tabla BORRAME.

Modificación

Oracle permite modificar las restricciones definidas para una tabla. Esto puede llevar a “inconsistencia” de los datos ya introducidos en la base de datos. Por ello, Oracle tiene definidos mecanismos para modificación de los datos ya existentes.

Esta operación se puede realizar con el comando ALTER TABLE.

ALTER TABLE [esquema.]tabla
  clausula_constraint [,…]
  [ENABLE clausula_activa | DISABLE clausula_disable]
  [{ENABLE| DISABLE TABLE LOCK]
  [{ENABLE|DISABLE} ALL TRIGGERS];

Hay que tener en cuenta varios puntos:

Considere el siguiente DER Propietario - Automóvil, bajo el criterio de hacienda del Gobierno del Estado de Veracruz, México.

´

Y su correspondiente código DDL en Oracle

CREATE TABLE propietario (
  idPropietario  NUMBER  NOT NULL,
  nombre         CHAR(35)    NOT NULL,
  direccion      CHAR(50)    NOT NULL,
  colonia        CHAR(40)    NOT NULL,
  localidad      CHAR(25)    NOT NULL,
  rfc            CHAR(14),
  telefono       CHAR(14),
  CONSTRAINT PK_propietario PRIMARY KEY (idPropietario)
);

CREATE TABLE automovil (
  idAutomovil    NUMBER  NOT NULL,
  idPropietario  NUMBER  NOT NULL,
  placa          CHAR(12)    NOT NULL,
  marca          CHAR(18)    NOT NULL,
  cveVehicular   NUMBER(3)   NOT NULL,
  linea          CHAR(18)    NOT NULL,
  numeroSerie    CHAR(25)    NOT NULL,
  subLinea       CHAR(18)    NOT NULL,
  origen         CHAR(20)    NOT NULL,
  clase          CHAR(14)    NOT NULL,
  modelo         CHAR(18)    NOT NULL,
  fechaAlta      CHAR(18)    NOT NULL, 
  CONSTRAINT PK_Automovil   PRIMARY KEY (idAutomovil),
  CONSTRAINT FK_Propietario FOREIGN KEY (idPropietario)
 	                    REFERENCES  propietario (idPropietario)
);

Es factible modificar una tabla añadiendo o eliminando restricciones, en este caso para el ejemplo anterior el comando a utilizar será

ALTER TABLE


tabla {ADD | DROP} CONSTRAINT restricción;
       ALTER TABLE automovil DROP CONSTRAINT FK_Propietario;
       
 ALTER TABLE automovil ADD
      CONSTRAINT FK_Propietario FOREIGN KEY (idPropietario)
           REFERENCES  propietario (idPropietario)
           ON DELETE CASCADE;

El cual permitira el borrado en cascada.

Modificaremos el ejemplo para añadir el atributo color.

ALTER TABLE automovil
 ADD (color CHAR(15) NOT NULL);

Ejemplo: Considere la relación departamentos y empleados.


CREATE TABLE departamento (
  idDepartamento  NUMBER(3), 
  nombre          CHAR(15) NOT NULL, 
  ciudad          CHAR(10) NOT NULL, 
  CONSTRAINT DOM_Ciudad
   CHECK (ciudad IN ('Veracruz', 'Xalapa', 'Orizaba', 'Regional')), 
  CONSTRAINT PK_Departamento PRIMARY KEY (idDepartamento)
);

CREATE TABLE empleado(
  idEmpleado      NUMBER(3),
  rfc             CHAR(14),
  nombreEmpleado  CHAR(40) NOT NULL,
  oficio          CHAR(11) NOT NULL,
  cargo           CHAR(15) NOT NULL,
  jefe            NUMBER(3),
  ingreso         DATE NOT NULL,
  salario         NUMBER(10,2),
  comision        NUMBER(10,2),
  idDepartamento  NUMBER(3) NOT NULL,
  CONSTRAINT      DOM_Empleado_Salario CHECK ( salario > 0 ),
  CONSTRAINT      PK_Empleado      PRIMARY KEY (idEmpleado),
  CONSTRAINT      AK_Empleado      UNIQUE (rfc),
  CONSTRAINT      FK_Empleado_Jefe FOREIGN KEY (jefe)
                  REFERENCES   Empleado,
  CONSTRAINT      FK_Empleado      FOREIGN KEY (idDepartamento)
                  REFERENCES Departamento,
  CONSTRAINT      DOM_Empleado_NombreEmpleado
                  CHECK (nombreEmpleado = NLS_UPPER(nombreEmpleado))
);

Ejemplo: Considere el diagrama entidad relación que a continuación se expone y su correspondiente traducción a sentencias Oracle. El cual involucra artistas, sus discos y las canciones que contiene dicho disco.


CREATE TABLE artista (
 idArtista       NUMBER,
 nombreArtista   CHAR(35) NOT NULL,
 CONSTRAINT pk_Artista PRIMARY KEY (idArtista),
 CONSTRAINT ak_nombreArtista UNIQUE ( nombreArtista )
);

CREATE TABLE disco (
 asin             CHAR(12),
 idArtista        NUMBER NOT NULL, 
 nombreAlbum      CHAR(20) NOT NULL,
 yearLanzamiento  NUMBER(4),
 marca            CHAR(20),
 CONSTRAINT pk_disco PRIMARY KEY (asin),
 CONSTRAINT fk_artistaDisco FOREIGN KEY (idArtista) REFERENCES artista (idArtista)  
);

CREATE TABLE canciones (
 idCancion     NUMBER,
 asin          CHAR(12) NOT NULL,
 nombreCancion CHAR(30) NOT NULL,
 duracion      CHAR(6),
 estilo        CHAR(15),
 CONSTRAINT pk_canciones PRIMARY KEY (idCancion),
 CONSTRAINT fk_DiscoCanciones FOREIGN KEY (asin) REFERENCES disco (asin)      
);

Ejemplo: Torneo Primera División Federación Mexicana de Futbol


CREATE TABLE  posicion (
  idPosicion     NUMBER(1), 
  nombrePosicion CHAR(20) NOT NULL, 
  CONSTRAINT PK_Posicion PRIMARY KEY (idPosicion)
);

CREATE TABLE  nacionalidad (
  idNacionalidad     NUMBER(3), 
  nombreNacionalidad CHAR(20) NOT NULL, 
  CONSTRAINT         PK_Nacionalidad PRIMARY KEY (idNacionalidad)
);

CREATE TABLE  estadio (
  idEstadio        NUMBER(3), 
  nombreEstadio    CHAR(25) NOT NULL, 
  direccion        CHAR(35) NOT NULL, 
  codigoPostal     NUMBER(5),
  ciudad           CHAR(30) NOT NULL,
  fechaInaguracion DATE, 
  capacidad        NUMBER NOT NULL,
  foto             CHAR(30),
  CONSTRAINT       PK_Estadio PRIMARY KEY (idEstadio)
);

CREATE TABLE equipo (
  idEquipo               NUMBER, 
  nombreEquipo   CHAR(25)  NOT NULL,
  seudonimo      CHAR(25)  NOT NULL, 
  nombre_oficial CHAR(60)  NOT NULL, 
  direccion      CHAR(35)  NOT NULL, 
  codigoPostal   NUMBER(5),
  ciudad         CHAR(30) NOT NULL,
  escudo         CHAR(50), 
  fechaFundacion DATE,
  paginaWeb      CHAR(50)  NOT NULL, 
  CONSTRAINT PK_Equipo     PRIMARY KEY (idEquipo)
);

CREATE TABLE  jugador (
  idJugador NUMBER, 
  nombreJugador CHAR(40), 
  idEquipo      NUMBER, 
  idPosicion NUMBER NOT NULL, 
  jj         NUMBER  DEFAULT  0,
  jc         NUMBER  DEFAULT 0,
  jt         NUMBER  DEFAULT 0, 
  ec         NUMBER  DEFAULT 0,
  sc         NUMBER  DEFAULT  0,
  minutos    NUMBER  DEFAULT 0,
  goles      NUMBER DEFAULT 0, 
  ta         NUMBER  DEFAULT  0,
  tr         NUMBER  DEFAULT 0,
  numero     NUMBER  NOT NULL,
  fechaNacimiento DATE NOT NULL, 
  estatura         NUMBER, 
  peso            NUMBER, 
  idNacionalidad  NUMBER DEFAULT 1, 
  CONSTRAINT PK_Jugador    PRIMARY KEY (idJugador),
  CONSTRAINT FK_Juega_En   FOREIGN KEY (idEquipo)   REFERENCES  equipo (idEquipo),
  CONSTRAINT FK_Juega_Como FOREIGN KEY (idPosicion) REFERENCES  posicion (idPosicion),
  CONSTRAINT FK_Origen     FOREIGN KEY (idNacionalidad)
	                       REFERENCES  nacionalidad (idNacionalidad)
);

CREATE TABLE partido (
  idPartido          NUMBER,
  jornada            NUMBER(2)  NOT NULL,
  fecha              DATE         NOT NULL,
  hora               CHAR(5)    NOT NULL,
  idLocal            NUMBER(3)  NOT NULL,
  golLocal           NUMBER(2) DEFAULT 0,
  idVisitante        NUMBER(3) NOT NULL,
  golVisitante       NUMBER(3) DEFAULT 0,
  idEstadio          NUMBER(3) NOT NULL,
  arbitro            CHAR(50)  NOT NULL,
  asistente1         CHAR(50)  NOT NULL,
  asistentente2      CHAR(50)  NOT NULL,
  cJuez              CHAR(50),
  idEquipoLocal      NUMBER(3) NOT NULL,
  idEquipoVisitante  NUMBER(3) NOT NULL,
  CONSTRAINT PK_Partido PRIMARY KEY (idPartido),
  CONSTRAINT FK_Partidos_En FOREIGN KEY (idEstadio)    REFERENCES  estadio (idEstadio),
  CONSTRAINT FK_Local     FOREIGN KEY (idLocal)      REFERENCES  equipo (idEquipo),
  CONSTRAINT FK_Visitante FOREIGN KEY (idVisitante)  REFERENCES  equipo (idEquipo)
);

Ejemplo: El departamento de Postgrado e investigación del Tecnológico Virtual ha diseñado una base de datos (BD) para la gestión de los proyectos de investigación en los que participan sus investigadores.

Se presenta a continuación el diagrama Entidad Relación propuesto mismo que es perfectible. Si lo hace justique sus cambios.


DROP TABLE asignado     CASCADE CONSTRAINTS;
DROP TABLE proyecto     CASCADE CONSTRAINTS;
DROP TABLE linea        CASCADE CONSTRAINTS;
DROP TABLE investigador CASCADE CONSTRAINTS;
DROP TABLE depAcademico CASCADE CONSTRAINTS;

CREATE TABLE  linea  (
  idLinea       CHAR(20), 
  nombreLinea   CHAR(100) NOT NULL, 
  financiadoPor CHAR(30)  NOT NULL, 
  CONSTRAINT PK_Linea PRIMARY KEY (idLinea)
);

CREATE TABLE  proyecto (
  idProyecto     CHAR(20), 
  idLinea        CHAR(20) NOT NULL, 
  nombreProyecto CHAR(100) NOT NULL, 
  F_Inicio       DATE NOT NULL, 
  F_Terminacion  DATE NOT NULL, 
  Presupuesto    NUMBER(10,0) NOT NULL, 
  CONSTRAINT     PK_Proyecto PRIMARY KEY (idProyecto), 
  CONSTRAINT     FK_Linea    FOREIGN KEY (idLinea) REFERENCES  linea (idLinea)
);

CREATE TABLE depAcademico (
  idDepartamento NUMBER,
  Departamento   CHAR(30) NOT NULL,
  CONSTRAINT PK_DepAcademico PRIMARY KEY  (idDepartamento)
);

CREATE TABLE  investigador (
  ife                CHAR(13), 
  nombreInvestigador CHAR(50) NOT NULL, 
  telefono           CHAR(10) NOT NULL,
  email              CHAR(50) NOT NULL,
  idDepartamento     NUMBER   NOT NULL,  
  CONSTRAINT PK_Investigador PRIMARY KEY (ife),
  CONSTRAINT FK_DepAcademico FOREIGN KEY (idDepartamento) 
                             REFERENCES  depAcademico (idDepartamento)
);

CREATE TABLE  asignado (
  ife               CHAR(13) NOT NULL, 
  idProyecto        CHAR(20)   NOT NULL,  
  F_Inicio          DATE NOT NULL, 
  F_Termino         DATE,
  tipoParticipacion CHAR(20) NOT NULL,
  CONSTRAINT FK_Investigador FOREIGN KEY (ife) REFERENCES  investigador (ife), 
  CONSTRAINT FK_Proyecto     FOREIGN KEY (idProyecto)  REFERENCES  proyecto (idProyecto)
);

Conoce tu gestor

Prueba las siguientes consultas. ¿Qué información aportan?

SELECT  table_name FROM   user_tables;
SELECT   table_name FROM all_tables WHERE  owner='EPACHECO';