¿Cuál es una convención de nomenclatura adecuada para MySQL FK?

Respuestas:

141

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_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.

Daniel Vassallo
fuente
13
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:

CREATE TABLE users(
   id    int,
   name       varchar(100)
);

CREATE TABLE 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).

lorenzo
fuente
4
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' 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.

user12345
fuente
1
fk-[referencing_table]-[referencing_field]

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 */

Entonces tenemos dos claves externas:

fk-article-created_user_id
fk-article-reviewed_user_id

Agregar el usernombre de la tabla al nombre de la clave externa es redundante.

Văn Quyết
fuente
¿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?
Nguyễn Đức Tâm
@ NguyễnĐứcTâm fk-user_role-role
Văn Quyết