Znowu zaczynamy, stary argument wciąż się pojawia ...
Czy lepiej byłoby mieć klucz biznesowy jako klucz podstawowy, czy też wolelibyśmy mieć identyfikator zastępczy (tj. Tożsamość SQL Server) z unikalnym ograniczeniem w polu klucza biznesowego?
Proszę podać przykłady lub dowody na poparcie swojej teorii.
database
database-design
primary-key
key
Manrico Corazzi
źródło
źródło
Odpowiedzi:
Obie. Zjedz ciasto i zjedz je.
Pamiętaj, że nie ma nic specjalnego w kluczu podstawowym, poza tym, że jest oznaczony jako taki. To nic innego jak ograniczenie NOT NULL UNIQUE, a tabela może mieć więcej niż jedno.
Jeśli używasz klucza zastępczego, nadal potrzebujesz klucza biznesowego, aby zapewnić unikalność zgodnie z regułami biznesowymi.
źródło
Tylko kilka powodów, dla których warto używać kluczy zastępczych:
Stabilność : zmiana klucza ze względu na potrzebę biznesową lub naturalną wpłynie negatywnie na powiązane tabele. Klucze zastępcze rzadko, jeśli w ogóle, wymagają zmiany, ponieważ nie ma znaczenia związanego z wartością.
Konwencja : pozwala ci mieć znormalizowaną konwencję nazewnictwa kolumn klucza podstawowego, zamiast myśleć o tym, jak łączyć tabele z różnymi nazwami ich PK.
Szybkość : w zależności od wartości PK i typu, zastępczy klucz liczby całkowitej może być mniejszy, szybszy do indeksowania i wyszukiwania.
źródło
Wygląda na to, że nikt jeszcze nie powiedział nic na poparcie nie-zastępczych (waham się powiedzieć „naturalne”) kluczy. Więc oto idzie ...
Wadą kluczy zastępczych jest to, że są one bez znaczenia (cytowany jako zaletę niektóre, ale ...). To czasami zmusza Cię do dołączenia do zapytania znacznie większej liczby tabel, niż powinno być naprawdę konieczne. Porównać:
przeciwko:
Chyba że ktoś poważnie uważa, że to dobry pomysł ?:
„Ale” ktoś powie, „co się stanie, gdy zmieni się kod MYPROJECT, VALID lub HR?” Do którego moja odpowiedź będzie: „dlaczego chcesz trzeba to zmienić?” Nie są to „naturalne” klucze w tym sensie, że jakiś zewnętrzny organ będzie stanowił prawo, zgodnie z którym „WAŻNY” powinien być ponownie zakodowany jako „DOBRY”. Tylko niewielki procent „naturalnych” kluczy naprawdę mieści się w tej kategorii - typowe przykłady to SSN i kod pocztowy. Zdecydowanie użyłbym bezsensownego klucza numerycznego do tabel takich jak Osoba, Adres - ale nie do wszystkiego , co z jakiegoś powodu większość ludzi wydaje się popierać.
Zobacz także: moja odpowiedź na inne pytanie
źródło
Klucz zastępczy NIGDY nie będzie miał powodu do zmiany. Nie mogę powiedzieć tego samego o klawiszach naturalnych. Nazwiska, e-maile, numery ISBN - to wszystko może się kiedyś zmienić.
źródło
Klucze zastępcze (zwykle liczby całkowite) mają tę wartość dodaną, że sprawiają, że relacje między tabelami są szybsze i bardziej ekonomiczne w przechowywaniu i aktualizowaniu (jeszcze lepiej, klucze obce nie muszą być aktualizowane podczas korzystania z kluczy zastępczych, w przeciwieństwie do pól kluczy biznesowych, to się zmienia od czasu do czasu).
Klucz podstawowy tabeli powinien być używany do jednoznacznej identyfikacji wiersza, głównie do celów łączenia. Pomyśl o tabeli Osoby: imiona mogą się zmieniać i nie gwarantuje się ich niepowtarzalności.
Think Companies: jesteś szczęśliwą firmą Merkin, prowadzącą interesy z innymi firmami w Merkia. Jesteś wystarczająco sprytny, aby nie używać nazwy firmy jako klucza głównego, więc używasz unikalnego identyfikatora firmy Merkia, składającego się w całości z 10 znaków alfanumerycznych. Następnie Merkia zmienia identyfikatory firm, ponieważ uznała, że to dobry pomysł. W porządku, używasz funkcji kaskadowych aktualizacji silnika db, aby zmienić, który nie powinien Cię w ogóle angażować. Później Twoja firma się rozwija, a teraz pracujesz w firmie we Freedonii. Freedoński identyfikator firmy może mieć maksymalnie 16 znaków. Musisz powiększyć klucz podstawowy identyfikatora firmy (także pola kluczy obcych w zamówieniach, problemach, przelewach itp.), Dodając pole Kraj w kluczu podstawowym (również w kluczach obcych). Auć! Wojna domowa we Freedonii, to są podzielone na trzy kraje. Nazwę kraju Twojego współpracownika należy zmienić na nową; kaskadowe aktualizacje na ratunek. BTW, jaki jest twój klucz podstawowy? (Kraj, CompanyID) czy (CompanyID, Country)? Ta ostatnia pomaga w dołączaniu, ta pierwsza pozwala uniknąć innego indeksu (a może wielu, jeśli chcesz, aby Twoje zamówienia były również pogrupowane według krajów).
Wszystko to nie jest dowodem, ale wskazaniem, że klucz zastępczy do jednoznacznej identyfikacji wiersza dla wszystkich zastosowań, w tym operacji łączenia, jest lepszy niż klucz biznesowy.
źródło
Generalnie nienawidzę kluczy zastępczych. Powinny być używane tylko wtedy, gdy nie ma dostępnego naturalnego klucza wysokiej jakości. Myśląc o tym, wydaje się raczej absurdalne, że dodanie bezsensownych danych do tabeli może polepszyć sytuację.
Oto moje powody:
Podczas korzystania z kluczy naturalnych tabele są grupowane w taki sposób, w jaki są najczęściej przeszukiwane, co przyspiesza zapytania.
Korzystając z kluczy zastępczych, należy dodać unikalne indeksy do kolumn kluczy logicznych. Nadal musisz zapobiegać logicznemu duplikowaniu danych. Na przykład nie możesz zezwolić dwóm organizacjom o tej samej nazwie w tabeli Organizacja, mimo że pk jest kolumną zastępczego identyfikatora.
Gdy klucze zastępcze są używane jako klucz podstawowy, znacznie mniej jasne jest, jakie są naturalne klucze podstawowe. Podczas programowania chcesz wiedzieć, jaki zestaw kolumn sprawia, że tabela jest wyjątkowa.
W jednym do wielu łańcuchów relacji logiczne łańcuchy kluczy. Na przykład organizacje mają wiele kont, a konta mają wiele faktur. Zatem klucz logiczny organizacji to nazwa organizacji. Klucz logiczny kont to nazwa organizacji, identyfikator konta. Klucz logiczny faktury to nazwa organizacji, identyfikator konta, numer faktury.
Kiedy używane są klucze zastępcze, łańcuchy kluczy są obcinane tylko przez posiadanie klucza obcego tylko dla bezpośredniego nadrzędnego. Na przykład tabela faktur nie ma kolumny OrgName. Ma tylko kolumnę dla AccountID. Jeśli chcesz wyszukiwać faktury dla danej organizacji, będziesz musiał dołączyć do tabel Organizacja, Konto i Faktury. Jeśli używasz kluczy logicznych, możesz bezpośrednio wysłać zapytanie do tabeli Organizacja.
Przechowywanie zastępczych wartości kluczy tabel przeglądowych powoduje, że tabele są wypełniane bezsensownymi liczbami całkowitymi. Aby wyświetlić dane, należy utworzyć złożone widoki, które łączą się ze wszystkimi tabelami przeglądowymi. Tabela przeglądowa jest przeznaczona do przechowywania zestawu dopuszczalnych wartości dla kolumny. Nie należy go kodyfikować przez przechowywanie zamiast tego klucza zastępczego w postaci liczby całkowitej. W zasadach normalizacji nie ma nic, co sugerowałoby, że zamiast samej wartości należy przechowywać zastępczą liczbę całkowitą.
Mam trzy różne książki z bazą danych. Żaden z nich nie używa kluczy zastępczych.
źródło
Chcę podzielić się z wami moim doświadczeniem w tej niekończącej się wojnie: D dotyczącej dylematu naturalnego i zastępczego. Myślę, że zarówno klucze zastępcze (sztuczne generowane automatycznie), jak i klucze naturalne (złożone z kolumn o znaczeniu domenowym) mają wady i zalety . Dlatego w zależności od sytuacji bardziej odpowiedni może być wybór jednej lub drugiej metody.
Ponieważ wydaje się, że wiele osób przedstawia klucze zastępcze jako rozwiązanie niemal doskonałe, a klucze naturalne jako plagę, skupię się na argumentach z innego punktu widzenia:
Wady kluczy zastępczych
Klucze zastępcze to:
Mity na temat kluczy naturalnych
Wniosek
Używaj kluczy naturalnych, gdy jest to konieczne, i kluczy zastępczych, gdy lepiej ich używać.
Mam nadzieję, że to komuś pomogło!
źródło
Zawsze używaj klucza, który nie ma znaczenia biznesowego. To po prostu dobra praktyka.
EDYCJA: Próbowałem znaleźć link do tego w Internecie, ale nie mogłem. Jednak w „Patterns of Enterprise Archtecture” [Fowler] zawiera dobre wyjaśnienie, dlaczego nie należy używać niczego innego niż klucza, który nie ma żadnego innego znaczenia niż bycie kluczem. Sprowadza się to do tego, że powinna mieć jedną pracę i tylko jedną pracę.
źródło
Klucze zastępcze są bardzo przydatne, jeśli planujesz używać narzędzia ORM do obsługi / generowania klas danych. Chociaż możesz używać kluczy złożonych z niektórymi bardziej zaawansowanymi programami mapującymi (czytaj: hibernuj), dodaje to nieco złożoności do twojego kodu.
(Oczywiście puryści baz danych będą argumentować, że nawet pojęcie zastępczego klucza jest obrzydliwością).
Jestem fanem używania uidów do kluczy zastępczych, gdy jest to odpowiednie. Główną wygraną z nimi jest to, że znasz klucz z wyprzedzeniem, np. Możesz utworzyć instancję klasy z już ustawionym identyfikatorem i gwarantowaną unikalnością, podczas gdy z, powiedzmy, kluczem całkowitoliczbowym musisz domyślnie ustawić 0 lub - 1 i zaktualizuj do odpowiedniej wartości podczas zapisywania / aktualizacji.
Identyfikatory UID mają jednak określone kary w zakresie szybkości wyszukiwania i łączenia, więc zależy to od danej aplikacji, czy są one pożądane.
źródło
Użycie klucza zastępczego jest moim zdaniem lepsze, ponieważ nie ma szans na jego zmianę. Prawie wszystko, co przychodzi mi do głowy, czego mógłbyś użyć jako naturalnego klucza, może się zmienić (zastrzeżenie: nie zawsze prawdziwe, ale często).
Przykładem może być DB samochodów - na pierwszy rzut oka można by pomyśleć, że jako klucza można by użyć tablicy rejestracyjnej. Ale można to zmienić, więc byłby to zły pomysł. Naprawdę nie chciałbyś się tego dowiedzieć po wydaniu aplikacji, gdy ktoś przychodzi do ciebie, chcąc wiedzieć, dlaczego nie może zmienić swojej tablicy rejestracyjnej na nową, błyszczącą, spersonalizowaną.
źródło
languages
tabeli, ponieważ kod języka (ID) jest już wtexts
tabeli.Zawsze używaj pojedynczej kolumny i klucza zastępczego, jeśli to możliwe. Dzięki temu łączenia, a także wstawianie / aktualizowanie / usuwanie są znacznie bardziej przejrzyste, ponieważ jesteś odpowiedzialny tylko za śledzenie pojedynczej informacji w celu utrzymania rekordu.
Następnie, w razie potrzeby, ułóż klucze biznesowe jako unikalne ograniczenia lub indeksy. Zapewni to integralność danych.
Logika biznesowa / klucze naturalne mogą się zmieniać, ale klucz fizyczny tabeli NIGDY nie powinien się zmieniać.
źródło
Uważam, że w scenariuszu z magazynem danych lepiej jest podążać ścieżką klucza zastępczego. Dwa powody:
źródło
Klucze zastępcze mogą być przydatne, gdy informacje biznesowe mogą ulec zmianie lub być identyczne. W końcu nazwy firm nie muszą być unikalne w całym kraju. Załóżmy, że masz do czynienia z dwiema firmami o nazwie Smith Electronics, jedną w Kansas i jedną w Michigan. Możesz je rozróżnić po adresie, ale to się zmieni. Nawet stan może się zmienić; co, jeśli Smith Electronics z Kansas City w Kansas przeniosła się przez rzekę do Kansas City w stanie Missouri? Nie ma oczywistego sposobu na odróżnienie tych biznesów za pomocą naturalnych informacji kluczowych, więc klucz zastępczy jest bardzo przydatny.
Pomyśl o zastępczym kluczu jak o numerze ISBN. Zazwyczaj identyfikuje się książkę według tytułu i autora. Jednak mam dwie książki zatytułowane „Pearl Harbor” autorstwa HP Willmott i są to zdecydowanie różne książki, a nie tylko różne wydania. W takim przypadku mógłbym odnieść się do wyglądu książek lub wcześniejszego kontra późniejszego, ale dobrze, że mam numer ISBN, na którym mogę się oprzeć.
źródło
Przypominamy, że nie jest dobrą praktyką umieszczanie indeksów klastrowych na losowych kluczach zastępczych, tj. Identyfikatorach GUID, które odczytują XY8D7-DFD8S, ponieważ SQL Server nie ma możliwości fizycznego sortowania tych danych. Zamiast tego należy umieścić unikalne indeksy w tych danych, chociaż może być również korzystne uruchomienie profilera SQL dla operacji na głównej tabeli, a następnie umieszczenie tych danych w Doradcy dostrajania aparatu bazy danych.
Zobacz wątek @ http://social.msdn.microsoft.com/Forums/en-us/sqlgetstarted/thread/27bd9c77-ec31-44f1-ab7f-bd2cb13129be
źródło
Przypadek 1: Twoja tabela jest tabelą przeglądową z mniej niż 50 typami (wstawkami)
Użyj kluczy biznesowych / naturalnych . Na przykład:
Przypadek 2: Twój stół to stół z tysiącami wkładek
Użyj kluczy zastępczych / automatycznych . Na przykład:
W pierwszym przypadku:
W drugim przypadku:
źródło
Jest to jeden z tych przypadków, w których klucz zastępczy prawie zawsze ma sens. Są przypadki, w których wybierasz to, co jest najlepsze dla bazy danych lub to, co jest najlepsze dla modelu obiektów, ale w obu przypadkach lepszym pomysłem jest użycie bezsensownego klucza lub identyfikatora GUID. To sprawia, że indeksowanie jest łatwiejsze i szybsze, a tożsamość obiektu nie ulega zmianie.
źródło
Koń na kursy. Aby wyrazić moją stronniczość; Najpierw jestem programistą, więc głównie zależy mi na tym, aby dać użytkownikom działającą aplikację.
Pracowałem nad systemami z naturalnymi kluczami i musiałem spędzać dużo czasu, upewniając się, że zmiany wartości będą widoczne.
Pracowałem na systemach z tylko kluczami zastępczymi, a jedyną wadą był brak zdenormalizowanych danych do partycjonowania.
Większość tradycyjnych programistów PL / SQL, z którymi pracowałem, nie lubiła kluczy zastępczych ze względu na liczbę tabel na złączenie, ale nasze testowe i produkcyjne bazy danych nigdy nie wzbudziły wysiłku; dodatkowe łączenia nie wpłynęły na wydajność aplikacji. W przypadku dialektów bazy danych, które nie obsługują klauzul, takich jak „X wewnętrzne sprzężenie Y na Xa = Yb”, lub deweloperów, którzy nie używają tej składni, dodatkowe łączenia dla kluczy zastępczych sprawiają, że zapytania są trudniejsze do odczytania i dłuższe wpisywanie i sprawdź: zobacz post @Tony Andrews. Ale jeśli używasz ORM lub jakiejkolwiek innej struktury generującej SQL, nie zauważysz tego. Pisanie bezwzrokowe również łagodzi.
źródło
Może nie do końca dotyczy tego tematu, ale ból głowy mam do czynienia z kluczami zastępczymi. Wstępnie dostarczone narzędzia analityczne Oracle tworzą automatycznie generowane SK na wszystkich swoich tabelach wymiarów w magazynie, a także przechowują je jako fakty. Tak więc za każdym razem, gdy trzeba je (wymiary) ponownie załadować, ponieważ nowe kolumny są dodawane lub muszą być wypełnione dla wszystkich elementów w wymiarze, SK przypisane podczas aktualizacji powodują, że SK nie są zsynchronizowane z oryginalnymi wartościami zapisanymi w rzeczywistości, wymuszając całkowite przeładowanie wszystkich dołączonych do niego tabel faktów. Wolałbym, żeby nawet jeśli SK była liczbą bez znaczenia, byłby jakiś sposób, aby nie mogła się zmienić dla oryginalnych / starych płyt. Jak wielu wie, gotowe rozwiązania rzadko spełniają potrzeby organizacji i musimy stale je dostosowywać. Mamy teraz dane z 3 lat w naszej hurtowni, a pełne doładowania z systemów Oracle Financial są bardzo duże. Więc w moim przypadku nie są one generowane na podstawie wprowadzania danych, ale dodawane w hurtowni, aby pomóc w raportowaniu wydajności. Rozumiem, ale nasze się zmieniają i to jest koszmar.
źródło
W przypadku bazy danych punktu w czasie najlepiej jest mieć kombinację kluczy zastępczych i naturalnych. np. musisz śledzić informacje o członkach klubu. Niektóre cechy członka nigdy się nie zmieniają. np. data urodzenia, ale nazwisko może ulec zmianie. Stwórz więc tabelę Member z zastępczym kluczem member_id i miej kolumnę dla DOB. Utwórz kolejną tabelę o nazwie imię i nazwisko osoby i miej kolumny dla id_członka, nazwa_członka, nazwa_członka, data_updated. W tej tabeli naturalnym kluczem byłby identyfikator_członka + data_updated.
źródło