Перш за все, причиною існування реляційної бази даних є причина моделювання відносин між сутностями. Приєднання - це просто механізми, за допомогою яких ми перетинаємо ці відносини. Вони, звичайно, приходять за номінальну вартість, але без приєднання, насправді немає підстав мати реляційну базу даних.
В академічному світі ми дізнаємося про такі речі, як різні нормальні форми (1-й, 2-й, 3-й, Бойс-Кодд тощо), а також дізнаємося про різні типи клавіш (первинні, іноземні, почергові, унікальні тощо) та як ці речі поєднуються разом для створення бази даних. І ми дізнаємося зачатки SQL, а також маніпулюючи як структурою, так і даними (DDL & DML).
У корпоративному світі багато академічних конструкцій виявляються суттєво менш життєздатними, ніж нас припускали. Прекрасним прикладом є поняття первинного ключа. В академічному плані саме той атрибут (або колекція атрибутів) однозначно ідентифікує один рядок у таблиці. Таким чином, у багатьох проблемних областях правильний академічний первинний ключ є складовою з 3 або 4 атрибутів. Однак майже кожен у сучасному корпоративному світі використовує автоматично сформоване послідовне ціле число як основний ключ таблиці. Чому? Дві причини. По-перше, це робить модель набагато чистішою, коли ви мігруєте FK-файли всюди. Другий, і найбільш германний до цього питання, полягає в тому, що отримання даних через з'єднання відбувається швидше і ефективніше в одному цілому цілому, ніж це на 4 колонках вархара (як уже згадувалося кількома людьми).
Давайте трохи глибше розберемося зараз у двох конкретних підтипах реальних баз даних. Перший тип - транзакційна база даних. Це основа для багатьох програм електронної комерції чи управління контентом, які керують сучасними сайтами. Завдяки БД транзакцій ви оптимізуєтесь до "пропускної здатності транзакцій". Більшість комерційних або контентних додатків мають збалансувати ефективність запитів (з певних таблиць) із ефективністю вставки (в інших таблицях), хоча для кожного додатка доведеться вирішувати свої унікальні проблеми, керовані бізнесом.
Другий тип баз даних у реальному світі - це база даних звітів. Вони використовуються майже виключно для збирання бізнес-даних та для створення значущих ділових звітів. Вони, як правило, формуються інакше, ніж бази даних транзакцій, де генеруються дані, і вони оптимізовані для швидкості масового завантаження даних (ETL) та виконання запитів при великих або складних наборах даних.
У кожному конкретному випадку розробнику або DBA необхідно ретельно збалансувати як функціональні, так і криві продуктивності, і існує багато хитрощів для підвищення продуктивності з обох сторін рівняння. В Oracle ви можете робити те, що називається "план пояснення", щоб ви могли конкретно бачити, як запит аналізується та виконується. Ви прагнете максимізувати належне використання БД індексів. Один насправді неприємний "ні-ні" - це ставити функцію в пункті запиту, де. Щоразу, коли ви це зробите, ви гарантуєте, що Oracle не буде використовувати жодних індексів у цьому конкретному стовпці, і ви, ймовірно, побачите повне або часткове сканування таблиці в плані пояснення. Це лише один конкретний приклад того, як може бути записаний запит, який закінчується повільним, і він не має нічого спільного з об'єднаннями.
І хоча ми говоримо про сканування таблиць, вони, очевидно, впливають на швидкість запиту пропорційно розміру таблиці. Повне сканування таблиці в 100 рядків навіть не помітно. Запустіть той самий запит на таблиці зі 100 мільйонами рядків, і вам потрібно буде повернутися наступного тижня для повернення.
Поговоримо про нормалізацію протягом хвилини. Це ще одна значною мірою позитивна академічна тема, яка може переоцінитись. Більшість випадків, коли ми говоримо про нормалізацію, ми дійсно маємо на увазі усунення дублікатів даних, помістивши їх у власну таблицю та перемістивши FK. Люди зазвичай пропускають всю залежність, описану 2NF та 3NF. І все ж у крайньому випадку, безумовно, можливо мати ідеальну базу даних BCNF, яка є величезною і повною звіром, щоб написати код, тому що це так нормалізується.
То де ми балансуємо? Не існує єдиної найкращої відповіді. Усі кращі відповіді, як правило, є компромісом між простотою обслуговування структури, простотою обслуговування даних та простотою створення / обслуговування коду. Загалом, чим менше дублюється даних, тим краще.
То чому приєднання іноді повільні? Іноді це поганий реляційний дизайн. Іноді це неефективне індексування. Іноді це проблема обсягу даних. Іноді це жахливо написаний запит.
Вибачте за таку затяту відповідь, але я відчув, що я змушений надати більш мірний контекст навколо моїх коментарів, а не просто відштовхуватися від відповіді на 4 кулі.