2011-02-10 16 views
5

Powiel możliwe:
Relational database design question - Surrogate-key or Natural-key?SQL: kolumna klucza głównego. Sztuczne „id” column vs „naturalne” kolumny

Kiedy tworzę relacyjnej tabeli istnieje pokusa, aby wybrać podstawową kolumnę klucza kolumnę, które wartości są unikalne . Ale dla celów optymalizacji i jednolitości za każdym razem tworzę sztuczną kolumnę Id. Jeśli istnieje kolumna (lub kombinacja kolumn), która powinna być unikatowa, utworzę dla niej Unikalny indeks, zamiast oznaczać je jako (złożone) kolumny klucza podstawowego.

Czy to naprawdę dobra praktyka, aby zawsze preferować sztuczną kolumnę "Id" i indeksy zamiast naturalnych kolumn klucza podstawowego?

+1

Czasami bardzo trudno jest zidentyfikować odpowiedź - wszystkie są tak dobre :) –

+0

Tak, są, zgadzam się. =) A sposób, w jaki działa SO, to głosowanie i zaakceptowana odpowiedź. Bądź dobrym sędzią i wybierz ten, który jest bardziej kompletny. Zajmij miejsce dla początkujących i przeczytaj je, a następnie postaraj się dowiedzieć, jakiej odpowiedzi nauczyłeś się najbardziej. Nikt nie będzie na ciebie zły! ;-) Ponadto, ludzie będą szczęśliwi, starając się pomóc, odpowiadając na pytania, gdy mają większe szanse na podniesienie swojej reputacji (gdy tylko na to zasłużyli). Uważaj i życzymy miłego dnia/nocy! =) –

Odpowiedz

5

To trochę religijna debata. Moje osobiste preferencje to posiadanie syntetycznych kluczy podstawowych, a nie naturalnych kluczy podstawowych, ale istnieją dobre argumenty po obu stronach. Realistycznie, o ile jesteś konsekwentny i rozsądny, każde z tych podejść może działać dobrze.

Jeśli używasz kluczy naturalnych, dwa główne wady to obecność kluczy złożonych i mutowanie wartości klucza podstawowego.Jeśli masz złożone klucze główne, oczywiście musisz mieć wiele kolumn w każdej tabeli podrzędnej. To może stać się nieporęczne z perspektywy modelu danych, gdy istnieje wiele relacji między podmiotami. Ale może to również wywoływać żal dla osób, które opracowują zapytania - niezwykle łatwo tworzyć zapytania, które wykorzystują warunki N-1 N dołączenia i uzyskać prawie poprawny wynik. Jeśli masz naturalne klucze, nieuchronnie natkniesz się na sytuację, w której wartość klucza naturalnego zmienia się, a następnie musisz wprowadzić zmiany w wielu różnych jednostkach - to znacznie bardziej skomplikowane niż zmiana unikalnej wartości w tabeli.

Z drugiej strony, jeśli używasz kluczy syntetycznych, marnujesz przestrzeń, dodając dodatkowe kolumny, dodając dodatkowe obciążenie, aby utrzymać dodatkowy indeks, i zwiększasz ryzyko, że uzyskasz funkcjonalnie powielone wyniki. Bardzo łatwo jest zapomnieć o utworzeniu unikalnego ograniczenia na kluczu biznesowym lub sprawdzić, czy istnieje nieunikalny indeks w połączeniu i po prostu założyć, że był to unikalny indeks. Właśnie zostałem ugryziony przez to szczególne niepowodzenie kilka dni temu - zindeksowałem złożony klucz naturalny (z nieunikalnym indeksem) zamiast tworzyć unikalne ograniczenie. Głupi błąd, ale stosunkowo łatwy do wykonania.

Z punktu widzenia pisania i nazywania konwencji, wolałbym również preferować klucze syntetyczne, ponieważ dobrze jest wiedzieć, kiedy dołączasz do tabel, których kluczem podstawowym A jest A_ID, a klucz podstawowy B jest będzie B_ID. To o wiele bardziej samo-dokumentowanie niż próba zapamiętania, że ​​kluczem podstawowym A jest kombinacja A_NAME i A_REVISION_NUMBER, a kluczem podstawowym B jest B_CODE.

