Jestem bardzo nowy w temacie baz danych, więc może to zabrzmieć nieświadomie, ale jestem ciekawy, dlaczego klucz powinien być wyraźnie określony w tabeli. Czy to przede wszystkim po to, aby powiedzieć użytkownikowi, że podana wartość kolumny ma (miejmy nadzieję) niepowtarzalność w każdym wierszu? Ta wyjątkowość powinna nadal istnieć, nawet jeśli nie jest wspomniana.
primary-key
unique-constraint
dsaxton
źródło
źródło
Odpowiedzi:
Oczywiście sugerujesz, że aplikacje
CONSTRAINT
w bazie danych powinny być egzekwowane przez aplikacje, które / który uzyskują dostęp do tej bazy danych?Istnieje wiele powodów, dla których jest to zły (zły, zły ...) pomysł.
1) Jeśli budujesz silnik typu „roll-your-own” z ograniczeniem (tj. W kodzie aplikacji), to emulujesz tylko to, co wydały Oracle / SQL Server / MySQL / PostgreSQL / <. Ktokolwiek ...> lata pisania. Ich kod CONSTRAINT był przez te lata testowany przez dosłownie miliony użytkowników końcowych.
2) Z całym szacunkiem dla Ciebie i Twojego zespołu, nie zamierzamy zrobić to dobrze nawet w ciągu kilku lat - od tutaj , MySQL kod sam koszt 40 milionów dolarów. A MySQL jest najtańszym z 3 serwerów powyżej i nawet nie implementują KONTRAKTÓW KONTROLNYCH. Oczywiście uzyskanie pełnej poprawności RI (Referential Integrity) jest trudne.
Często odwiedzałem fora Oracle i nie mogę powiedzieć, ile razy jakiś biedny menedżer / programista rzucił na niego projekt, w którym geniusz, który miał swoją pracę, wpadł na „błyskotliwy” pomysł robienia tego, co sugerujesz .
Jonathan Lewis (napisał 550-stronicową książkę na temat podstaw optymalizatora Oracle ) podaje jako nie. 2 z jego Design Disasters w innej książce („ Tales of the Oak Table ” - The Oak Table to grupa ekspertów Oracle) to
3) Nawet jeśli jakimś cudem potrafisz poprawnie wdrożyć RI, będziesz musiał całkowicie go ponownie wdrożyć dla każdej aplikacji, która dotyka tej bazy danych - a jeśli twoje dane są ważne, nowe aplikacje tak. Wybór tego paradygmatu doprowadzi ciebie i twoich kolegów programistów (nie wspominając o personelu pomocniczym i sprzedaży) do życia w ciągłej walce z ogniem i nędzy.
Możesz przeczytać więcej o tym, dlaczego wdrażanie OGRANICZEŃ danych na poziomie aplikacji jest szaleństwem tutaj , tutaj i tutaj .
Aby szczegółowo odpowiedzieć na twoje pytanie:
Dlatego, że
KEY
s (alboPRIMARY
,FOREIGN
,UNIQUE
czy tylko zwykłeINDEX
ES) są uznane jest, że choć to nie jest to bezwzględnie konieczne do bazy danych, aby je za to działać, to jest absolutnie niezbędne dla nich zostać uznane za nim funkcjonować dobrze .źródło
Podczas tworzenia klucza w bazie danych silnik DBMS wymusza ograniczenie unikatowości kluczowych atrybutów. Służy to co najmniej trzem powiązanym celom:
źródło
Dodam jeden aspekt do istniejących doskonałych odpowiedzi: Dokumentację. Często ważne jest, aby zobaczyć, jakiego rodzaju kluczy możesz użyć do identyfikacji bytu. Każda kombinacja unikalnych kolumn jest kluczem kandydującym.
Klucz podstawowy wydaje się być szczególnie przydatną koncepcją w praktyce.
Niezależnie od tego, czy egzekwujesz klucz, czy nie (prawdopodobnie powinieneś) dokumentacja jest cenna sama w sobie.
źródło
FOREIGN KEY
definicje, aby uzyskać wyczuć system ”. Moje zapytanie zwróciło zip !!! Jasne, że mój SQL musiał się mylić, wspomniałem o tym jednemu ze starszych programistów. Z dumą (nie mniej) oznajmił (jakby przedstawiał nowonarodzonego syna), że system nie ma żadnych FK, ponieważ „wszystkie wyszukiwania są naPRIMARY KEY
s” - (nieistotne). <Doh ...> a la Homer Simpson!Kolejny powód, dla którego należy używać OGRANICZEŃ zamiast niektórych wewnętrznych kodów aplikacji:
Co się stanie, jeśli programista / dba użyje instrukcji insert / update / delete do modyfikacji danych bezpośrednio w bazie danych? W takim przypadku cała twoja ładna integralność referencyjna oparta na aplikacji będzie bezużyteczna. Wiem, niektórzy deweloperzy lubią możliwość bezpośredniej modyfikacji danych bez konieczności zawracania sobie głowy RI, ponieważ wiedzą, co robią - przynajmniej przez większość czasu (ale nie zawsze)
PS: Oczywiście możesz tworzyć wyzwalacze, ale zwykle są one strasznie wolne (w porównaniu do KONSTRUKCJI).
źródło