MySQL FK'leri için uygun bir adlandırma kuralı nedir?


Yanıtlar:


146

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_idYukarı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.


13
Sembolik bir ad oluşturmanın nedeni, kısıtlamayı kaldırmak istediğinizde / gerektiğinde başvuruda bulunmak içindir. Oracle ve SQL Server, belirli kısıtlamaları devre dışı bırakmanıza izin verir. Adınızda fk yoksa, kısıtlamanın bir yabancı anahtar kısıtlaması olduğunu onaylamanız gerekir ...
OMG Ponies

11
Benim yapmaktan hoşlandığım şey, referans tablo adı ile referans verilen tablo adı arasında çift alt çizgi kullanmaktır. Bu size bir tablonun FK'lerini bir arada tutan alfabetik listelerin ikili avantajlarını sağlar ve aynı zamanda birden çok sözcük tablosu adı olduğunda ad çakışmalarını / kafa karışıklığını önlemenize yardımcı olur. Ayrıca, önemsiz olduğunda ismin alan kısmını atlıyorum (yani tek bir int alanı başka bir tablonun kimlik PK'sına başvuruyor).
Joel Brown

2
Ya 1'den fazla yabancı anahtar varsa? Örnek: 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?
TomSawyer

@TomSawyer: Tüm yabancı anahtarlara 'pk_' ekledim, ardından başvurulan tabloya (örn. 'Üyeler'), ardından kullanım / anlam (örn. 'Editör' veya 'yazar') ekliyorum. Yani 'pk_members_author' veya 'pk_members_editor' gibi bir şeyim var.
Nrgyzer

28

benim seçimim farklı. bence bir tablonun bir idalanı 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_idiçinde messageso 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:

  • bazı durumlarda ikinci öğeyi atlayabilirsiniz ([referans alan adı])
  • bu fk benzersiz olabilir, çünkü bir messages_usertablo 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.


4
İsimler, kodlar arasında kalıcılık sağlar. Sonunda, $idhangi 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.
CJ Dennis

9

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.


1
fk-[referencing_table]-[referencing_field]

Nedeni, bir veritabanında benzersiz referencing_tableve 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

userYabancı anahtar adına tablo adı eklemek gereksizdir.


Ya veritabanı adı ise user_role? userve roleçok sayıda ilişkiye sahiptir ve user_roletüm yabancı anahtarı içeren tablodur. Olmalı mı fk_user_role_role?
Nguyen Đức Tâm

@ NguyennĐứcTâm fk-user_role-role
Văn Quyết
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.