谁能解释我发生了什么,什么是在下一个子句中创建第三个表的最佳方法?

应该这样:

INDEX (id),
        INDEX (id_producto),
        INDEX (id_usuario)


被删除?

CREATE TABLE producto (
    id INT NOT NULL AUTO_INCREMENT,
    precio DECIMAL,
    PRIMARY KEY(id)
)   ENGINE=INNODB;
CREATE TABLE usuario (
    id INT NOT NULL AUTO_INCREMENT,
    nombre VARCHAR(100) NOT NULL,
    PRIMARY KEY (id)
)   ENGINE=INNODB;
CREATE TABLE ordenes_productos (
    id INT NOT NULL AUTO_INCREMENT,
    id_producto INT NOT NULL,
    id_usuario INT NOT NULL,
    fecha_hora DATETIME NOT NULL,

    PRIMARY KEY(id, id_producto, id_usuario),
    INDEX (id),
    INDEX (id_producto),
    INDEX (id_usuario),

    FOREIGN KEY (id_producto) REFERENCES producto(id),
    FOREIGN KEY (id_usuario) REFERENCES usuario(id)
)   ENGINE=INNODB;


谢谢大家

最佳答案

id INT NOT NULL AUTO_INCREMENT,
PRIMARY KEY(id, id_producto, id_usuario),
INDEX (id),
INDEX (id_producto),
INDEX (id_usuario),
FOREIGN KEY (id_producto) REFERENCES producto(id),
FOREIGN KEY (id_usuario) REFERENCES usuario(id)


分析:


AUTO_INCREMENT通常是“唯一的”
根据定义,PRIMARY KEY是“唯一的”
用唯一的东西开始复合PRIMARY KEY没有多大意义。
FOREIGN KEYs需要索引。也就是说,FOREIGN KEY (id_usuario)...需要INDEX (id_usuario)
应该研究WHERESELECTsUPDATEs中的DELETEs子句以确定需要哪些索引。 (在没有向我们展示这些内容的情况下,我将假设没有关键的内容。)


考虑到以上所有因素,我建议使用以下索引:

PRIMARY KEY(id),
INDEX (id_producto),
INDEX (id_usuario)


但是...还有另一个考虑。这是usuarioproducto之间的“多对多映射”吗?如果是这样,那么对(usario, producto)是“唯一的”吗?如果对所有这些回答都是,则:

CREATE TABLE ordenes_productos (
    id_producto INT NOT NULL,
    id_usuario INT NOT NULL,
    fecha_hora DATETIME NOT NULL,

    PRIMARY KEY(id_producto, id_usuario),  -- map one way
    INDEX      (id_usuario, id_producto),  -- map the other way
    FOREIGN KEY (id_producto) REFERENCES producto(id),
    FOREIGN KEY (id_usuario) REFERENCES usuario(id)
)   ENGINE=INNODB;


More details on many-to-many;

转到另一个主题...

CREATE TABLE producto (
    id INT NOT NULL AUTO_INCREMENT,
    precio DECIMAL,
    PRIMARY KEY(id)
)   ENGINE=INNODB;


该表中还有其他字段吗?您只是在“标准化”价格吗?标准化任何“连续”值(日期,数字,浮点数等)不是一个好主意。注意:关于规范化的评论与我关于多对多的评论不兼容。

usuario(就规范化而言)不同之处在于VARCHAR不是“连续的”,而VARCHAR更大。

关于mysql - MySQL索引键字段,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35258948/

10-11 20:39
查看更多