2013-11-02 3 views
1

я узнавал об иностранных ключей, и я хотел бы знать, если так, как я использовал его правильно в примере ниже:Внешний ключ для нескольких таблиц и столбцов?

CREATE TABLE user(
    id INT(11) NOT NULL AUTO_INCREMENT, 
    username VARCHAR(50) NOT NULL, 
    password VARCHAR(20) NOT NULL, 
    PRIMARY KEY (id) 
); 

CREATE TABLE items(
    i_id INT(11) NOT NULL AUTO_INCREMENT, 
    name TINYTEXT NOT NULL, 
    price DECIMAL(8,2) NOT NULL, 
    PRIMARY KEY (i_id) 
); 

CREATE TABLE user_purchase(
    i_id INT(11) NOT NULL, 
    name TINYTEXT NOT NULL, 
    id INT(11) NOT NULL, 
    FOREIGN KEY (i_id) REFERENCES items(i_id), 
    FOREIGN KEY (name) REFERENCES items(name), 
    FOREIGN KEY (id) REFERENCES user(id) 
); 

Благодаря

Теперь, как я могу получить максимум информации от просто Иностранный ключ, если я использую, скажем, PHP?

ответ

2

Вам не обязательно включать имя элемента в обе таблицы. Это называется денормализованным решением. Вы должны использовать его только в таблице элементов и ссылаться только на идентификатор, тогда, если вам нужно имя, вы также можете присоединиться к нему на основе первичного ключа (id). Иначе, на мой взгляд, все в порядке.

CREATE TABLE user(
    id INT(11) NOT NULL AUTO_INCREMENT, 
    username VARCHAR(50) NOT NULL, 
    password VARCHAR(20) NOT NULL, 
    PRIMARY KEY (id) 
); 

CREATE TABLE items(
    i_id INT(11) NOT NULL AUTO_INCREMENT, 
    name TINYTEXT NOT NULL, 
    price DECIMAL(8,2) NOT NULL, 
    PRIMARY KEY (i_id) 
); 

CREATE TABLE user_purchase(
    i_id INT(11) NOT NULL, 
    name TINYTEXT NOT NULL, 
    id INT(11) NOT NULL, 
    FOREIGN KEY (i_id) REFERENCES items(i_id), 
    FOREIGN KEY (id) REFERENCES user(id) 
); 

Иногда, когда производительность имеет решающее значение, вы должны использовать денормализованные таблицы. Это может быть намного быстрее.

Нормализация важна, чтобы избежать различных аномалий. Если у вас есть таблицы в нормальной форме высокого уровня, тогда ваши таблицы не будут избыточными и не будут иметь этих аномалий. Например, если у вас есть что-то, хранящееся в нескольких местах, вам необходимо следить за тем, чтобы все избыточные данные обновлялись. Это дает вам возможность сделать это неправильно и в итоге иметь различные аномалии.

В вашей ситуации наличие внешнего ключа помогает сохранить целостность данных, но без внешнего ключа для имени вы сможете иметь элементы с именами в покупках, отсутствующих в таблице элементов.

Это своего рода аномалия.

Существует много видов этого, лучше всего избегать их, сколько сможете.

Read more here about anomalies

В некоторых случаях вы должны denoramalize. Поэтому резервируйте некоторые данные из-за проблем с производительностью. Таким образом, вы можете сохранить некоторые операции соединения, которые могут потреблять много времени.

Подробная информация о нормализации покрыты по темам различных нормальных форм: nf0, NF1, НФ2, NF3 и НФБК

Normal forms in detail

Для получения более подробной информации о математических основах loseless разложения в высших нормальных форм см «Функциональные зависимости». Это поможет вам понять, почему вы можете сохранить идентификаторы «избыточными». Фактически они необходимы для избыточности, так как они вам нужны, чтобы впоследствии восстановить исходный набор данных. Это будет определение для разных нормальных форм. Каков уровень этой избыточности?

Functional Dependencies

+0

Awesome: D Спасибо. –

+0

Но как насчет нормализации и денормализации? Я видел это, но я не могу получить хорошее объяснение этих двух вещей, которые, как кажется, важны для Google. Не могли бы вы объяснить? Спасибо. –

+0

Надеюсь, я помог. Если у вас есть еще вопросы, не стесняйтесь их включать. Если вы не понимаете некоторые детали, скажите мне, я могу рассказать им более подробно. –

2

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

CREATE TABLE `user`(
    id INT(11) NOT NULL AUTO_INCREMENT, 
    username VARCHAR(50) NOT NULL, 
    password VARCHAR(20) NOT NULL, 
    PRIMARY KEY (id) 
); 

CREATE TABLE items(
    i_id INT(11) NOT NULL AUTO_INCREMENT, 
    `name` TINYTEXT UNIQUE NOT NULL, 
    price DECIMAL(8,2) NOT NULL, 
    PRIMARY KEY (i_id)  
); 

CREATE TABLE user_purchase(
    i_id INT(11) NOT NULL, 
    `name` TINYTEXT NOT NULL, 
    id INT(11) NOT NULL, 
    FOREIGN KEY (i_id) REFERENCES items(i_id), 
    FOREIGN KEY (id) REFERENCES `user`(id)  
); 
Смежные вопросы