Mysql 主键的ID或varchar+;多主键

Mysql 主键的ID或varchar+;多主键,mysql,database,Mysql,Database,下面的数据库工作正常,但我想知道它的设计是否可以改进(我不是专家)。例如: 1) datosreferenceas表的主键应该是ID INT NOT NULL AUTO_INCREMENT而不是referenceia VARCHAR(60)NOT NULL,还是不相关 2) 在fasesreferenceas表中,我不能有两个具有相同referencea和NUM\u FASE的条目。你会在这里创建一个复合主键吗?我读过,如果可能的话,应该避免使用复合主键 在这个数据库上运行的应用程序不允许输入错

下面的数据库工作正常,但我想知道它的设计是否可以改进(我不是专家)。例如:

1)
datosreferenceas
表的主键应该是
ID INT NOT NULL AUTO_INCREMENT
而不是
referenceia VARCHAR(60)NOT NULL
,还是不相关

2) 在
fasesreferenceas
表中,我不能有两个具有相同
referencea
NUM\u FASE
的条目。你会在这里创建一个复合主键吗?我读过,如果可能的话,应该避免使用复合主键

在这个数据库上运行的应用程序不允许输入错误的数据,但我对学习如何设计一个好的数据库感兴趣

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';

提前感谢,

通常,具有自动递增功能的ID feilds是主键标准。要在第二个表中强制执行您的条件,请使用
唯一索引,并继续使用id字段作为主键。以后连接表时要容易得多

我不知道你的具体情况,但我不知道有任何禁止复合主键的规定。