Respuestas:
En MySQL, no es necesario dar un nombre simbólico a las restricciones de clave externa. Si no se proporciona un nombre, InnoDB crea un nombre único automáticamente.
En cualquier caso, esta es la convención que utilizo:
fk_[referencing table name]_[referenced table name]_[referencing field name]
Ejemplo:
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);
Intento mantenerme con los mismos nombres de campo en las tablas de referencia y referenciadas, como user_id
en el ejemplo anterior. Cuando esto no es práctico, también agrego el nombre del campo al que se hace referencia al nombre de la clave externa.
Esta convención de nomenclatura me permite "adivinar" el nombre simbólico con solo mirar las definiciones de la tabla y, además, también garantiza nombres únicos.
member_id
~> enlace al miembro de la tabla, edited_id
~> clave externa para el usuario editado, también enlace al miembro de la tabla. ¿Cómo debo nombrarlos?
mi elección es diferente. en mi opinión, una tabla debería tener un id
campo, no user_id
uno, porque la tabla se acaba de llamar user
, entonces:
CREATE TABLE users(
id int,
name varchar(100)
);
CREATE TABLE messages(
id int,
user_id int
);
user_id
en la messages
tabla es un campo fk, por lo que debe dejar en claro qué id es ( user_id
).
una convención de nomenclatura totalmente autoexplicativa, en mi opinión, podría ser:
fk_[referencing table name]_[referencing field name]_[referenced table name]_[referenced field name]
i.e.: `fk_messages_user_id_users_id`
Nota:
este fk podría ser único, porque si messages_user
existe una tabla, el nombre del campo de referencia debe ser user_id
(y no solo id
) y el nombre de fk debe ser:
fk_messages_user_user_id_users_id
en otras palabras, una convención de nomenclatura de claves foráneas le asegura los nombres únicos si también usa una convención de nomenclatura de "campos de referencia / referenciados" (y puede elegir la suya propia, por supuesto).
$id
variable en algún lugar sin idea de a qué tabla pertenece. Cuanto más antigua sea su base de código y más personas hayan trabajado en ella, más probable será que esto suceda.
Si no se encuentra haciendo referencia a fk's tan a menudo después de que se crean, una opción es mantenerlo simple y dejar que MySQL haga el nombre por usted (como menciona Daniel Vassallo al comienzo de su respuesta ).
Si bien no podrá "adivinar" de forma única los nombres de las restricciones con este método, puede encontrar fácilmente el nombre de la restricción de clave externa ejecutando una consulta:
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;
Por ejemplo, puede recibir lo siguiente de la consulta:
+------------+-------------+-----------------+-----------------------+------------------------+
| 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 |
+------------+-------------+-----------------+-----------------------+------------------------+
Si este paso adicional no es demasiado para usted, entonces debería poder encontrar fácilmente el fk que está buscando.
fk-[referencing_table]-[referencing_field]
El motivo es la combinación de referencing_table
y referencing_field
es único en una base de datos. De esta forma, el nombre de la clave externa es fácil de leer, por ejemplo:
table `user`:
id
name
role
table `article`:
id
content
created_user_id /* --> user.id */
reviewed_user_id /* --> user.id */
Entonces tenemos dos claves externas:
fk-article-created_user_id
fk-article-reviewed_user_id
Agregar el user
nombre de la tabla al nombre de la clave externa es redundante.
user_role
? user
y role
tienen muchas relaciones y user_role
es la tabla que contiene todas las claves externas. ¿Debería serlo fk_user_role_role
?