谁能解释我发生了什么,什么是在下一个子句中创建第三个表的最佳方法?
应该这样:
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)
。应该研究
WHERE
,SELECTs
和UPDATEs
中的DELETEs
子句以确定需要哪些索引。 (在没有向我们展示这些内容的情况下,我将假设没有关键的内容。)考虑到以上所有因素,我建议使用以下索引:
PRIMARY KEY(id),
INDEX (id_producto),
INDEX (id_usuario)
但是...还有另一个考虑。这是
usuario
和producto
之间的“多对多映射”吗?如果是这样,那么对(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/