Benzersiz olmaları gerektiğinden, bir MySQL DB'de FK'leri ne adlandırmalıyım?
Yanıtlar:
MySQL'de, yabancı anahtar kısıtlamalarına sembolik bir isim vermeye gerek yoktur. Bir isim verilmemişse, InnoDB otomatik olarak benzersiz bir isim oluşturur.
Her durumda, kullandığım kural bu:
fk_[referencing table name]_[referenced table name]_[referencing field name]
Misal:
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);
user_id
Yukarıdaki örnekte olduğu gibi, referans ve referans tablolarda aynı alan adlarını kullanmaya çalışıyorum . Bu pratik olmadığında, başvurulan alan adını yabancı anahtar adına da eklerim.
Bu adlandırma kuralı, sembolik adı yalnızca tablo tanımlarına bakarak "tahmin etmeme" olanak tanır ve ayrıca benzersiz adları da garanti eder.
member_id
~> tablo üyesine bağlantı, edited_id
~> düzenlenen kullanıcı için yabancı anahtar, ayrıca tablo üyesine bağlantı. Onları nasıl adlandırmalıyım?
benim seçimim farklı. bence bir tablonun bir id
alanı değil , bir alanı olması gerekir user_id
, çünkü tablo sadece denir user
, bu yüzden:
CREATE TABLE users(
id int,
name varchar(100)
);
CREATE TABLE messages(
id int,
user_id int
);
user_id
içinde messages
o kimliği olan net yapmak zorunda böylece masanın bir fk alanıdır ( user_id
).
bence kendi kendini tamamen açıklayan bir adlandırma kuralı şunlar olabilir:
fk_[referencing table name]_[referencing field name]_[referenced table name]_[referenced field name]
i.e.: `fk_messages_user_id_users_id`
Not:
bu fk benzersiz olabilir, çünkü bir messages_user
tablo varsa, başvuran alan adı user_id
(sadece değil id
) ve fk adı şöyle olmalıdır:
fk_messages_user_user_id_users_id
başka bir deyişle, bir yabancı anahtar adlandırma kuralı, "başvuran / başvurulan alan" adlandırma kuralı kullanıyorsanız (ve tabii ki kendinizinkini seçebilirsiniz) benzersiz adlardan emin olmanızı sağlar.
$id
hangi tabloya ait olduğu hakkında hiçbir fikri olmayan bir yerde bir değişken bulacaksınız . Kod tabanınız ne kadar eski olursa ve üzerinde ne kadar çok insan çalıştıysa, bu o kadar olası hale gelir.
Kendinizi sık sık oluşturulduktan sonra fk'lere başvururken bulamazsanız, bir seçenek basit tutmak ve MySQL'in sizin için adlandırmayı yapmasına izin vermektir ( Daniel Vassallo'nun cevabının başında bahsettiği gibi ).
Bu yöntemle kısıtlama adlarını benzersiz bir şekilde "tahmin edemezsiniz" - yabancı anahtar kısıtlama adını bir sorgu çalıştırarak kolayca bulabilirsiniz:
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;
Örneğin, sorgudan aşağıdakileri alabilirsiniz:
+------------+-------------+-----------------+-----------------------+------------------------+
| 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 |
+------------+-------------+-----------------+-----------------------+------------------------+
Bu ekstra adım sizin için çok fazla değilse, aradığınız fk'yi kolayca bulabilmelisiniz.
fk-[referencing_table]-[referencing_field]
Nedeni, bir veritabanında benzersiz referencing_table
ve kombinasyonudur referencing_field
. Bu şekilde yabancı anahtar adının okunmasını kolaylaştırın, örneğin:
table `user`:
id
name
role
table `article`:
id
content
created_user_id /* --> user.id */
reviewed_user_id /* --> user.id */
Yani iki yabancı anahtarımız var:
fk-article-created_user_id
fk-article-reviewed_user_id
user
Yabancı anahtar adına tablo adı eklemek gereksizdir.
user_role
? user
ve role
çok sayıda ilişkiye sahiptir ve user_role
tüm yabancı anahtarı içeren tablodur. Olmalı mı fk_user_role_role
?