Którą integralność opisuje cytowana definicja?
„… polega na wprowadzeniu i utrzymaniu powiązań pomiędzy tabelami. Związki te tworzy się przez umieszczenie kolumny pełniącej rolę klucza głównego tabeli w innej tabeli, co nadaje kolumnie funkcję klucza obcego.”
A. Encji
B. Semantyczną
C. Referencyjną
D. Statyczną
Pytanie z egzaminu CKE, styczeń 2021 (arkusz E.14-SG-21.01).
Odpowiedź referencyjną jest właściwa, bo definicja mówi dokładnie o integralności referencyjnej w relacyjnych bazach danych. Chodzi tu o pilnowanie poprawnych powiązań między tabelami za pomocą klucza głównego i klucza obcego. Przykładowo tabela Klienci może mieć kolumnę id_klienta jako klucz główny, a tabela Zamowienia może przechowywać id_klienta jako klucz obcy. Dzięki temu baza danych nie powinna pozwolić na dodanie zamówienia dla klienta, którego nie ma w tabeli Klienci. Moim zdaniem to jedna z najważniejszych zasad przy projektowaniu normalnej, porządnej bazy, bo chroni przed bałaganem w danych. W praktyce integralność referencyjna jest realizowana przez ograniczenia FOREIGN KEY, często razem z regułami ON DELETE i ON UPDATE, np. CASCADE, RESTRICT albo SET NULL. Dobra praktyka branżowa jest taka, żeby relacje projektować świadomie już na etapie modelu ERD, a nie dopiero wtedy, gdy aplikacja zaczyna zwracać dziwne wyniki. Integralność referencyjna pomaga utrzymać spójność danych, ułatwia pisanie zapytań SQL i zmniejsza ryzyko tak zwanych osieroconych rekordów, czyli takich wpisów, które odwołują się do nieistniejących danych.
W tym pytaniu łatwo pomylić różne rodzaje integralności, bo wszystkie dotyczą poprawności danych, ale każda pilnuje czegoś innego. Integralność encji odnosi się głównie do tego, żeby każdy rekord w tabeli był jednoznacznie identyfikowalny. W praktyce oznacza to stosowanie klucza głównego, który nie powinien mieć wartości NULL i powinien być unikalny. To ważna zasada, ale sama w sobie nie opisuje jeszcze powiązań między tabelami. Jeśli w definicji pojawia się przeniesienie klucza głównego jednej tabeli do innej tabeli jako klucza obcego, to jesteśmy już przy relacjach między tabelami, a nie tylko przy identyfikacji pojedynczych wierszy.
Integralność statyczna bywa rozumiana jako poprawność danych w danym momencie, wynikająca z ograniczeń, typów danych, zakresów wartości czy reguł walidacyjnych. Nie jest to jednak standardowe określenie relacji typu klucz główny - klucz obcy. Podobnie integralność semantyczna dotyczy sensu danych względem logiki biznesowej. Na przykład cena produktu nie powinna być ujemna, data zakończenia umowy nie powinna być wcześniejsza niż data rozpoczęcia, a PESEL powinien mieć właściwą długość i strukturę. To są reguły znaczeniowe, bardzo praktyczne, ale nie o to chodzi w cytowanej definicji.
Typowy błąd myślowy polega na tym, że ktoś widzi słowo integralność i wybiera odpowiedź, która brzmi ogólnie albo technicznie. W bazach danych trzeba jednak patrzeć na słowa kluczowe: tabela, klucz główny, klucz obcy, powiązanie. Taki zestaw prawie zawsze prowadzi do integralności referencyjnej. Z mojego doświadczenia, jeśli dobrze zrozumiesz ten mechanizm, łatwiej potem projektować relacje jeden-do-wielu, tworzyć diagramy ERD i pisać poprawne zapytania JOIN bez robienia przypadkowego chaosu w danych.
Integralność statyczna bywa rozumiana jako poprawność danych w danym momencie, wynikająca z ograniczeń, typów danych, zakresów wartości czy reguł walidacyjnych. Nie jest to jednak standardowe określenie relacji typu klucz główny - klucz obcy. Podobnie integralność semantyczna dotyczy sensu danych względem logiki biznesowej. Na przykład cena produktu nie powinna być ujemna, data zakończenia umowy nie powinna być wcześniejsza niż data rozpoczęcia, a PESEL powinien mieć właściwą długość i strukturę. To są reguły znaczeniowe, bardzo praktyczne, ale nie o to chodzi w cytowanej definicji.
Typowy błąd myślowy polega na tym, że ktoś widzi słowo integralność i wybiera odpowiedź, która brzmi ogólnie albo technicznie. W bazach danych trzeba jednak patrzeć na słowa kluczowe: tabela, klucz główny, klucz obcy, powiązanie. Taki zestaw prawie zawsze prowadzi do integralności referencyjnej. Z mojego doświadczenia, jeśli dobrze zrozumiesz ten mechanizm, łatwiej potem projektować relacje jeden-do-wielu, tworzyć diagramy ERD i pisać poprawne zapytania JOIN bez robienia przypadkowego chaosu w danych.