¿Qué es una convención de nomenclatura adecuada para MySQL FKs?


Siendo que deben ser únicos, ¿cómo debo nombrar FK en una base de datos MySQL?

Author: Zombies, 2010-02-11

3 answers

En MySQL, no hay necesidad de dar un nombre simbólico a las restricciones de clave foránea. Si no se da un nombre, InnoDB crea un nombre único automáticamente.

En cualquier caso, esta es la convención que uso:

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);

Trato de mantener los mismos nombres de campo en las tablas de referencia y referenciadas, como en user_id en el ejemplo anterior. Cuando esto no es práctico, también añado el nombre del campo referenciado al nombre de la clave foránea.

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.

 107
Author: Daniel Vassallo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-02-11 00:27:36

Mi elección es diferente. en mi opinión, una tabla debe tener un campo "id", no uno "user_id", porque la tabla solo se llama "usuario", así que:

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

CREATE TABLE messages(
   id int,
   user_id    int
);

"user_id" en la tabla "messages" es un campo fk por lo que tiene que aclarar qué id es ("user_id").

Una convención de nomenclatura totalmente auto-explicativa, 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:

  • puede, en algún caso, omitir el segundo elemento ([nombre del campo de referencia])
  • Este fk podría es único, porque si existe una tabla" messages_user", el nombre del campo de referencia debe ser" user_id "(y no solo" id") y el nombre fk debe ser:

    Fk_messages_user_user_id_users_id

En otras palabras, una convención de nomenclatura de clave foránea le asegura nombres únicos si también usa una convención de nomenclatura de "referencia/campo referenciado" (y puede elegir la suya propia, por supuesto).

 22
Author: lorenzo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-05 09:19:53

Si usted no se encuentra haciendo referencia a fk que a menudo después de que se crean, una opción es mantenerlo simple y dejar que MySQL haga el nombre por usted (como Daniel Vassallo menciona al principio de su respuesta).

Si bien no podrá "adivinar" de forma única los nombres de restricción 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 esto paso adicional no es demasiado para usted, entonces usted debe ser capaz de encontrar fácilmente el fk que está buscando.

 7
Author: user12345,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-16 04:39:34