Внешний ключ (FOREIGN KEY)
Внешним ключом называется ограничение, поддерживающее согласованное состояние данных между двумя таблицами, которое обеспечивает ссылочную целостность.
Ссылочная целостность позволяет получить полную информацию о необходимом объекте, которая расположена в нескольких таблицах.
Связь между таблицами не равноправна. В связи существует главная и подчиненная таблица. Самые распространенные связи «один-к-одному» и «один-ко-многим». При связи «один-к-одному» строке главной таблицы отвечает одна или ни одной строки подчиненной таблицы. В связи «один-ко-многим» одной строке главной таблицы соответствует любое количество строк подчиненной таблицы.
Связь устанавливается при равенстве значений определенных столбцов главной и подчиненной таблицы. При этом столбец (или их набор при составном ключе) подчиненной таблицы, который отвечает столбцу (или их набору) главной таблицы, и называют внешним ключом.
Так как главная таблица всегда располагается со стороны «один», то у столбца, который участвует в связи по внешнему ключу, должно быть ограничение UNIQUE или PRIMARY KEY. Внешний ключ задают в процессе создания или изменения структуры подчиненной таблицы с помощью спецификации FOREIGN KEY:
Типы данных столбцов 1 и 2 должны быть попарно совместимыми, а списки столбцов 1 и 2 должны содержать одинаковое количество столбцов.
Например, внешний ключ в таблице Т1 можно создать следующим образом:
Если столбец является первичным ключом главной таблицы, то его можно в скобках не указывать, поскольку он лишь один. Тогда последняя строка может быть записана следующим образом:
Базы данных InnoDB и MyIsam
Изначально SQL был разработан в качестве записной книжки для компьютера. С течением времени требования к хранению и обработке информации росли и СУБД перестали соответствовать потребностям пользователей.
Учитывая недостатки существующих СУБД в 2005 г. было разработано ядро СУБД InnoDB, которое стало поддерживаться MySQL.
Важнейшее отличие InnoDB – отношение к целостности данных. InnoDB поддерживал внешние ключи, транзакции, блокировку на уровне строк, что повысило надежность хранения и обработки информации, но, кроме всего прочего, повлияло на скорость и занимаемое место.
Рассмотрим механизм хранения данных в ядрах СУБД MyISAM и InnoDB .
В InnoDB и в MyISAM данные хранятся в файлах. Различаются они тем, что MyISAM для каждой таблицы создает отдельный файл, InnoDB все хранит в общем по умолчанию. Также InnoDB поддерживает MVCC («мультиверсионность») – каждый пользователь, не мешая другим, работает с отдельным экземпляром базы данных. Все вышеназванное приводит к увеличению размера хранилища, что сказывается на производительности InnoDB.
В вопросах надежности MyISAM уступает InnoDB. Так, в MyISAM таблица блокируется полностью, в то время, как в InnoDB таблица блокируется на уровне рядов таблицы. К тому же при правильной расстановке индексов и архитектуре и расстановке индексов снижение скорости InnoDB практически сводится к нулю, а возможно даже ее увеличение.
В отличие от MyISAM, InnoDB ранее не поддерживал индекс FULLTEXT, что приводило к сложной организации полнотекстового поиска. С версии MySQL 5.6.4 индекс был включен в InnoDB.
MyISAM удобно использовать, если таблицы изменяются довольно редко или не изменяются, т.е. когда СУБД используется не для изменения информации, а для чтения. Например, при хранении книг, индексации контента, в справочниках и т.д. в таком случае скорость выборки и размер хранилища может явиться существенным критерием. Целостность данных не находится под угрозой.