任何人都可以向我解释发生了什么,以及在下一个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;
谢谢大家。
答案 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)
。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;
关于另一个话题......
CREATE TABLE producto (
id INT NOT NULL AUTO_INCREMENT,
precio DECIMAL,
PRIMARY KEY(id)
) ENGINE=INNODB;
此表中还有其他字段吗?你是否只是正常化'一个价格?将任何"连续"标准化不是一个好主意。值(日期,数字,浮点数等)。警告:关于规范化的评论和我对多对多的评论是不相容的。
usuario
不同(关于规范化),因为VARCHAR
不是连续的'并且VARCHAR
要大得多。