W MySQL nie ma potrzeby nadawania nazwy symbolicznej ograniczeniom klucza obcego. Jeśli nazwa nie zostanie podana, InnoDB automatycznie utworzy unikalną nazwę.
W każdym razie jest to konwencja, której używam:
fk_[referencing table name]_[referenced table name]_[referencing field name]
Przykład:
CREATETABLE users(
user_id int,
name varchar(100));CREATETABLE messages(
message_id int,
user_id int
);ALTERTABLE messages ADDCONSTRAINT fk_messages_users_user_id
FOREIGNKEY(user_id)REFERENCES users(user_id);
Staram się trzymać tych samych nazw pól przy odwoływaniu się i przywoływanych tabelach, jak w user_idpowyższym przykładzie. Jeśli nie jest to praktyczne, dołączam również nazwę pola, do którego się odwołujemy, do nazwy klucza obcego.
Ta konwencja nazewnictwa pozwala mi „odgadnąć” nazwę symboliczną po prostu patrząc na definicje tabeli, a ponadto gwarantuje również unikalne nazwy.
Powodem tworzenia nazwy symbolicznej jest odwoływanie się, gdy chcesz / musisz usunąć ograniczenie. Oracle i SQL Server umożliwiają wyłączenie określonych ograniczeń. Jeśli nie masz fk w nazwie, musisz potwierdzić, że ograniczenie jest ograniczeniem klucza obcego ...
OMG Kucyki
11
Lubię używać podwójnego podkreślenia między nazwą tabeli odniesienia a nazwą tabeli, do której się odwołuje. Daje to podwójne zalety list alfabetycznych, które utrzymują wszystkie SK tabeli razem i jednocześnie pomagają uniknąć kolizji nazw / nieporozumień w przypadku wielu nazw tabel słów. Pomijam również część pola nazwy, gdy jest ona trywialna (tj. Pojedyncze pole int odwołuje się do PK tożsamości innej tabeli).
Joel Brown
2
A jeśli jest więcej niż 1 klucz obcy? Przykład: member_id~> łącze do członka tabeli, edited_id~> klucz obcy dla edytowanego użytkownika, również łącze do członka tabeli. Jak mam je nazwać?
TomSawyer
@TomSawyer: dodaję „pk_” do wszystkich kluczy obcych, po których następuje tabela, do której się odwołuje (np. „Członkowie”), a następnie użycie / sens (np. „Redaktor” lub „autor”). Mam więc coś takiego jak „pk_members_author” lub „pk_members_editor”.
Nrgyzer
28
mój wybór jest inny. moim zdaniem tablica powinna mieć idpole, a nie user_idjedno, bo tablica właśnie się nazywa user, więc:
CREATETABLE users(
id int,
name varchar(100));CREATETABLE messages(
id int,
user_id int
);
user_idw messagestabeli jest polem fk, więc musi jasno określić, który identyfikator to ( user_id).
w pełni zrozumiałą konwencją nazewnictwa, moim zdaniem, mogłaby być:
fk_[referencing table name]_[referencing field name]_[referenced table name]_[referenced field name]
i.e.:`fk_messages_user_id_users_id`
Uwaga:
w niektórych przypadkach można pominąć drugi element ([nazwa pola odniesienia])
ten fk może być unikalny, ponieważ jeśli messages_useristnieje tabela, nazwa pola odniesienia powinna być user_id(a nie tylko id), a nazwa fk powinna być:
fk_messages_user_user_id_users_id
innymi słowy, konwencja nazewnictwa kluczy obcych zapewnia unikalne nazwy, jeśli również używasz konwencji nazewnictwa „pole odniesienia / pole odniesienia” (i oczywiście możesz wybrać własną).
Nazwy mają sposób na przetrwanie w całym kodzie. W końcu znajdziesz $idgdzieś zmienną, nie mając pojęcia, do której tabeli należy. Im starszy jest Twój kod i im więcej osób nad nim pracowało, tym bardziej prawdopodobne jest to.
Chociaż nie będziesz w stanie jednoznacznie „odgadnąć” nazw ograniczeń za pomocą tej metody - możesz łatwo znaleźć nazwę ograniczenia klucza obcego, uruchamiając zapytanie:
use information_schema;select TABLE_NAME,COLUMN_NAME,CONSTRAINT_NAME, REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME from KEY_COLUMN_USAGE where REFERENCED_TABLE_SCHEMA ='your_db_schema_name'ORDERBY TABLE_NAME;
Na przykład możesz otrzymać następujące zapytanie z zapytania:
Powodem jest połączenie referencing_tablei referencing_fieldjest unikalne w bazie danych. W ten sposób nazwa klucza obcego będzie łatwa do odczytania, na przykład:
table`user`:
id
name
role
table`article`:
id
content
created_user_id /* --> user.id */
reviewed_user_id /* --> user.id */
A jeśli nazwa bazy danych to user_role? useri rolema relację manytomany i user_rolejest tabelą zawierającą cały klucz obcy. Powinien być fk_user_role_role?
Odpowiedzi:
W MySQL nie ma potrzeby nadawania nazwy symbolicznej ograniczeniom klucza obcego. Jeśli nazwa nie zostanie podana, InnoDB automatycznie utworzy unikalną nazwę.
W każdym razie jest to konwencja, której używam:
Przykład:
Staram się trzymać tych samych nazw pól przy odwoływaniu się i przywoływanych tabelach, jak w
user_id
powyższym przykładzie. Jeśli nie jest to praktyczne, dołączam również nazwę pola, do którego się odwołujemy, do nazwy klucza obcego.Ta konwencja nazewnictwa pozwala mi „odgadnąć” nazwę symboliczną po prostu patrząc na definicje tabeli, a ponadto gwarantuje również unikalne nazwy.
źródło
member_id
~> łącze do członka tabeli,edited_id
~> klucz obcy dla edytowanego użytkownika, również łącze do członka tabeli. Jak mam je nazwać?mój wybór jest inny. moim zdaniem tablica powinna mieć
id
pole, a nieuser_id
jedno, bo tablica właśnie się nazywauser
, więc:user_id
wmessages
tabeli jest polem fk, więc musi jasno określić, który identyfikator to (user_id
).w pełni zrozumiałą konwencją nazewnictwa, moim zdaniem, mogłaby być:
Uwaga:
ten fk może być unikalny, ponieważ jeśli
messages_user
istnieje tabela, nazwa pola odniesienia powinna byćuser_id
(a nie tylkoid
), a nazwa fk powinna być:fk_messages_user_user_id_users_id
innymi słowy, konwencja nazewnictwa kluczy obcych zapewnia unikalne nazwy, jeśli również używasz konwencji nazewnictwa „pole odniesienia / pole odniesienia” (i oczywiście możesz wybrać własną).
źródło
$id
gdzieś zmienną, nie mając pojęcia, do której tabeli należy. Im starszy jest Twój kod i im więcej osób nad nim pracowało, tym bardziej prawdopodobne jest to.Jeśli nie odnosisz się do plików fk tak często po ich utworzeniu, jedną z opcji jest uproszczenie i pozwolenie MySQL na wykonanie nazewnictwa za Ciebie (jak Daniel Vassallo wspomina na początku swojej odpowiedzi ).
Chociaż nie będziesz w stanie jednoznacznie „odgadnąć” nazw ograniczeń za pomocą tej metody - możesz łatwo znaleźć nazwę ograniczenia klucza obcego, uruchamiając zapytanie:
Na przykład możesz otrzymać następujące zapytanie z zapytania:
Jeśli ten dodatkowy krok nie jest dla ciebie zbyt duży, powinieneś być w stanie łatwo znaleźć fk, którego szukasz.
źródło
Powodem jest połączenie
referencing_table
ireferencing_field
jest unikalne w bazie danych. W ten sposób nazwa klucza obcego będzie łatwa do odczytania, na przykład:Mamy więc dwa klucze obce:
Dodawanie
user
nazwy tabeli do nazwy klucza obcego jest zbędne.źródło
user_role
?user
irole
ma relację manytomany iuser_role
jest tabelą zawierającą cały klucz obcy. Powinien byćfk_user_role_role
?