Una vez realizada la modelización de los datos que componen nuestra base de datos mediante el diseño del diagrama entidad relación y de la obtención de nuestro esquema relación con el cual hemos podido obtener un modelo lógico de nuestro sistema, pasamos a la elaboración de los scripts que engloban las sentencias DDL (definición de datos).
Mediante las sentencias DDL, definiremos mediante el lenguaje SQL la estructura de nuestra base de datos. Con estas sentencias podremos realizar las tareas de:
El siguiente código corresponde a las creaciones de las tablas Editorial, Tema, Autor, Libro, Escrito, Ejemplares, Tipo de socio, Socio y Préstamo. Antes de comenzar, queremos mencionar que la mayoría de los atributos de nuestra tabla es de tipo VARCHAR2 y cuyo tamaño varía en función del dato a almacenar ya sea un código (5 caracteres), descripciones, nombres, etc. (40 caracteres) o todo aquel dato numérico con el que no hemos de realizar funciones aritméticas. El resto de los datos son del tipo NUMBER o DATE si trabajamos con fechas.
Para elaborar el script a partir del modelo relacional se han seguido los siguientes pasos:
A la hora de crear una tabla, previamente habíamos escrito la sentencia DROP TABLE para poder eliminar las posibles tablas ya existentes. Esta sentencia la completamos con CASCADE CONSTRAINTS con el fin de eliminar las restricciones de integridad referencial, es decir, eliminamos la tabla con atributos referenciados por otras tablas y sus referencias.
A continuación, creamos la tabla y establecemos los nombres de los atributos, el tipo de dato, la longitud si era necesario y si alguna columna no podría tomar valores nulos (restricción de obligatoriedad).
Para finalizar, declaramos las CONSTRAINTS (restricciones) que pudieran existir al final del bloque como las PRIMARY KEY, FOREIGN KEY y CHECK. A todas estas restricciones se les otorgó un nombre propio por el que poder identificarlas rápidamente en caso de realizar alguna modificación posterior (sentencia ALTER TABLE). En el caso de la tabla Ejemplares, para respetar la integridad referencial y la propagación de la clave se ha indicado que la clave ajena (compuesta) proviene de la clave primaria también compuesta de esa misma tabla y el orden en la declaración se ha mantenido igual.
Enlace al script CREATE
DROP TABLE EDITORIAL CASCADE CONSTRAINTS;
CREATE TABLE EDITORIAL (
CIF VARCHAR(5),
EDINB VARCHAR(20) NOT NULL,
PAIS VARCHAR(20) NOT NULL,
CIUDAD VARCHAR(20),
CODIGO_POSTAL NUMBER(5),
CONSTRAINT pk_editorial PRIMARY KEY (CIF)
);
DROP TABLE TEMA CASCADE CONSTRAINTS;
CREATE TABLE TEMA (
CODIGO VARCHAR(5),
NOMBRE VARCHAR(20) NOT NULL,
UBICACION VARCHAR(20) NOT NULL,
CONSTRAINT pk_tema PRIMARY KEY (CODIGO)
);
DROP TABLE AUTOR CASCADE CONSTRAINTS;
CREATE TABLE AUTOR (
CODIGO VARCHAR(5),
APENOM VARCHAR(40) NOT NULL,
PAIS VARCHAR(20) NOT NULL,
ALIAS VARCHAR(20),
CONSTRAINT pk_autor PRIMARY KEY (CODIGO)
);
DROP TABLE LIBRO CASCADE CONSTRAINTS;
CREATE TABLE LIBRO (
ISBN VARCHAR(5),
TITULO VARCHAR(50) NOT NULL,
FECHA_IMP DATE,
LUGAR_IMP VARCHAR(20),
IDIOMA VARCHAR(10) NOT NULL,
NUM_PAG NUMBER,
CIF VARCHAR(9),
CODIGO VARCHAR(5),
CONSTRAINT pk_libro PRIMARY KEY (ISBN),
CONSTRAINT fk_libro1 FOREIGN KEY (CIF) REFERENCES EDITORIAL (CIF) ON DELETE CASCADE,
CONSTRAINT fk_libro2 FOREIGN KEY (CODIGO) REFERENCES TEMA (CODIGO) ON DELETE CASCADE
);
DROP TABLE ESCRITO CASCADE CONSTRAINTS;
CREATE TABLE ESCRITO (
CODIGO VARCHAR(5),
ISBN VARCHAR(5),
CONSTRAINT pk_escrito PRIMARY KEY (CODIGO, ISBN),
CONSTRAINT fk_escrito1 FOREIGN KEY (ISBN) REFERENCES LIBRO (ISBN) ON DELETE CASCADE,
CONSTRAINT fk_escrito2 FOREIGN KEY (CODIGO) REFERENCES AUTOR (CODIGO) ON DELETE CASCADE
);
DROP TABLE EJEMPLARES CASCADE CONSTRAINTS;
CREATE TABLE EJEMPLARES (
ISBN VARCHAR(5),
FORMATO VARCHAR(10) NOT NULL,
ESTADO VARCHAR(50),
FECHA_EDICION DATE NOT NULL,
CONSTRAINT pk_ejemplares PRIMARY KEY (ISBN, NUM_EJEMPLAR),
CONSTRAINT fk_ejemplares1 FOREIGN KEY (ISBN, NUM_EJEMPLAR) REFERENCES EJEMPLARES (ISBN,NUM_EJEMPLAR) ON DELETE CASCADE
);
DROP TABLE TIPO_SOCIO CASCADE CONSTRAINTS;
CREATE TABLE TIPO_SOCIO (
CODIGO VARCHAR(5),
DESCRIPCION VARCHAR(30) NOT NULL,
CONSTRAINT pk_tsocio PRIMARY KEY (CODIGO),
CONSTRAINT c_socio1 CHECK (DESCRIPCION IN('INFANTIL','ADULTO','INSTITUCIONAL'))
);
DROP TABLE SOCIO CASCADE CONSTRAINTS;
CREATE TABLE SOCIO (
NUM_SOCIO VARCHAR(5),
APENOM VARCHAR(40) NOT NULL,
FECHA_NAC DATE NOT NULL,
DIRECCION VARCHAR(30),
TELEFONO VARCHAR(10),
CODIGO VARCHAR(5),
CONSTRAINT pk_socio PRIMARY KEY (NUM_SOCIO),
CONSTRAINT fk_socio1 FOREIGN KEY (CODIGO) REFERENCES TIPO_SOCIO (CODIGO) ON DELETE CASCADE
);
DROP TABLE PRESTAMO CASCADE CONSTRAINTS;
CREATE TABLE PRESTAMO (
NUM_EJEMPLAR NUMBER,
ISBN VARCHAR(5),
NUM_SOCIO VARCHAR(5),
FECHA_INICIO DATE,
FECHA_FIN DATE NOT NULL,
FECHA_DEVOLUCION DATE,
CONSTRAINT pk_prestamo PRIMARY KEY (NUM_EJEMPLAR, ISBN, NUM_SOCIO, FECHA_INICIO),
CONSTRAINT fk_prestamo1 FOREIGN KEY (ISBN,NUM_EJEMPLAR) REFERENCES EJEMPLARES (ISBN,NUM_EJEMPLAR) ON DELETE CASCADE,
CONSTRAINT fk_prestamo2 FOREIGN KEY (NUM_SOCIO) REFERENCES SOCIO (NUM_SOCIO) ON DELETE CASCADE
);