0

Tak, jest. Jeśli nic więcej, jedną z najważniejszych właściwości sztucznego klucza podstawowego jest nieprzezroczystość, co oznacza, że ​​sztuczny klucz nie odzwierciedla żadnych informacji poza nim; Jeśli użyjesz naturalnej zawartości wiersza dla kluczy, skończysz eksponowanie tych informacji na takie rzeczy jak interfejsy sieciowe, co jest po prostu okropnym pomysłem na wszystkie sposoby.

+0

Odsłaniając sensowne klucze nie jest taki straszny pomysł! Użytkownicy zwykle potrzebują tych naturalnych kluczy, aby zidentyfikować w świecie zewnętrznym rzeczy, które powinna przechowywać baza danych. Udostępnianie kluczy w interfejsie użytkownika jest tylko nieuniknioną konsekwencją dokładnego przedstawiania informacji i reguł biznesowych. – sqlvogel

1

Ja wolę zawsze używać sztucznego klucza.

Po pierwsze jest spójny. Każdy, kto pracuje nad twoją aplikacją, wie, że istnieje klucz i mogą na nim założyć. Ułatwia to zrozumienie i utrzymanie.

Widziałem również scenariusze, w których klucz naturalny (znany również jako ciąg znaków z systemu HR, który identyfikuje pracownika) musi się zmienić w trakcie trwania aplikacji. Jeśli masz sztuczny klucz, który łączy naturalny identyfikator z rekordem pracownika, musisz tylko zmienić ten naturalny identyfikator w jednej tabeli. Jeśli jednak ten naturalny identyfikator jest kluczem podstawowym i masz go zduplikowany w wielu innych tabelach jako klucz obcy, masz bałagan na rękach.

1

Moim skromnym zdaniem zawsze lepiej jest mieć sztuczny Id, jeśli dobrze rozumiem, co to znaczy.

Niektóre osoby użyłyby na przykład ważnych unikatowych wartości biznesowych jako identyfikatora tabeli, a ja już czytałem w witrynie MSDN, a nawet w oficjalnej dokumentacji NHibernate, że preferowana jest unikalna wartość bez znaczenia biznesowego (sztuczny identyfikator), chociaż chcesz utworzyć indeks dla tej wartości, aby można go było wykorzystać w przyszłości. Tak więc, w dniu, w którym firma zmieni nazewnictwo, system będzie działał bez zarzutu.

2

To zależy od twoich naturalnych kolumn. Jeśli są małe i stale rosną, to są dobrymi kandydatami do klucza podstawowego.

  • Small - im mniejsza jest klucz, tym więcej wartości można uzyskać w jednym rzędzie, i tym szybciej skanuje indeks zostanie
  • Stale wzrasta - wytwarza mniej roszady Index jako tabela rośnie, zwiększając wydajność.
2

Występuje niewielka lub żadna różnica między kluczem wymuszonym przez ograniczenie klucza PRIMARY a kluczem egzekwowanym przez ograniczenie UNIQUE. Ważne jest, aby wymusić WSZYSTKIE klucze wymagane z perspektywy integralności danych. Zwykle oznacza to co najmniej jeden "naturalny" klucz (klucz wystawiony użytkownikom/konsumentom danych i wykorzystywany do identyfikacji faktów dotyczących wszechświata dyskursu) na stół.

Opcjonalnie możesz również utworzyć klucze "techniczne", aby obsługiwać funkcje aplikacji i bazy danych, a nie użytkownika końcowego (zwykle nazywane kluczami zastępczymi). To powinno być jednak bardzo drugorzędne. W interesie prostoty (i często także wydajności) zazwyczaj ma sens jedynie tworzenie zastępczych kluczy, w których zidentyfikowano konkretną potrzebę ich posiadania, a nie wcześniej.

Powiązane problemy