Siendo que deben ser únicos, ¿qué nombre debería tener FK en una base de datos MySQL?¿Cuál es una convención de nombres adecuada para MySQL FK?
Respuesta
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.
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 ... –
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). –
¿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
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) .
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.
- 1. ¿Existe una convención de nombres para MySQL?
- 2. ¿Cuál es la convención de nomenclatura adecuada para una "ID" de propiedad: ID o Id?
- 3. ¿Cuál es la referencia adecuada para escribir un controlador MySql?
- 4. ¿Cuál es su convención para typedef'ing shared_ptr?
- 5. Convención de nombres para comandos y eventos
- 6. ¿Qué es esta convención de nombres?
- 7. ¿Cuál es la convención de nomenclatura adecuada para archivos DLL de MSVC, bibliotecas estáticas y bibliotecas de importación?
- 8. ¿Cuál es su convención de nombres para las funciones de ayuda?
- 9. Convención de nombres de acción
- 10. Existe una convención de nombres para keystore (java)
- 11. ¿Cuál es una buena convención de nombres para diferenciar un nombre de clase de una propiedad en C#?
- 12. cuál es la forma 'adecuada' para usar objectWithID de NSManagedObjectContext:
- 13. Convención de nombres de imagen para iPhone 5
- 14. ¿Cuál es el nombre de esta convención para llaves?
- 15. Convención de nomenclatura de tabla adecuada para una tabla de intersección de muchos a muchos
- 16. ¿Cuál es una buena convención de nomenclatura para un mapa de búsqueda/hash?
- 17. ¿Existe una convención de nombres bien establecida para los espacios de nombres PHP?
- 18. ¿Cuál es la expresión RegEx adecuada para los códigos SWIFT?
- 19. ¿Cuál es la gramática adecuada para este idioma?
- 20. ¿Cuál es la convención para colocar llaves en Objective-C?
- 21. ¿cuál es la convención en JSON para vacío vs. nulo?
- 22. ¿Qué es una buena convención de nombres para vars, métodos, etc. en C++?
- 23. ¿Cuál es la forma adecuada de probar código que utiliza consultas específicas de MySQL internamente?
- 24. ¿Cuál es la convención para prefijar categorías con palabras mágicas?
- 25. Convención para nombres de archivo de clases genéricas
- 26. Convención de nombres Scala para "setters" en objetos inmutables
- 27. Convención de nomenclatura para nombres de archivo de clases parciales?
- 28. convención de nombres para los métodos no virtuales y abstractas
- 29. ¿Cuál es la firma de PInvoke adecuada para una función que toma var args?
- 30. ¿Cuál es la mejor convención de nomenclatura de ViewModel?
http: // stackoverflow.com/questions/199498/foreign-key-naming-scheme – trante