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:
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);
Intento mantenerme con los mismos nombres de campo en las tablas de referencia y referenciadas, como user_iden 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.
La razón para crear un nombre simbólico es para hacer referencia cuando desea / necesita eliminar la restricción. Oracle y SQL Server le permiten deshabilitar restricciones específicas. Si no tiene fk en el nombre, debe confirmar que la restricción es una restricción de clave externa ...
OMG Ponies
11
Lo que me gusta hacer es usar un guión bajo doble entre el nombre de la tabla de referencia y el nombre de la tabla de referencia. Esto le brinda la doble ventaja de que los listados alfabéticos mantienen todos los FK de una tabla juntos y, al mismo tiempo, lo ayudan a evitar colisiones / confusión de nombres cuando hay varios nombres de tablas de palabras. También omito la parte del campo del nombre cuando es trivial (es decir, un solo campo int hace referencia a la identidad PK de otra tabla).
Joel Brown
2
¿Qué pasa si hay más de 1 clave externa? Ejemplo: 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?
TomSawyer
@TomSawyer: agrego 'pk_' a todas las claves externas, seguido de la tabla referenciada (por ejemplo, 'miembros'), seguida del uso / sentido (por ejemplo, 'editor' o 'autor'). Entonces tengo algo como 'pk_members_author' o 'pk_members_editor'.
Nrgyzer
28
mi elección es diferente. en mi opinión, una tabla debería tener un idcampo, no user_iduno, porque la tabla se acaba de llamar user, entonces:
CREATETABLE users(
id int,
name varchar(100));CREATETABLE messages(
id int,
user_id int
);
user_iden la messagestabla 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:
en algunos casos, puede omitir el segundo elemento ([nombre del campo de referencia])
este fk podría ser único, porque si messages_userexiste 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).
Los nombres tienen una forma de persistir en el código. Eventualmente, encontrará una $idvariable 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.
CJ Dennis
9
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'ORDERBY TABLE_NAME;
Por ejemplo, puede recibir lo siguiente de la consulta:
El motivo es la combinación de referencing_tabley referencing_fieldes ú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 */
¿Y si el nombre de la base de datos es user_role? usery roletienen muchas relaciones y user_rolees la tabla que contiene todas las claves externas. ¿Debería serlo fk_user_role_role?
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:
Ejemplo:
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.
fuente
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, nouser_id
uno, porque la tabla se acaba de llamaruser
, entonces:user_id
en lamessages
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:
Nota:
este fk podría ser único, porque si
messages_user
existe una tabla, el nombre del campo de referencia debe seruser_id
(y no soloid
) 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).
fuente
$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:
Por ejemplo, puede recibir lo siguiente de la consulta:
Si este paso adicional no es demasiado para usted, entonces debería poder encontrar fácilmente el fk que está buscando.
fuente
El motivo es la combinación de
referencing_table
yreferencing_field
es único en una base de datos. De esta forma, el nombre de la clave externa es fácil de leer, por ejemplo:Entonces tenemos dos claves externas:
Agregar el
user
nombre de la tabla al nombre de la clave externa es redundante.fuente
user_role
?user
yrole
tienen muchas relaciones yuser_role
es la tabla que contiene todas las claves externas. ¿Debería serlofk_user_role_role
?