Projektując tabele, wyrobiłem sobie nawyk posiadania jednej kolumny, która jest unikalna i że tworzę klucz podstawowy. Osiąga się to na trzy sposoby w zależności od wymagań:
- Kolumna z liczbą całkowitą tożsamości, która automatycznie zwiększa.
- Unikalny identyfikator (GUID)
- Kolumna z krótkim znakiem (x) lub liczbą całkowitą (lub innym stosunkowo niewielkim typem liczbowym), która może służyć jako kolumna z identyfikatorem wiersza
Liczba 3 byłaby używana do dość małych wyszukiwań, głównie do odczytu tabel, które mogą mieć unikalny statyczny kod łańcuchowy długości lub wartość liczbową, taką jak rok lub inna liczba.
W przeważającej części wszystkie pozostałe tabele będą miały albo automatycznie zwiększającą się liczbę całkowitą, albo klucz podstawowy unikalnego identyfikatora.
Pytanie :-)
Niedawno zacząłem pracować z bazami danych, które nie mają spójnego identyfikatora wiersza, a klucze podstawowe są obecnie skupione w różnych kolumnach. Kilka przykładów:
- data / godzina
- datetime / integer
- datetime / varchar
- char / nvarchar / nvarchar
Czy jest na to uzasadniony przypadek? Dla tych przypadków zawsze zdefiniowałbym kolumnę tożsamości lub unikalnego identyfikatora.
Ponadto istnieje wiele tabel bez kluczy podstawowych. Jakie są uzasadnione powody, jeśli takie istnieją?
Próbuję zrozumieć, dlaczego stoły zostały zaprojektowane w takiej formie, w jakiej były, i wydaje mi się, że to wielki bałagan, ale może były ku temu dobre powody.
Trzecie pytanie, które może mi pomóc odszyfrować odpowiedzi: Czy w przypadku, gdy wiele kolumn zawiera złożony klucz podstawowy, czy ta metoda ma szczególną zaletę w porównaniu z kluczem zastępczym / sztucznym? Myślę głównie o wydajności, konserwacji, administracji itp.?
źródło
Odpowiedzi:
Przestrzegam kilku zasad:
W przypadku klucza zastępczego vs. klucza naturalnego odsyłam do powyższych zasad. Jeśli klucz naturalny jest mały i nigdy się nie zmieni, można go użyć jako klucza podstawowego. Jeśli klucz naturalny jest duży lub może się zmienić, używam kluczy zastępczych. Jeśli nie ma klucza podstawowego, nadal tworzę klucz zastępczy, ponieważ doświadczenie pokazuje, że zawsze dodasz tabele do schematu i żałuję, że nie umieściłeś klucza podstawowego na swoim miejscu.
źródło
Int
sSztuczne klucze wierszy naturalnych są rodzajem debaty religijnej wśród społeczności baz danych - zobacz ten artykuł i inne, do których prowadzi łącze. Nie jestem ani za zawsze posiadających klucze sztucznych, ani nigdy o nich. Zdecydowałbym się na każdy przypadek, na przykład:
Wszędzie tam, gdzie używane są klucze sztuczne, należy zawsze deklarować unikalne ograniczenia dotyczące kluczy naturalnych. Na przykład użyj state_id, jeśli musisz, ale lepiej zadeklaruj unikalne ograniczenie kodu stanu, w przeciwnym razie na pewno skończysz z:
źródło
Tylko dodatkowy komentarz do czegoś, co często jest pomijane. Czasami niestosowanie klucza zastępczego ma zalety w tabelach potomnych. Załóżmy, że mamy projekt, który umożliwia prowadzenie wielu firm w ramach jednej bazy danych (być może jest to rozwiązanie hostowane lub cokolwiek innego).
Powiedzmy, że mamy te tabele i kolumny:
Jeśli ten ostatni bit nie ma sensu,
Invoice.CompanyId
jest częścią dwóch kluczy obcych, jednego do tabeli CostCentre i jednego do tabeli CostElement . Klucz podstawowy jest ( InvoiceId , CompanyId ).W tym modelu nie można zepsuć i odwołać się do CostElement z jednej firmy i CostCentre z innej firmy. Gdyby w tabelach CostElement i CostCentre użyto klucza zastępczego , byłoby to możliwe.
Im mniej szans na zepsucie, tym lepiej.
źródło
Unikam używania kluczy naturalnych z jednego prostego powodu - błędu ludzkiego. Chociaż naturalne unikalne identyfikatory są często dostępne (SSN, VIN, numer konta itp.), Wymagają one od człowieka prawidłowego wprowadzenia ich. Jeśli używasz SSN jako klucza podstawowego, ktoś transponuje kilka liczb podczas wprowadzania danych, a błąd nie zostanie natychmiast wykryty, wówczas musisz zmierzyć się z kluczem podstawowym.
Moje podstawowe klucze są obsługiwane przez program bazy danych w tle i użytkownik nigdy ich nie zna.
źródło
Utworzenie klucza podstawowego z różnych dziedzin nie stanowi problemu, to klucz naturalny .
Możesz użyć kolumny Tożsamość (powiązanej z unikalnym indeksem w polach kandydujących), aby utworzyć klucz zastępczy .
To stara dyskusja. W większości sytuacji wolę klucze zastępcze.
Ale nie ma usprawiedliwienia dla braku klucza.
RE: EDYCJA
Tak, istnieje wiele kontrowersji na ten temat: D
Nie widzę żadnej oczywistej przewagi nad naturalnymi kluczami, poza tym, że są one naturalnym wyborem. Zawsze będziesz myśleć w Name, SocialNumber - lub coś w tym rodzaju - zamiast idPerson .
Klucze zastępcze są odpowiedzią na niektóre problemy, które mają klucze naturalne (na przykład propagowanie zmian).
Kiedy przyzwyczaisz się do surogatów, wydaje się to bardziej czyste i łatwiejsze do zarządzania.
Ale w końcu przekonasz się, że to tylko kwestia gustu - lub sposobu myślenia. Ludzie „myślą lepiej” dzięki naturalnym kluczom, a inni nie.
źródło
Tabele powinny cały czas mieć klucz podstawowy. Kiedy tak nie jest, powinny to być pola AutoIncrement.
Czasami ludzie pomijają klucz podstawowy, ponieważ przesyłają dużo danych, co może spowolnić (zależnie od bazy danych) proces. ALE, należy go dodać po nim.
Jeden komentarz na temat tabeli linków , to prawda, jest to wyjątek, ALE pola powinny być FK, aby zachować integralność, a czasami te pola mogą być kluczami podstawowymi, jeśli duplikat w linkach nie jest autoryzowany ... ale aby zachować prosta forma, ponieważ wyjątek występuje często w programowaniu, klucz podstawowy powinien być obecny, aby zachować integralność danych.
źródło
Oprócz tych wszystkich dobrych odpowiedzi, chcę tylko podzielić się dobrym artykułem, który właśnie przeczytałem, Wielka debata na temat klucza podstawowego .
Wystarczy przytoczyć kilka punktów:
Deweloper musi zastosować kilka zasad przy wyborze klucza podstawowego dla każdej tabeli:
Naturalne klucze (zwykle) łamią zasady. Klucze zastępcze są zgodne z zasadami. (Lepiej przeczytaj ten artykuł, warto poświęcić czas!)
źródło
Co jest specjalnego w kluczu podstawowym?
Jaki jest cel tabeli w schemacie? Jaki jest cel klucza stołu? Co jest specjalnego w kluczu podstawowym? Dyskusje na temat kluczy podstawowych wydają się nie uwzględniać tego, że klucz podstawowy jest częścią tabeli, a ta tabela jest częścią schematu. To, co jest najlepsze dla tabeli i relacji między tabelami, powinno kierować używanym kluczem.
Tabele (i relacje między tabelami) zawierają fakty dotyczące informacji, które chcesz zapisać. Fakty te powinny być niezależne, znaczące, łatwe do zrozumienia i niesprzeczne. Z perspektywy projektowania inne tabele dodane lub usunięte ze schematu nie powinny wpływać na tabelę. Musi istnieć cel przechowywania danych związanych tylko z samą informacją. Zrozumienie tego, co jest przechowywane w tabeli, nie powinno wymagać poddania się projektowi badań naukowych. Żaden fakt przechowywany w tym samym celu nie powinien być przechowywany więcej niż jeden raz. Klucze to całość lub część zapisywanych informacji, która jest unikalna, a klucz podstawowy to specjalnie wyznaczony klucz, który ma być głównym punktem dostępu do tabeli (tzn. Powinien zostać wybrany ze względu na spójność i wykorzystanie danych, a nie tylko wstawianie występ).
Mówiono, że klucze podstawowe powinny być tak małe, jak to konieczne. Powiedziałbym, że klucze powinny być tak duże, jak to konieczne. Należy unikać losowego dodawania nieistotnych pól do tabeli. Jeszcze gorzej jest zrobić klucz z losowo dodanego, pozbawionego znaczenia pola, szczególnie gdy niszczy zależność łączenia z innej tabeli do klucza innego niż podstawowy. Jest to uzasadnione tylko wtedy, gdy nie ma dobrych kluczy kandydujących w tabeli, ale to z pewnością jest oznaką złego projektu schematu, jeśli jest stosowane we wszystkich tabelach.
Mówiono również, że klucze podstawowe nigdy nie powinny się zmieniać, ponieważ aktualizacja klucza podstawowego zawsze powinna być wykluczona. Ale aktualizacja jest taka sama jak usuwanie, a następnie wstawianie. Zgodnie z tą logiką nigdy nie należy usuwać rekordu z tabeli za pomocą jednego klucza, a następnie dodawać kolejny rekord za pomocą drugiego klucza. Dodanie zastępczego klucza podstawowego nie usuwa faktu, że istnieje inny klucz w tabeli. Aktualizacja klucza innego niż podstawowy tabeli może zniszczyć znaczenie danych, jeśli inne tabele mają zależność od tego znaczenia za pomocą klucza zastępczego (np. Tabela statusu z kluczem zastępczym, którego opis statusu został zmieniony z „Przetworzone” na „Anulowane” „zdecydowanie uszkodziłoby dane). To, co zawsze powinno być wykluczone, to niszczenie znaczenia danych.
Powiedziawszy to, jestem wdzięczny za wiele źle zaprojektowanych baz danych, które istnieją w dzisiejszych firmach (behemoty pozbawione znaczenia-zastępcze-dane-uszkodzone-1NF), ponieważ oznacza to, że ludzie, którzy rozumieją odpowiedni projekt bazy danych, mają nieskończoną ilość pracy. . Ale ze smutnej strony, czasami sprawia, że czuję się jak Syzyf, ale założę się, że miał jeden 401k (przed katastrofą). Trzymaj się z dala od blogów i stron internetowych w przypadku ważnych pytań dotyczących projektowania baz danych. Jeśli projektujesz bazy danych, wyszukaj Data CJ. Możesz także odwoływać się do Celko dla SQL Server, ale tylko jeśli najpierw trzymasz nos. Po stronie Oracle odwołaj się do Tom Kyte.
źródło
Naturalny klucz, jeśli jest dostępny, jest zwykle najlepszy. Tak więc, jeśli datetime / char jednoznacznie identyfikuje wiersz, a obie części mają znaczenie dla wiersza, to świetnie.
Jeśli tylko data i godzina są znaczące, a znak charak- teryzowany jest tak, aby uczynić go unikalnym, to równie dobrze możesz po prostu użyć pola identyfikującego.
źródło
Oto moja własna zasada, na którą zdecydowałem się po ponad 25 latach doświadczenia w programowaniu.
Klucz podstawowy jest używany przez bazę danych do celów optymalizacji i nie powinien być wykorzystywany przez aplikację do niczego więcej niż do identyfikacji konkretnego podmiotu lub odnoszącego się do konkretnego podmiotu.
Zawsze posiadanie klucza podstawowego o pojedynczej wartości sprawia, że wykonywanie UPSERT jest bardzo proste.
Użyj dodatkowych indeksów do obsługi kluczy wielokolumnowych, które mają znaczenie w Twojej aplikacji.
źródło
Dla mnie klucze naturalne a sztuczne to kwestia tego, ile logiki biznesowej chcesz w swojej bazie danych. Doskonały przykład to numer ubezpieczenia społecznego (SSN).
„Każdy klient w mojej bazie danych ma i musi mieć SSN”. Bam, gotowe, uczyń to kluczem podstawowym i gotowe. Pamiętaj tylko, że kiedy zmieniają się reguły biznesowe, jesteś spalony.
Nie lubię naturalnych kluczy, ponieważ mam doświadczenie w zmienianiu reguł biznesowych. Ale jeśli jesteś pewien, że się nie zmieni, może to uniemożliwić kilka krytycznych połączeń.
źródło
Podejrzewam, że zwinięta gazeta Stevena A. Lowe'a jest wymagana od projektanta oryginalnej struktury danych.
Nawiasem mówiąc , identyfikatory GUID jako klucz podstawowy mogą być świnią wydajności. Nie poleciłbym tego.
źródło
Należy użyć klucza podstawowego „złożony” lub „złożony”, który składa się z wielu pól.
Jest to całkowicie akceptowalne rozwiązanie, przejdź tutaj, aby uzyskać więcej informacji :)
źródło
Ja też zawsze używam numerycznej kolumny identyfikacyjnej. W wyroczni używam liczby (18,0) bez żadnego rzeczywistego powodu powyżej liczby (12,0) (lub cokolwiek, co jest liczbą całkowitą zamiast długiej), może po prostu nie chcę się martwić o uzyskanie kilku miliardów wierszy w db!
Dołączam również utworzoną i zmodyfikowaną kolumnę (znacznik czasu typu) do podstawowego śledzenia, gdzie wydaje się to przydatne.
Nie mam nic przeciwko tworzeniu unikalnych ograniczeń dla innych kombinacji kolumn, ale naprawdę podoba mi się mój identyfikator, utworzone, zmodyfikowane wymagania linii bazowej.
źródło
Poszukuję naturalnych kluczy podstawowych i używam ich tam, gdzie mogę.
Jeśli nie można znaleźć żadnych kluczy naturalnych, wolę GUID niż INT ++, ponieważ SQL Server używa drzew i źle jest zawsze dodawać klucze na końcu w drzewach.
W tabelach, które są połączeniami wiele do wielu, używam złożonego klucza podstawowego kluczy obcych.
Ponieważ mam szczęście korzystać z programu SQL Server, mogę analizować plany wykonania i statystyki za pomocą profilera i analizatora zapytań oraz dowiedzieć się, jak bardzo działają moje klucze.
źródło
Zawsze używam automatycznego numeru lub pola tożsamości.
Pracowałem dla klienta, który użył SSN jako klucza podstawowego, a następnie z powodu przepisów HIPAA został zmuszony do zmiany na „MemberID”, co spowodowało mnóstwo problemów podczas aktualizacji kluczy obcych w powiązanych tabelach. Trzymanie się spójnego standardu kolumny tożsamości pomogło mi uniknąć podobnego problemu we wszystkich moich projektach.
źródło
Wszystkie tabele powinny mieć klucz podstawowy. W przeciwnym razie masz HEAP - w niektórych sytuacjach może to być to, czego potrzebujesz (duże obciążenie wstawiania, gdy dane są następnie replikowane za pośrednictwem brokera usług do innej bazy danych lub tabeli).
W przypadku tabel wyszukiwania z małą liczbą wierszy można użyć kodu 3 CHAR jako klucza podstawowego, ponieważ zajmuje to mniej miejsca niż INT, ale różnica w wydajności jest znikoma. Poza tym zawsze używałbym INT, chyba że masz tabelę referencyjną, która być może ma złożony klucz podstawowy złożony z kluczy obcych z powiązanych tabel.
źródło
Jeśli naprawdę chcesz przeczytać całą tę i z powrotem tę odwieczną debatę, poszukaj „naturalnego klucza” w przepełnieniu stosu. Powinieneś odzyskać strony wyników.
źródło
Identyfikatory GUID mogą być używane jako klucz podstawowy, ale musisz utworzyć odpowiedni typ identyfikatora GUID, aby działał dobrze.
Musisz wygenerować identyfikatory GUI COMB. Dobry artykuł na ten temat i statystyki wydajności to Koszt identyfikatorów GUID jako kluczy podstawowych .
Również część kodu do budowania identyfikatorów GUI COMB w SQL znajduje się w Uniqueidentifier vs. tożsamości ( archiwum ) .
źródło
Wykonujemy wiele sprzężeń, a złożone klucze podstawowe właśnie stały się świnią wydajności. Prosta int lub długa rozwiązuje wiele problemów, nawet jeśli wprowadzasz drugi klucz kandydata, ale dołączenie do jednej dziedziny jest łatwiejsze i bardziej zrozumiałe.
źródło
Będę z góry poinformowany o moich preferencjach dotyczących kluczy naturalnych - używaj ich tam, gdzie to możliwe, ponieważ znacznie ułatwią Ci administrowanie bazą danych. W naszej firmie ustaliłem, że wszystkie tabele mają następujące kolumny:
SUSER_SNAME()
w T-SQL))Identyfikator wiersza ma unikatowy klucz na tabelę, a w każdym przypadku jest generowany automatycznie dla wiersza (a uprawnienia uniemożliwiają każdemu edytowanie go) i można zagwarantować, że będzie unikalny we wszystkich tabelach i bazach danych. Jeśli którykolwiek system ORM potrzebuje jednego klucza identyfikacyjnego, należy go użyć.
Tymczasem faktyczny PK jest, jeśli to możliwe, naturalnym kluczem. Moje wewnętrzne zasady są jak:
EventId, AttendeeId
)Idealnym rozwiązaniem jest zatem posiadanie naturalnego, czytelnego dla człowieka i zapadającego w pamięć PK oraz przyjaznego dla ORM identyfikatora GUID z jednym identyfikatorem na stół.
Uwaga: bazy danych, które prowadzę, mają tendencję do gromadzenia 100 000 rekordów, a nie milionów czy miliardów, więc jeśli masz doświadczenie z większymi systemami, które są przeciwwskazane dla mojej rady, możesz mnie zignorować!
źródło
GUID
iINT
SK dla tabel bez silnego naturalnego klucza?