Essendo che devono essere unici, come dovrei nominare FK in un DB MySQL?Che cos'è una convenzione di denominazione appropriata per MySQL FK?
risposta
In MySQL, non è necessario assegnare un nome simbolico ai vincoli di chiave esterna. Se non viene fornito un nome, InnoDB crea automaticamente un nome univoco.
In ogni caso, questa è la convenzione che uso:
fk_[referencing table name]_[referenced table name]_[referencing field name]
Esempio:
CREATE TABLE users(
user_id int,
name varchar(100)
);
CREATE TABLE messages(
message_id int,
user_id int
);
ALTER TABLE messages ADD CONSTRAINT fk_messages_users_user_id
FOREIGN KEY (user_id) REFERENCES users(user_id);
cerco di restare con gli stessi nomi di campo in riferimenti e tabelle di riferimento, come in user_id
nell'esempio sopra. Quando ciò non è pratico, aggiungo anche il nome del campo referenziato al nome della chiave esterna.
Questa convenzione di denominazione mi consente di "indovinare" il nome simbolico semplicemente osservando le definizioni della tabella e inoltre garantisce anche nomi univoci.
Il motivo per la creazione di un nome simbolico è il riferimento quando si desidera/è necessario eliminare il vincolo. Oracle e SQL Server consentono di disabilitare vincoli specifici. Se non hai fk nel nome, devi confermare che il vincolo è un vincolo di chiave esterna ... –
Quello che mi piace fare è usare una doppia sottolineatura tra il nome della tabella di riferimento e il nome della tabella di riferimento. Questo ti dà i doppi vantaggi delle inserzioni alfabetiche mantenendo tutti gli FK di una tabella insieme e allo stesso tempo ti aiuta a evitare conflitti di nome/confusione quando ci sono più nomi di tabelle di parole. Ometto anche la parte del campo del nome quando è banale (cioè un campo int singolo fa riferimento all'identità PK di un'altra tabella). –
Cosa succede se ci sono più di 1 chiave esterna? Esempio: 'member_id' ~> collegamento al membro della tabella,' edited_id' ~> chiave esterna per utente modificato, collegamento anche al membro della tabella. Come dovrei nominarli? – TomSawyer
la mia scelta è diversa. a mio parere, un tavolo dovrebbe avere un campo "id", non un "user_id" uno, perché la tabella è appena chiamato "utente", quindi:
CREATE TABLE users(
id int,
name varchar(100)
);
CREATE TABLE messages(
id int,
user_id int
);
"user_id" in "messaggi" da tavolo è una fk field quindi deve chiarire quale id è ("user_id").
una convenzione di denominazione completamente autoesplicativo, a mio parere, potrebbe essere:
fk_[referencing table name]_[referencing field name]_[referenced table name]_[referenced field name]
i.e.: fk_messages_user_id_users_id
nota:
- si può, in alcuni casi, omettere il secondo elemento ([campo riferimento nome])
questo file fk potrebbe essere univoco, perché se esiste una tabella "messages_user", il nome del campo di riferimento dovrebbe essere "user_id" (e non solo "id") e il nome fk dovrebbe essere:
fk_messages_user_user_id_users_id
in altre parole, una convenzione di denominazione chiave esterna ti fanno sicuro di nomi univoci se si utilizza anche un "riferimento/campo di riferimento" convenzione di denominazione (e si può scegliere il proprio, ovviamente) .
Se non ci si trova a fare riferimento a fk che spesso dopo la creazione, un'opzione è di mantenerla semplice e lasciare che MySQL faccia il naming per voi (come Daniel Vassallo mentions in the beginning of his answer).
Anche se non sarà in grado di univocamente "indovinare" i nomi di vincolo con questo metodo - si può facilmente trovare il nome del vincolo di chiave esterna eseguendo una query:
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' ORDER BY TABLE_NAME;
Per esempio si potrebbe ricevere il seguito dalla query:
+------------+-------------+-----------------+-----------------------+------------------------+
| TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME | REFERENCED_TABLE_NAME | REFERENCED_COLUMN_NAME |
+------------+-------------+-----------------+-----------------------+------------------------+
| note | taskid | note_ibfk_2 | task | id |
| note | userid | note_ibfk_1 | user | id |
| task | userid | task_ibfk_1 | user | id |
+------------+-------------+-----------------+-----------------------+------------------------+
Se questo ulteriore passaggio non è troppo per voi, allora si dovrebbe essere in grado di trovare facilmente il fk che stai cercando.
http: // stackoverflow.it/questions/199498/schema dei nomi di chiavi esterne – trante