Integralność referencyjna to jedna z kluczowych zasad projektowania relacyjnych baz danych. Chodzi w niej o to, żeby wszystkie powiązania między tabelami były spójne i „nie urywały się w powietrzu”. Dlatego poprawne jest stwierdzenie, że każdej wartości klucza obcego musi odpowiadać dokładnie jedna istniejąca wartość klucza podstawowego w tabeli nadrzędnej. Klucz obcy (FOREIGN KEY) wskazuje na klucz główny (PRIMARY KEY) albo unikalny w innej tabeli i DBMS pilnuje, żeby te powiązania były zawsze poprawne. W praktyce oznacza to np. że w tabeli Zamówienia nie można wpisać id_klienta, którego nie ma w tabeli Klienci. System zarządzania bazą danych (MySQL, PostgreSQL, SQL Server, Oracle itd.) przy próbie wstawienia takiego rekordu po prostu zgłosi błąd naruszenia integralności referencyjnej. To samo dotyczy usuwania – jeśli chcesz usunąć klienta, do którego są przypisane zamówienia, to albo system na to nie pozwoli, albo (jeśli tak zaprojektujesz) automatycznie usunie lub zaktualizuje powiązane rekordy zgodnie z regułami ON DELETE / ON UPDATE (CASCADE, RESTRICT, SET NULL itp.). Moim zdaniem integralność referencyjna to absolutna podstawa przy poważnych projektach – bez tego szybko robi się bałagan: „osierocone” rekordy, błędne raporty, problemy z analityką. Dobre praktyki mówią jasno: zawsze definiuj klucze obce między tabelami powiązanymi relacjami 1‑wiele lub wiele‑wiele (przez tabelę pośredniczącą), nie polegaj tylko na logice aplikacji. Dzięki temu baza sama wymusza poprawność danych niezależnie od tego, czy łączy się z nią PHP, JavaScript (np. przez API), czy cokolwiek innego. To bardzo podnosi jakość i bezpieczeństwo danych w całym systemie.
Pojęcie integralności referencyjnej bywa mylone z innymi rodzajami ograniczeń w bazie danych, dlatego łatwo tu o skrót myślowy. W relacyjnych bazach danych mamy kilka różnych typów integralności: integralność encji, integralność dziedzinową oraz właśnie integralność referencyjną. Każda z nich dotyczy trochę innego aspektu poprawności danych i warto je sobie w głowie rozdzielić, bo w praktyce projektowej to mocno pomaga. Stwierdzenie, że wartość atrybutu należy do jego dziedziny, opisuje integralność dziedzinową. Oznacza to, że np. kolumna typu DATE faktycznie przechowuje poprawne daty, kolumna z ograniczeniem CHECK mieści tylko dopuszczalne wartości, a kolumna typu INT nie zawiera losowego tekstu. To jest ważne, ale nie ma nic wspólnego z powiązaniem między dwiema tabelami. Tutaj mówimy o poprawności pojedynczej kolumny, a nie relacji klucz główny–klucz obcy. Z kolei odporność bazy na błędy sprzętu czy oprogramowania to już zupełnie inny obszar – to domena niezawodności systemu, mechanizmów transakcyjności, backupów, logów transakcyjnych, klastrów HA, replikacji itd. To są dobre praktyki administracyjne i architektoniczne, ale nie opisują integralności referencyjnej. Można mieć świetnie zabezpieczony serwer, a jednocześnie kompletnie rozwaloną spójność logiczną danych, jeśli nie ma poprawnie zdefiniowanych kluczy obcych. Wymóg, że każda encja ma unikalny klucz podstawowy, dotyczy integralności encji. Chodzi o to, żeby każdy rekord w tabeli dało się jednoznacznie zidentyfikować i żeby klucz główny nie był NULL. To jest fundament, ale nadal mówimy tylko o pojedynczej tabeli. Integralność referencyjna wchodzi dopiero wtedy, gdy jedna tabela „wskazuje” na drugą przez klucz obcy. Typowy błąd myślowy polega na wrzuceniu do jednego worka wszystkich zasad typu PRIMARY KEY, FOREIGN KEY, CHECK, UNIQUE i nazywaniu tego ogólnie integralnością. W rzeczywistości integralność referencyjna jest ściśle związana z relacjami między tabelami: pilnuje, żeby żaden klucz obcy nie wskazywał na nieistniejący rekord. Jeśli chcemy projektować bazy sensownie, trzeba świadomie odróżniać te pojęcia i korzystać z odpowiednich ograniczeń dokładnie tam, gdzie są potrzebne.