Foreign Key (зовнішній ключ) - це поле у таблиці, яке посилається на первинний ключ (Primary Key) в іншій таблиці. Найважливіше, що потрібно розуміти - це те, що Foreign Key не просто рядок з ID, який вказує на конкретний запис в іншій таблиці, а спеціальний механізм, який гарантує цілісність даних (referential integrity).
Простий приклад
В нас є таблиця users i orders. Користувач може створювати замовлення, і відповідно запис в таблиці orders має бути привʼязаний до конкретного запису в users. Для того, щоб звʼязати їх, ми будемо використовувати поле orders.user_id і таким чином будемо розуміти, хто створив замовлення.
З практичної точки зору, ми можемо реалізувати цю привʼязку і без Foreign Key, просто записуючи ID як число в поле user_id. Але цей підхід має декілька значних мінусів:
- База даних не контролює звʼязки між таблицями. Наприклад, в даному випадку в нас звʼязок one-to-many (один користувач має багато замовлень). Але якщо ми спробуємо зробити вибірку по конкретному користувачу, база даних буде сканувати всю таблицю, так як вона не знає, які замовлення відносяться до користувача, бо
user_idце просто число, а не посилання на іншу таблицю. - Немає захисту від неіснуючих даних. Якщо ми захочемо записати в
user_idчисло 100, ми не отримаємо ніякої помилки про те, що такого користувача не існує. - Немає контролю при видаленні чи оновленні користувача. Якщо при видаленні користувача нам потрібно буде видаляти всі його замовлення, то без Foreign Key ми будемо змушені робити це в бізнес-логіці. Тоді як зовнішній ключ реалізовує механізм referential actions, який дозволяє контролювати процес. Детально про цей механізм тут.
Всі ці проблеми вирішує Foreign Key, який забезпечує тісний звʼязок між таблицями і дозволяє нам реалізувати звʼязки між ними.