Właśnie zaczynam pracę z kluczami obcymi po raz pierwszy i zastanawiam się, czy istnieje standardowy schemat nazewnictwa, którego mogę użyć?
Biorąc pod uwagę te tabele:
task (id, userid, title)
note (id, taskid, userid, note);
user (id, name)
Tam, gdzie zadania mają notatki, zadania są własnością użytkowników, a użytkownicy - notatki autora.
Jak w tej sytuacji zostałyby nazwane trzy klucze obce? A może to w ogóle ma znaczenie ?
Aktualizacja : To pytanie dotyczy nazw kluczy obcych, a nie nazw pól!
Odpowiedzi:
Standardowa konwencja w SQL Server to:
Na przykład kluczem między notatkami a zadaniami byłoby:
A kluczem między zadaniami a użytkownikami byłoby:
Daje to „na pierwszy rzut oka” widok, które tabele są zaangażowane w klucz, dzięki czemu można łatwo sprawdzić, od których tabel zależy konkretna (pierwsza nazwana) (druga nazwana). W tym scenariuszu pełny zestaw kluczy wyglądałby następująco:
Możesz więc zobaczyć, że zadania zależą od użytkowników, a notatki zależą zarówno od zadań, jak i od użytkowników.
źródło
message
tabela mafrom_user_id
ito_user_id
oba staną sięfk_message_user
. Wydaje mi się, że lepiej jest użyćfk_tablename_columnname
(fk_message_from_user_id w moim przykładzie) z tego powodu, a następnie starać się, aby nazwy kolumn były jasne co do tabeli docelowej (tj. To_user_id wyraźnie odnosi się do tabeli użytkowników)Używam dwóch znaków podkreślenia jako separatora, tj
Dzieje się tak, ponieważ nazwy tabel czasami zawierają same znaki podkreślenia. Jest to zgodne z konwencją nazewnictwa ograniczeń, ponieważ nazwy elementów danych często zawierają znaki podkreślenia, np
źródło
A co powiesz
FK_TABLENAME_COLUMNNAME
?K EEP I T S wyko S tupid miarę możliwości.
źródło
FK_Animals_OwnerID
—Tabela Zwierzęta i Właściciele zdefiniowana w kolumnie ID właścicielaUwaga od Microsoft dotycząca SQL Server:
dlatego użyję terminów opisujących zależność zamiast konwencjonalnych terminów relacji pierwotnych / obcych.
Odwołując się do KLUCZA PODSTAWOWEGO niezależnej (nadrzędnej) tabeli przez podobnie nazwane kolumny w tabeli zależnej (podrzędnej) , pomijam nazwy kolumn:
W przypadku odwoływania się do innych kolumn lub nazwy kolumn różnią się między dwiema tabelami lub po prostu mają być wyraźne:
źródło
Zwykle po prostu zostawiam swój PK o nazwie id, a następnie łączę nazwę mojej tabeli i nazwę kolumny klucza podczas nadawania nazw FK w innych tabelach. Nigdy nie zawracam sobie głowy pisaniem wielbłądów, ponieważ niektóre bazy danych odrzucają rozróżnianie wielkości liter i po prostu zwracają wszystkie nazwy wielkich lub małych liter. W każdym razie oto jak wyglądałaby moja wersja twoich tabel:
Zwróć uwagę, że moje tabele również nazywam w liczbie pojedynczej, ponieważ wiersz reprezentuje jeden z obiektów, które utrwalam. Wiele z tych konwencji to osobiste preferencje. Sugerowałbym, że ważniejsze jest, aby wybrać konwencję i zawsze z niej korzystać, niż przyjąć konwencję kogoś innego.
źródło
To prawdopodobnie przesada, ale w moim przypadku działa. Bardzo mi to pomaga, zwłaszcza gdy mam do czynienia z VLDB. Używam następujących:
Oczywiście, jeśli z jakiegoś powodu nie odwołujesz się do klucza podstawowego, musisz odwołać się do kolumny zawartej w unikalnym ograniczeniu, w tym przypadku:
Czy to może być długie, tak. Czy pomogło to w utrzymaniu jasnych informacji na potrzeby raportów, czy też pozwoliło mi szybko stwierdzić, że potencjalny problem występuje podczas ostrzeżenia o produkcie. 100% chciałoby poznać opinie ludzi na temat tej konwencji nazewnictwa.
źródło
Moje zwykłe podejście jest takie
Lub innymi słowy
W ten sposób mogę nazwać dwa klucze obce, które odwołują się do tej samej tabeli, jak
history_info table
zcolumn actionBy and actionTo
fromusers_info
tableTo będzie jak
Zauważ, że:
Nie podałem nazwy stołu podrzędnego, ponieważ wydaje mi się to rozsądne, jestem w stole dziecka, więc mogę łatwo przyjąć nazwę stołu dziecka. Całkowity charakter to 26 i dobrze pasuje do 30-znakowego limitu wyroczni, który został określony przez Charlesa Burnsa w komentarzu tutaj
źródło
W oparciu o odpowiedzi i komentarze tutaj, konwencja nazewnictwa, która obejmuje tabelę FK, pole FK i tabelę PK (FK_FKTbl_FKCol_PKTbl), powinna unikać kolizji nazw ograniczeń FK.
Tak więc dla podanych tutaj tabel:
Jeśli więc dodasz kolumnę, aby śledzić, kto ostatnio modyfikował zadanie lub notatkę ...
źródło
Jeśli nie odwołujesz się do swoich FK tak często i nie używasz MySQL (i InnoDB), możesz po prostu pozwolić MySQL nazwać FK za Ciebie.
Później możesz znaleźć potrzebną nazwę FK, uruchamiając zapytanie .
źródło
Spróbuj użyć dużych liter UUID wersji 4 z pierwszym oktetem zastąpionym przez FK i „_” (podkreślenie) zamiast „-” (myślnik).
Na przykład
FK_4VPO_K4S2_A6M1_RQLEYLT1VQYV
FK_1786_45A6_A17C_F158C0FB343E
FK_45A5_4CFA_84B0_E18906927B53
Uzasadnienie jest następujące
źródło