MySQL索引键字段

时间:2016-02-07 20:49:04

标签: mysql database database-design

任何人都可以向我解释发生了什么,以及在下一个clausule上创建第三个表的最佳方法。

应该这样:

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;

谢谢大家。

1 个答案:

答案 0 :(得分:2)

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是" unique"
  • 使用独特的东西启动化合物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要大得多。