Głębiej
To pojęcia powiązane, ale różne:
- **Primary key (PK)**: wybrany identyfikator wiersza w tabeli. Implikuje **unikalność** i zwykle **NOT NULL**. PK może być tylko jeden na tabelę, a inne tabele typowo referencjonują go przez foreign key.
- **Unique constraint**: reguła, że kolumna (lub zestaw kolumn) ma być unikalny. Unique constraintów może być wiele i często odpowiadają identyfikatorom biznesowym (email, externalId itd.).
- **Indeks**: fizyczna struktura danych (często B-tree), która przyspiesza odczyty (wyszukiwanie, joiny, sortowanie). Indeks może być unikalny lub nie.
Ważny niuans
W wielu bazach PK i unique constraint są egzekwowane przez **unikalny indeks**, ale *constraint* to reguła semantyczna, a *indeks* to ścieżka dostępu używana przez planner.
Praktyczne wskazówki
- PK trzymaj jako stabilną tożsamość (często stosuje się surrogate id).
- Unique constraint do reguł biznesowych (np. unikalność `(tenantId, email)`).
- Indeksy dobieraj pod wzorce zapytań (filtry + kolumny join + sortowanie).
Typowe pułapki
- Dodawanie indeksów „na wszelki wypadek” (wolniejsze zapisy, większy storage).
- Pominięcie unikalności złożonej w multi-tenant.
- Założenie, że constraint automatycznie optymalizuje wszystkie zapytania (projekt indeksów nadal ma znaczenie).