2016-02-07 2 views
0

Может ли кто-нибудь объяснить мне, что произойдет, и что лучший способ создать третью таблицу в следующем клаузуле.MySQL Indexing Keys Fields

Если это:

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, чтобы получить еще несколько подсказок. что вы подразумеваете под * созданием третьей таблицы в следующем клаузуле *? –

+0

Привет @Pokies, я ссылаюсь на Create Clausule таблицы 'ordenes_productos', в этом я - мое замешательство. – 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).
  • В статье 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 намного больше.