Podczas gdy mogą one być uciążliwe podczas manipulowania danymi rozwoju/testu, zaoszczędzili mi wiele kłopotów związanych z produkcją.
Pomyśl o nich jako o sposobie zachowania integralności danych, zwłaszcza jako zabezpieczenia przed osieroconymi zapisami.
Na przykład, jeśli miał bazę danych odnoszącą wiele PhoneNumber
zapisy do Person
, co dzieje się z PhoneNumber
zapisów gdy rekord Person
zostanie usunięty z jakiegokolwiek powodu? Będą one nadal znajdować się w bazie danych, ale identyfikator Person
, którego dotyczą, nie będzie już istnieć w odpowiedniej tabeli Person
, a użytkownik ma osierocone rekordy.
Tak, można napisać spust, aby usunąć PhoneNumber
ilekroć Person
zostaje usunięty, ale może to bałagan jeśli przypadkowo usunąć Person
i trzeba wycofać.
Tak, być może pamiętasz ręczne pozbywanie się rekordów PhoneNumber
, ale co z innymi programistami lub metodami, które piszesz przez 9 miesięcy?
Tworząc klucz obcy, który zapewnia, że każdy PhoneNumber
jest powiązany z istniejącym Person
, obaj ubezpieczycie się przed zniszczeniem tej relacji, a także dodają "wskazówki" co do zamierzonej struktury danych.
Relacje klucza obcego wymuszają integralność danych w warstwie danych, zmniejszając w ten sposób nieprawidłowe dane docierające do systemu; nie, nie bardzo. Na przykład, jeśli masz tabelę osób z relacją FK do tabeli płci, programista może wstawić rekord do osoby o płci "whocares". Teraz możesz nie przejmować się tym, ale jeśli zbudujesz logikę z ważnych wpisów i spodziewasz się tylko mężczyzny/kobiety, to dobrze ... będziesz miał problem. Jeśli kiedykolwiek chciałbyś wykonać inżynierię odwrotną DB, aby uzyskać ERD, wtedy też miałbyś problemy. i rusztowania i inne technologie na tym poziomie projektowania ... – xQbert
Wysoce powiązane: [Dlaczego klucze zagraniczne są częściej używane w teorii niż w praktyce?] (http://stackoverflow.com/questions/1876013/why-are-foreign -keys-więcej-w-teorii niż-w-praktyce) –
Mieliśmy podobny scenariusz w miejscu, w którym pracowałem: jedna aplikacja nie miała obcych kluczy, ponieważ ORM zajmował się wszystkimi takimi sprawami itd. Pewnego dnia ważny klient wykrył znaczną utratę danych, która została ostatecznie powiązana z błędem w ORM. Bardzo szkodliwe dla relacji, obwiniając deweloper ORM nie pomaga. Klucze zagraniczne zostały dodane wkrótce po! – onedaywhen