Você está na página 1de 4

Tema 6

Elaboracin del Modelo Fsico


Ejemplo de conversin de modelo lgico relacional a modelo
fsico utilizando MySQL

Sea el siguiente modelo relacional:

Obtener una secuencia de sentencias SQL que creen la base de datos y las tablas en
MySQL/MariaDB 5.x
En primer lugar hay que crear la base de datos en si. Dado que no se nos proporciona un nombre,
podemos llamarla publicacion. Por lo tanto, la creacin de la base de datos se realizara:
CREATE DATABASE publicacion CHARACTER SET utf8 COLLATE
utf8_spanish_ci;

Esta sentencia crea la base de datos publicacion con el juego de caracteres utf8 y las reglas de
comparacin de espaol en utf8. Es una apuesta ms o menos segura si el texto de los campos va a
contener palabras o nombres espaoles. Si no probablemente sea ms seguro utilizar utf8_general_ci,
que es el orden por defecto en utf8, si no se especifica, por lo que las don sentencias siguientes son
equivalentes:
CREATE DATABASE publicacion CHARACTER SET utf8 COLLATE
utf8_general_ci;
CREATE DATABASE publicacion CHARACTER SET utf8;

Nosotros nos quedaremos con el primero que hemos hecho ya que suponemos que nuestros datos de
texto estarn en espaol.
Una vez creada la base de datos, la seleccionamos para comenzar a utilizarla:
use publicacion;

Para evitar problemas con las referencias, lo mejor es crear las tablas sin utilizar claves ajenas y, una
vez creadas, establecer las claves ajenas. Esto es as porque algunos SGBDs (entre ellos MySQL) no
crean una clave ajena si la tabla y clave primaria a la que referencian no existe. Por lo tanto tenemos
dos opciones: O bien creamos las tablas, comenzando por las que no referencian a nadie y aadiendo
las que slo referencian a las ya creadas hasta que acabemos o creamos todas las tablas, en el orden que
queramos, sin incluir las claves ajenas y posteriormente las aadimos utilizando ALTER TABLE para
ello. Vamos a seguir el segundo mtodo ya que es ms seguro y siempre se puede aplicar dado que a
veces el primero no es aplicable si hay tablas que se referencian unas a otras mutuamente.
La creacin de las tablas, sin claves ajenas sera:
CREATE TABLE Autor (
DNI CHAR(9) NOT NULL PRIMARY KEY,
Nombre VARCHAR(100) NOT NULL,
Especialidad VARCHAR(50) NOT NULL
);
CREATE TABLE HaEscrito (
DNI CHAR(9) NOT NULL,
ISBN CHAR(13) NOT NULL,
CONSTRAINT PRIMARY KEY (DNI,ISBN)
);
CREATE TABLE Libro (
ISBN CHAR(13) NOT NULL PRIMARY KEY,
Fecha_Publicacion DATE NOT NULL,
Titulo VARCHAR(150) NOT NULL,
Numero_Paginas INTEGER NOT NULL,
Editorial VARCHAR(100) NOT NULL,
Formato VARCHAR(50) NOT NULL
);
CREATE TABLE Sirve_Para (
ISBN CHAR(13) NOT NULL,
Nombre VARCHAR(50) NOT NULL,
CONSTRAINT PRIMARY KEY (ISBN, Nombre)
);
CREATE TABLE Asignatura (
Nombre VARCHAR(50) NOT NULL PRIMARY KEY
);
Esto creara las tablas, sin establecer las claves ajenas, aunque las columnas necesarias estn ahi.
Hay que hacer algunos comentarios sobre los comandos:
DNI se ha tomado como que son 9 caracteres y siempre 9 (8 nmeros y una letra).

ISBN son 13 dgitos, aunque se almacena como una cadena porque se desean mantener todos
los dgitos, incluidos los ceros a la izquierda.
Los campos de texto se han declarado como VARCHAR y la longitud se ha estimado.

A continuacin creamos las claves ajenas:


ALTER TABLE HaEscrito ADD CONSTRAINT FOREIGN KEY (DNI) REFERENCES
Autor(DNI);
ALTER TABLE HaEscrito ADD CONSTRAINT FOREIGN KEY (ISBN) REFERENCES
Libro(ISBN);
ALTER TABLE Sirve_Para ADD CONSTRAINT FOREIGN KEY (ISBN) REFERENCES
Libro(ISBN);
ALTER TABLE Sirve_Para ADD CONSTRAINT FOREIGN KEY (Nombre) REFERENCES
Asignatura(Nombre);

Una vez hecho esto ya tenemos creada nuestra primera base de datos. La secuencia completa de
sentencias, sin interrupciones sera:
CREATE DATABASE publicacion CHARACTER SET utf8 COLLATE
utf8_spanish_ci;
use publicacion;
CREATE TABLE Autor (
DNI CHAR(9) NOT NULL PRIMARY KEY,
Nombre VARCHAR(100) NOT NULL,
Especialidad VARCHAR(50) NOT NULL
);
CREATE TABLE HaEscrito (
DNI CHAR(9) NOT NULL,
ISBN CHAR(13) NOT NULL,
CONSTRAINT PRIMARY KEY (DNI,ISBN)
);
CREATE TABLE Libro (
ISBN CHAR(13) NOT NULL PRIMARY KEY,
Fecha_Publicacion DATE NOT NULL,
Titulo VARCHAR(150) NOT NULL,
Numero_Paginas INTEGER NOT NULL,
Editorial VARCHAR(100) NOT NULL,
Formato VARCHAR(50) NOT NULL
);
CREATE TABLE Sirve_Para (
ISBN CHAR(13) NOT NULL,
Nombre VARCHAR(50) NOT NULL,
CONSTRAINT PRIMARY KEY (ISBN, Nombre)
);
CREATE TABLE Asignatura (
Nombre VARCHAR(50) NOT NULL PRIMARY KEY
);
ALTER TABLE HaEscrito ADD CONSTRAINT FOREIGN KEY (DNI) REFERENCES
Autor(DNI);
ALTER TABLE HaEscrito ADD CONSTRAINT FOREIGN KEY (ISBN) REFERENCES
Libro(ISBN);
ALTER TABLE Sirve_Para ADD CONSTRAINT FOREIGN KEY (ISBN) REFERENCES
Libro(ISBN);
ALTER TABLE Sirve_Para ADD CONSTRAINT FOREIGN KEY (Nombre) REFERENCES
Asignatura(Nombre);

Si tenemos curiosidad podemos ver que resultado proporciona mysqldump sobre nuestra nueva base de
datos.