2010-02-10 13 views

Respuesta

98

En MySQL, no hay necesidad de dar un nombre simbólico a las restricciones de clave externa. Si no se da 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); 

trato de seguir con los mismos nombres de campo de referencia y tablas de referencia, como en user_id en el ejemplo anterior. Cuando esto no es práctico, también anexo el nombre de campo referenciado 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.

+13

La razón para crear un nombre simbólico es para hacer referencia cuando quiere/necesita soltar la restricción. Oracle y SQL Server le permiten desactivar restricciones específicas. Si no tiene fk en el nombre, debe confirmar que la restricción es una restricción de clave externa ... –

+9

Lo que me gusta hacer es usar un guion bajo doble entre el nombre de la tabla de referencia y el nombre de tabla referenciado. Esto le da la doble ventaja de que las listas alfabéticas mantienen juntas todas las FK de una tabla y al mismo tiempo le ayudan a evitar colisiones/confusión de nombres cuando hay múltiples nombres de tablas de palabras. También omito la parte de campo del nombre cuando es trivial (es decir, un campo int único hace referencia a la identidad PK de otra tabla). –

+2

¿Qué sucede 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 debería nombrarlos? – TomSawyer

22

mi elección es diferente. en mi opinión, una tabla debe tener un campo "id", no un "user_id" uno, porque la tabla se acaba de llamar "usuario", por lo que:

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

CREATE TABLE messages(
    id int, 
    user_id int 
); 

"user_id" en "mensajes" mesa es una fk campo por lo que debe dejar en claro qué ID es ("user_id").

una convención de nomenclatura totalmente auto-explica, 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, omita el segundo elemento ([campo de referencia nombre])
  • este FK podía es único, ya que si existe una tabla "messages_user", el nombre del campo de referencia debe ser "user_id" (y no sólo "id") y el nombre FK debe ser:

    fk_messages_user_user_id_users_id

en otras palabras, una convención de nombres clave externa te hacen seguro de nombres únicos si también usa una "referencia/campo referenciado" (convención de nomenclatura y usted puede elegir su propia cuenta, por supuesto) .

7

Si no se encuentra haciendo referencia a fk's tan a menudo una vez que se crean, una opción es mantenerlo simple y dejar que MySQL haga el nombramiento por usted (como Daniel Vassallo mentions in the beginning of his answer).

Mientras que usted no será capaz de forma única "adivinar" los nombres de restricción con este método - se puede encontrar fácilmente el nombre de la restricción de clave externa mediante la ejecución de 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 el siguiente en 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 usted debería ser capaz de encontrar fácilmente el FK que busca.

Cuestiones relacionadas