Po pierwsze, racją bytu (powodem istnienia) relacyjnej bazy danych jest możliwość modelowania relacji między podmiotami. Połączenia to po prostu mechanizmy, dzięki którym przechodzimy przez te relacje. Z pewnością mają one symboliczny koszt, ale bez łączeń naprawdę nie ma powodu, aby mieć relacyjną bazę danych.
W świecie akademickim uczymy się o różnych formach normalnych (1., 2., 3., Boyce-Codd, itp.), Oraz o różnych typach kluczy (podstawowych, obcych, alternatywnych, unikalnych itp.) te rzeczy pasują do siebie, aby zaprojektować bazę danych. Uczymy się podstaw SQL, a także manipulowania strukturą i danymi (DDL i DML).
W świecie korporacji wiele konstruktów akademickich okazuje się być znacznie mniej wykonalnych, niż sądzono. Doskonałym przykładem jest pojęcie klucza podstawowego. Z naukowego punktu widzenia to właśnie ten atrybut (lub zbiór atrybutów) jednoznacznie identyfikuje jeden wiersz w tabeli. Tak więc w wielu dziedzinach problemowych właściwy akademicki klucz główny jest złożeniem 3 lub 4 atrybutów. Jednak prawie wszyscy we współczesnym świecie korporacji używają automatycznie generowanej, sekwencyjnej liczby całkowitej jako klucza podstawowego tabeli. Czemu? Dwa powody. Po pierwsze, sprawia, że model jest znacznie czystszy podczas migracji elementów FK w różne miejsca. Drugim i najbardziej związanym z tym pytaniem jest to, że pobieranie danych przez łączenia jest szybsze i bardziej wydajne na pojedynczej liczbie całkowitej niż na 4 kolumnach varchar (jak już wspomniało kilka osób).
Zagłębmy się teraz nieco głębiej w dwa specyficzne podtypy rzeczywistych baz danych. Pierwszy typ to baza transakcyjna. To podstawa wielu aplikacji do handlu elektronicznego lub zarządzania treścią, napędzających nowoczesne witryny. Z bazą danych transakcji mocno optymalizujesz w kierunku „przepustowości transakcji”. Większość aplikacji handlowych lub związanych z treścią musi równoważyć wydajność zapytań (z niektórych tabel) z wydajnością wstawiania (w innych tabelach), chociaż każda aplikacja będzie miała własne, unikalne problemy biznesowe do rozwiązania.
Drugi typ rzeczywistej bazy danych to baza danych raportowania. Są one wykorzystywane prawie wyłącznie do agregowania danych biznesowych i generowania sensownych raportów biznesowych. Zazwyczaj mają inny kształt niż bazy danych transakcji, w których generowane są dane, i są wysoce zoptymalizowane pod kątem szybkości ładowania danych zbiorczych (ETL) i wydajności zapytań z dużymi lub złożonymi zestawami danych.
W każdym przypadku programista lub administrator danych musi dokładnie zrównoważyć zarówno funkcjonalność, jak i krzywe wydajności, a po obu stronach równania istnieje wiele sztuczek zwiększających wydajność. W Oracle można wykonać tak zwany „plan wyjaśniania”, dzięki czemu można dokładnie zobaczyć, w jaki sposób zapytanie jest analizowane i wykonywane. Chcesz zmaksymalizować prawidłowe wykorzystanie indeksów przez bazę danych. Naprawdę nieprzyjemnym nie-nie jest umieszczenie funkcji w klauzuli where zapytania. Kiedykolwiek to zrobisz, gwarantujesz, że Oracle nie użyje żadnych indeksów w tej konkretnej kolumnie i prawdopodobnie zobaczysz pełne lub częściowe skanowanie tabeli w planie wyjaśniania. To tylko jeden konkretny przykład tego, jak można napisać zapytanie, które kończy się powolnością i nie ma nic wspólnego z łączeniami.
A skoro mówimy o skanach tabel, oczywiście wpływają one na szybkość zapytań proporcjonalnie do rozmiaru tabeli. Pełne skanowanie 100 wierszy tabeli nie jest nawet zauważalne. Uruchom to samo zapytanie na tabeli zawierającej 100 milionów wierszy, a po powrocie musisz wrócić w przyszłym tygodniu.
Porozmawiajmy przez chwilę o normalizacji. To kolejny bardzo pozytywny temat akademicki, który może być nadmiernie zestresowany. W większości przypadków, gdy mówimy o normalizacji, tak naprawdę mamy na myśli eliminację zduplikowanych danych poprzez umieszczenie ich we własnej tabeli i migrację FK. Ludzie zwykle pomijają całą zależność opisaną przez 2NF i 3NF. A jednak w skrajnym przypadku z pewnością możliwe jest posiadanie doskonałej bazy danych BCNF, która jest ogromna i kompletna bestia do pisania kodu, ponieważ jest tak znormalizowana.
Więc gdzie balansujemy? Nie ma jednej najlepszej odpowiedzi. Wszystkie lepsze odpowiedzi są zwykle kompromisem między łatwością utrzymania struktury, łatwością obsługi danych i łatwością tworzenia / konserwacji kodu. Ogólnie rzecz biorąc, im mniej duplikatów danych, tym lepiej.
Dlaczego więc łączenia są czasami powolne? Czasami jest to zły projekt relacji. Czasami jest to nieefektywne indeksowanie. Czasami jest to problem z ilością danych. Czasami jest to okropnie napisane zapytanie.
Przepraszam za tak rozwlekłą odpowiedź, ale czułem się zmuszony do podania bardziej mięsistego kontekstu wokół moich komentarzy, zamiast po prostu wyrzucać 4-punktową odpowiedź.