Reputation: 513
The database below works but I wonder if its design can be improved (I'm no expert). For instance:
1) Should DATOSREFERENCIAS
table have an ID INT NOT NULL AUTO_INCREMENT
instead of REFERENCIA VARCHAR(60) NOT NULL
as primary key or it's irrelevant?
2) In FASESREFERENCIAS
table, I can't have two entries with same REFERENCIA
and NUM_FASE
. Would you create a compound primary key here? I've read that compound primary keys should be avoided if possible.
The application running on top of this database won't allow to input incorrect data but I'm interested in learning how to design a good database.
DROP TABLE IF EXISTS `gestiontransportes`.`CLIENTES`;
DROP TABLE IF EXISTS `gestiontransportes`.`FASESREFERENCIAS`;
DROP TABLE IF EXISTS `gestiontransportes`.`DATOSREFERENCIAS`;
DROP TABLE IF EXISTS `gestiontransportes`.`PROVEEDORFASE`;
CREATE TABLE `gestiontransportes`.`CLIENTES` (
`ID` INT NOT NULL, -- THIS ID IS HARDCODED, COPIED FROM THE ERP
`CLIENTES` VARCHAR(60) NOT NULL,
`DIAS_TRANSITO` INT NOT NULL,
PRIMARY KEY (`ID`), -- INT = DÍAS DE TRÁNSITO, 100 = LUNES, 200 = MARTES, 300 = MIÉRCOLES, 400 = JUEVES, 500 = VIERNES
UNIQUE (`CLIENTES`)
) ENGINE = InnoDB COMMENT = 'Tabla para listar todos los clientes existentes';
CREATE TABLE `gestiontransportes`.`PROVEEDORFASE` (
`ID` INT NOT NULL, -- THIS ID IS HARDCODED, COPIED FROM THE ERP
`PROVEEDORFASE` VARCHAR(100) NOT NULL,
`DIAS_PROCESAR` INT NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE (`PROVEEDORFASE`)
) ENGINE = InnoDB COMMENT = 'Tabla para los datos maestros de las fases';
CREATE TABLE `gestiontransportes`.`DATOSREFERENCIAS` (
`REFERENCIAS` VARCHAR(60) NOT NULL,
`IDCLIENTE` INT NOT NULL,
`PESO_NETO` FLOAT NOT NULL,
`CICLO_ESPERADO` FLOAT NOT NULL,
`RENDIMIENTO` INT NOT NULL,
PRIMARY KEY (`REFERENCIAS`),
FOREIGN KEY (IDCLIENTE)
REFERENCES PROVEEDORFASE(ID)
ON DELETE CASCADE
) ENGINE = InnoDB COMMENT = 'Tabla para los datos maestros de las refs';
CREATE TABLE `gestiontransportes`.`FASESREFERENCIAS` (
`ID` INT NOT NULL AUTO_INCREMENT,
`REFERENCIA` VARCHAR(60) NOT NULL,
`NUM_FASE` INT NOT NULL, -- IDENTIFICA EL NÚMERO DE FASE COMO EN GESIN
`FASE` INT NOT NULL, -- IDENTIFICA PROVEEDORFASE
`KG_MIN_ENVIAR` INT NOT NULL,
`KG_MAX_ENVIAR` INT NOT NULL,
PRIMARY KEY (`ID`),
FOREIGN KEY (REFERENCIA)
REFERENCES DATOSREFERENCIAS(REFERENCIAS),
FOREIGN KEY (FASE)
REFERENCES PROVEEDORFASE(ID)
ON DELETE CASCADE
) ENGINE = InnoDB COMMENT = 'Tabla para los datos maestros de las fases de las refs';
Thanks in advance,
Upvotes: 0
Views: 193
Reputation: 2683
normally, ID feilds with auto increment is the primary key standard. to force your condition in the second table use unique index, and keep using an id feild as the primary key. it is much easier when joining tables later.
Upvotes: 1