Три основных ключа, относящиеся к трем различным таблицам - PullRequest
0 голосов
/ 20 марта 2012

У меня есть следующие категории таблиц, Ресторан и меню.

В ресторане может быть несколько меню, а в ресторане может быть несколько категорий. Каждое меню имеет определенное количество категорий, и каждая категория может быть частью ряда меню.

Могу ли я создать таблицу, которая выглядит следующим образом и имеет 3 первичных ключа?

ID категории | ID ресторана | Идентификатор меню

1 (закуска) | 1 Чили | 2 ужина
2 (Entree) | 1 Чили | 2 Меню ужина
3 (Десерт) | 1Чили | 2 Меню ужина
1 | 67 Макдональдс | 3 Обеденных Меню 1

1 Ответ

3 голосов
/ 20 марта 2012

Да, вы можете сделать первичный ключ кортежа (category_id, restaurant_id, menu_type_id).Более того, создайте нормальный интегральный первичный ключ и добавьте еще один индекс к этому кортежу с ограничением уникальности.Всегда хорошо иметь быстрый простой первичный ключ, но вы, безусловно, можете применить уникальность тройки:

CREATE UNIQUE INDEX menu_index
                 ON menus (category_id, restaurant_id, menu_type_id)

Или вы можете определить индекс прямо при создании таблицы:

CREATE TABLE menus (menu_id       INT AUTO_INCREMENT PRIMARY KEY,
                    category_id   INT,
                    restaurant_id INT,
                    menu_type_id  INT,
                    FOREIGN KEY (category_id)   REFERENCES categories(category_id),
                    FOREIGN KEY (restaurant_id) REFERENCES restaurants(restaurant_id),
                    FOREIGN KEY (menu_type_id)  REFERENCES menu_types(menu_type_id),
                    UNIQUE INDEX  (category_id, restaurant_id, menu_type_id)
                   ) ENGINE=InnoDB;
...