Diseño Físico de la Base de Datos.
Aprende a crear un modelo físico de base de datos, definiendo tipos de datos, índices y claves foráneas.
Cristian Escalante
Última actualización: 19 de abril de 2025
Diseño Físico de la Base de Datos.
Este modelo representa la implementación real de la base de datos (Mysql, Posgresql, etc.) Aquí se definen los tipos exactos de las propiedades, además de las claves primarias y foráneas.
El modelo físico es donde la teoría se convierte en realidad. Aquí se definen los tipos de datos específicos para cada columna, las restricciones de integridad, los índices y otros aspectos técnicos que afectan el rendimiento y la eficiencia de la base de datos.
Hay que tener en cuenta lo siguiente:
- Tipos de Datos: Definir el tipo de dato para cada columna (INT, VARCHAR, DATE, etc.).
- Índices: Crear índices para mejorar el rendimiento de las consultas.
- Claves Foráneas: Definir las relaciones entre tablas mediante claves foráneas.
- Restricciones: Establecer restricciones de integridad, como
NOT NULL
,UNIQUE
, etc. - Normalización: Asegurarse de que la base de datos esté normalizada para evitar redundancias y mejorar la integridad de los datos.
Definición de tablas exactas
CREATE TABLE sucursal (
id_sucursal INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(50) NOT NULL,
direccion VARCHAR(100),
telefono VARCHAR(15),
ciudad VARCHAR(50) DEFAULT 'San Salvador'
) ENGINE=InnoDB;
Tipos de datos precisos
Se especifican con exactitud los tipos de datos según el SGBD:
Columna | Tipo en Modelo Lógico | Tipo en Físico (MySQL) | Razón |
---|---|---|---|
precio | DECIMAL(10,2) | DECIMAL(12,2) | Permitir valores mayores |
teléfono | VARCHAR(20) | VARCHAR(15) | Formatos internacionales |
fecha_venta | DATE | DATETIME | Registrar hora exacta |
Indices para Optimización
-- Índice para búsquedas frecuentes por marca
CREATE INDEX idx_auto_marca ON auto(marca);
-- Índice compuesto para consultas de ventas por fecha
CREATE INDEX idx_venta_fecha_cliente ON venta(fecha, id_cliente);
DDL
-- Tabla Sucursal
CREATE TABLE sucursal (
id_sucursal INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(50) NOT NULL,
direccion VARCHAR(100) NOT NULL,
telefono VARCHAR(15),
capacidad INT CHECK (capacidad > 0)
) ENGINE=InnoDB;
-- Tabla Vendedor
CREATE TABLE vendedor (
id_vendedor INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(100) NOT NULL,
comision DECIMAL(5,2) DEFAULT 2.5,
id_sucursal INT NOT NULL,
fecha_contratacion DATE,
FOREIGN KEY (id_sucursal) REFERENCES sucursal(id_sucursal)
ON DELETE CASCADE
) ENGINE=InnoDB;
-- Tabla Auto
CREATE TABLE auto (
id_auto INT PRIMARY KEY AUTO_INCREMENT,
vin VARCHAR(17) UNIQUE NOT NULL, -- Número de chasis
marca VARCHAR(30) NOT NULL,
modelo VARCHAR(50) NOT NULL,
año SMALLINT CHECK (año BETWEEN 1900 AND YEAR(CURDATE()) + 1),
precio DECIMAL(12,2) NOT NULL,
color VARCHAR(30),
id_sucursal INT NOT NULL,
FOREIGN KEY (id_sucursal) REFERENCES sucursal(id_sucursal)
) ENGINE=InnoDB;
-- Tabla Cliente
CREATE TABLE cliente (
id_cliente INT PRIMARY KEY AUTO_INCREMENT,
nombre VARCHAR(100) NOT NULL,
email VARCHAR(100) UNIQUE,
telefono VARCHAR(15),
direccion TEXT
) ENGINE=InnoDB;
-- Tabla Venta
CREATE TABLE venta (
id_venta INT PRIMARY KEY AUTO_INCREMENT,
fecha_hora DATETIME DEFAULT CURRENT_TIMESTAMP,
monto_total DECIMAL(12,2) NOT NULL,
forma_pago ENUM('Contado', 'Crédito', 'Leasing') NOT NULL,
id_cliente INT NOT NULL,
id_vendedor INT NOT NULL,
id_auto INT NOT NULL,
FOREIGN KEY (id_cliente) REFERENCES cliente(id_cliente),
FOREIGN KEY (id_vendedor) REFERENCES vendedor(id_vendedor),
FOREIGN KEY (id_auto) REFERENCES auto(id_auto)
) ENGINE=InnoDB;