Jest tu wiele kompromisów. Właściwie często używam kluczy łańcuchowych, ale często dołączam zastępcze klucze zastępcze dla złączeń (oczywiście byłoby odwrotnie, gdybym używał MySQL). Są jednak przypadki, w których ja tego nie robię.
Po pierwsze jestem fanem deklarowania kluczy naturalnych jako klucza podstawowego, gdzie db może sobie z tym poradzić (na przykład PostgreSQL). Pomaga to w normalizacji i zapewnia bardziej przejrzysty projekt bazy danych. Klawisze zastępcze ułatwiają łączenie.
Są dwa powody, dla których zwykle dodam klucze zastępcze:
Nie zawsze jest jasne, czym jest naturalny klucz. Czasami trzeba je zmienić. Zmiana naturalnego, złożonego klucza, gdy jest on używany do łączenia i integralności referencyjnej, jest skomplikowana i podatna na błędy.
Łączenie wydajności na klawiszach kompozytowych jest problematyczne i kiedy pójdziesz naturalną trasą klucza, utkniesz tam.
Jednak w przypadkach, gdy klucz naturalny jest definicją, pojedynczą kolumną i tekstem, zwykle dołączam klucz ciągowy. Moim powodem jest to, że często unika się łączenia podczas wyszukiwania. Najczęstszym zastosowaniem jest zapewnienie odpowiedniego projektu db wokół przypadku użycia typów wyliczeniowych. W większości przypadków nie wymagają one dodatkowego łączenia w przypadku rutynowych zapytań. W takim przypadku klucze łańcuchowe jako klawisze łączenia mają więc sens.
Na przykład w LedgerSMB przechowujemy kategoryzacje kont. Są one identyfikowane przez odwołanie do ciągu. A niektóre inne dane są przechowywane z odwołaniem do ciągu, który służy do egzekwowania reguł dotyczących kombinacji kategoryzacji, które mogą mieć wpływ na konto. Logika jest potrzebna tylko przy zapisywaniu zestawu kategoryzacji, więc dołączamy do klucza ciąg.
Jeśli chodzi o to, dlaczego domyślnie byłyby to klucze całkowite, nie sądzę, że to tylko kwestia rozmiaru indeksu. Dużym problemem jest zarządzanie kluczami. Ponieważ klucz jest dowolny i możesz mieć do czynienia z milionami rekordów, musisz mieć sposób na generowanie unikatowych ciągów. Są przypadki, w których ludzie używają do tego UUID, ale istnieje niezerowa szansa na kolizję UUID, a gdzie przechowywane są miliardy rekordów, szansa ta staje się wystarczająco wysoka, którą można rzeczywiście zobaczyć, podczas gdy szansa na kolizję z przyrostowymi typami liczb całkowitych wynosi zero zgodnie z definicją.