2016-02-07 99 views
0

任何人都可以解釋我的最好的辦法是在下clausule創建第三個表什麼發生什麼。的MySQL索引鍵字段

如若這樣的:

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

澄清你的問題PLZ得到一些更多的幫助。你是什​​麼意思*在下一個clausule *上創建第三個表格? –

+0

嗨@Pokies,我正在參照創建表的Clausule「ordenes_productos」,在那一個是我的confussion。 – WltrRpo

回答

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,顧名思義, 「獨一無二」
  • 啓動複合PRIMARY KEY的東西,是唯一不會使很有道理。
  • FOREIGN KEYs需要索引。即FOREIGN KEY (id_usuario)...需要INDEX (id_usuario)
  • 應該研究SELECTs,UPDATEsDELETEs中的WHERE子句以確定需要哪些索引。 (在沒有顯示的我們,我會假設沒有關鍵的。)

考慮到所有上述情況,我建議這些指標:

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; 

是否有此表中任何其他領域?你是在「正常化」一個價格嗎?標準化任何「連續」值(日期,數字,浮點等)不是一個好主意。警告:關於規範化的評論和我對多對多的評論是不相容的。

usuarioVARCHAR不是「連續的」並且VARCHAR大得多是不同的(關於歸一化)。