Yabancı Anahtar adlandırma şeması


157

Yabancı anahtarlarla ilk kez çalışmaya başlıyorum ve onlar için kullanılacak standart bir adlandırma şeması olup olmadığını merak ediyorum.

Bu tablolar göz önüne alındığında:

task (id, userid, title)
note (id, taskid, userid, note);
user (id, name)

Görevlerde Notlar olduğunda, Görevler Kullanıcılara aittir ve Kullanıcıların Notları yazar.

Bu durumda üç yabancı anahtar nasıl adlandırılır? Ya da alternatif olarak, hiç önemli mi?

Güncelleme : Bu soru, alan adları ile değil, yabancı anahtar isimleriyle ilgilidir!


6
Okuyucular için not: Aşağıda listelenen en iyi uygulamaların çoğu, 30 karakterlik ad sınırlaması nedeniyle Oracle'da çalışmaz. Bir tablo adı veya sütun adı zaten 30 karaktere yakın olabilir, bu nedenle ikisini tek bir adda birleştiren bir kural, bir kesme standardı veya başka numaralar gerektirir.
Charles Burns

Yanıtlar:


181

SQL Server'daki standart kural:

FK_ForeignKeyTable_PrimaryKeyTable

Yani, örneğin, notlar ve görevler arasındaki anahtar:

FK_note_task

Ve görevler ve kullanıcılar arasındaki anahtar şudur:

FK_task_user

Bu size anahtarda hangi tabloların yer aldığına dair 'bir bakışta' bir görünüm sağlar, böylece belirli bir tabloya (adı verilen ilk) hangi tabloların bağlı olduğunu (ikincisi adlandırılır) görmeyi kolaylaştırır. Bu senaryoda tam anahtar seti şöyle olacaktır:

FK_task_user
FK_note_task
FK_note_user

Böylece görevlerin kullanıcılara bağlı olduğunu ve notların hem görevlere hem de kullanıcılara bağlı olduğunu görebilirsiniz.


1
Yabancı anahtar, birincil anahtar yerine ikinci tablodaki bir aday anahtara işaret ederse, bunu nitelendirmek için muhtemelen ad için üçüncü bir segment kullanırsınız. Bu alışılmadık bir durum ve tipik olarak sıfırdan tasarlayacağınız bir durum değil, bu yüzden bunu cevaba dahil etmedim.
Greg Beech

4
Ayırt edilmesini sağlamak için anahtara geçerli tablo adını dahil edersiniz. FK adları SQL Server'daki genel ad alanında olduğundan, iki farklı yabancı anahtar tablosuna FK_PrimaryKeyTable adında iki FK ekleyemezsiniz. Kurallar, diğer veritabanı sunucuları için farklı olabilir.
Greg Beech

Tamam ... Oracle'daki her tablo için farklı ad alanlarına sahibim, bu yüzden öz referansa ihtiyacım yok.
Steve Moyer

30
Bu yaygın bir kullanım gibi görünüyor, ancak aynı masayı işaret eden iki yabancı anahtar olduğunda insanlar ne yapacak? yani messagetablo a sahiptir from_user_idve to_user_idher ikisi de olur fk_message_user. fk_tablename_columnnameBu nedenle (örneğimde fk_message_from_user_id) kullanmak ve ardından hedef tablo hakkında sütun adlarınızı net tutmaya çalışmak bana daha iyi görünüyor (yani, to_user_id açıkça kullanıcı tablosuna atıfta bulunuyor)
Code Commander

Ya her iki tablonun kendisinin de alt çizgileri varsa. user_role ve user_addresses? fk_user_addresses_user_role kafa karıştırıcı değil mi?
Govi S

40

Sınırlayıcı olarak iki alt çizgi karakteri kullanıyorum yani

fk__ForeignKeyTable__PrimaryKeyTable 

Bunun nedeni, tablo adlarının bazen alt çizgi karakterleri içerecek olmasıdır. Bu, genellikle kısıtlamalar için adlandırma kuralını izler, çünkü veri öğelerinin adları sıklıkla alt çizgi karakterleri içerecektir.

CREATE TABLE NaturalPersons (
   ...
   person_death_date DATETIME, 
   person_death_reason VARCHAR(30) 
      CONSTRAINT person_death_reason__not_zero_length
         CHECK (DATALENGTH(person_death_reason) > 0), 
   CONSTRAINT person_death_date__person_death_reason__interaction
      CHECK ((person_death_date IS NULL AND person_death_reason IS NULL)
              OR (person_death_date IS NOT NULL AND person_death_reason IS NOT NULL))
        ...

3
Bu kesinlikle en iyi cevap.
Frederik Krautwald

1
Derby DB'yi çok özel bir adlandırma kuralıyla yarattım ve buradaki en okunaklı ve izlenebilir olanı. Teşekkürler
Anddo

17

Nasıl olur FK_TABLENAME_COLUMNNAME?

K eep ben t S uygu S tupid Mümkün.


22
Çünkü çok sayıda anahtar ve tablo içeren büyük bir db'ye sahip olduğunuzda ve yazılımınızdaki bir şema güncellemesi sırasında bir hata aldığınızda, bir veritabanı oluşturma komut dosyası araması yapmadan yabancı anahtarın nerede tanımlandığını bulmak oldukça zordur.
JohnC

1
@JohnC, FK sütun adlarında sütun adında başka tablo adı varsa, bunu söylemek çok kolay olmamalı mı? Size iki tabloyu ve üzerinde tanımlandığı sütun adını söyler. Ör:FK_Animals_OwnerID
David Sherret

11

Microsoft'tan SQL Server ile ilgili bir not:

Bir FOREIGN KEY kısıtlamasının yalnızca başka bir tablodaki bir PRIMARY KEY kısıtlamasına bağlanması gerekmez; başka bir tablodaki UNIQUE kısıtlamasının sütunlarına başvurmak için de tanımlanabilir.

bu nedenle, geleneksel birincil / yabancı ilişki terimleri yerine bağımlılığı tanımlayan terimler kullanacağım.

Bağımlı (alt) tablodaki benzer şekilde adlandırılmış sütun (lar) ile bağımsız (ana) tablonun PRIMARY KEY'ine referans verirken , sütun adlarını atlıyorum:

FK_ChildTable_ParentTable

Diğer sütunlara referans verirken veya sütun adları iki tablo arasında farklılık gösterir veya sadece açık bir şekilde:

FK_ChildTable_childColumn_ParentTable_parentColumn

9

Genelde PK adlı id bırakıyorum ve ardından diğer tablolardaki FK'leri adlandırırken tablo adımı ve anahtar sütun adımı birleştiriyorum. Camel-casing ile asla uğraşmam, çünkü bazı veritabanları büyük / küçük harf duyarlılığını atar ve yine de tüm büyük veya küçük harf adlarını döndürür. Her durumda, tablolarınızın benim versiyonum şöyle görünecektir:

task (id, userid, title);
note (id, taskid, userid, note);
user (id, name);

Ayrıca tablolarımı tekil olarak adlandırdığıma dikkat edin, çünkü bir satır ısrar ettiğim nesnelerden birini temsil eder. Bu sözleşmelerin çoğu kişisel tercihlerdir. Bir konvansiyon seçmenin ve onu her zaman kullanmanın, başka birinin konvansiyonunu benimsemekten daha önemli olduğunu söyleyebilirim.


heh - aslında kullandığım tam stil budur (ancak camelCase ile) - Bağlantılarını göstermek amacıyla adlara biraz daha fazla açıklama ekleyeceğimi düşündüm.
nickf

Yani en azından birbirimizin şemalarını okuyabiliriz;) ... utanç verici olan şey, birkaç yıl aradan sonra kendinizinkini okuyamamaktır. Şemalarımızı çizmek için ERWin kullanıyoruz, ancak genellikle bir metin sürümüne sahip olmak ve bir kurala sahip olmak, tabloları ve alanları kolayca bulmanızı sağlar.
Steve Moyer

5

Bu muhtemelen aşırı öldürme ama benim için işe yarıyor. Özellikle VLDB'lerle uğraşırken bana çok yardımcı oluyor. Ben aşağıdakileri kullanıyorum:

CONSTRAINT [FK_ChildTableName_ChildColName_ParentTableName_PrimaryKeyColName]

Elbette, herhangi bir nedenle bir birincil anahtara başvurmuyorsanız, benzersiz bir kısıtlamada bulunan bir sütuna başvurmanız gerekir, bu durumda:

CONSTRAINT [FK_ChildTableName_ChildColumnName_ParentTableName_ColumnInUniqueConstaintName]

Uzun olabilir mi, evet. Bilgilerin raporlar için net kalmasına yardımcı oldu mu veya potansiyel sorunun bir hazırlık uyarısı sırasında olduğu konusunda hızlı bir sıçrama sağladı mı?% 100 insanların bu adlandırma kuralı hakkındaki düşüncelerini bilmek ister.


2

Her zamanki yaklaşımım

FK_ColumnNameOfForeignKey_TableNameOfReference_ColumnNameOfReference

Veya başka bir deyişle

FK_ChildColumnName_ParentTableName_ParentColumnName

Ben gibi aynı tabloya başvuran iki yabancı anahtarları adlandırabilir Bu şekilde history_info tablebirlikte column actionBy and actionTogelen users_infotablodan

Gibi olacak

FK_actionBy_usersInfo_name - For actionBy
FK_actionTo_usersInfo_name - For actionTo

Bunu not et:

Alt tablo adını eklemedim çünkü bana sağduyu geliyor, çocuğun masasındayım böylece çocuğun masa adını kolayca alabiliyorum. Toplam karakteri 26 ve Charles Burns'ün burada bir yorumda belirttiği oracle'ın 30 karakter sınırına çok iyi uyuyor.

Okuyucular için not: Aşağıda listelenen en iyi uygulamaların çoğu, 30 karakterlik ad sınırlaması nedeniyle Oracle'da çalışmaz. Bir tablo adı veya sütun adı zaten 30 karaktere yakın olabilir, bu nedenle ikisini tek bir adda birleştiren bir kural, bir kesme standardı veya başka numaralar gerektirir. - Charles Burns


Eğer 3 tablo yinelenen FK_Name tarafından ParentTableName_ParentColumnName aynı masaya FK noktası varsa biri başarısız olur
Tony Dong

0

Buradaki cevaplara ve yorumlara dayalı olarak, FK tablosu, FK alanı ve PK tablosunu (FK_FKTbl_FKCol_PKTbl) içeren bir adlandırma kuralı, FK kısıtlama adı çakışmalarını önlemelidir.

Yani, burada verilen tablolar için:

fk_task_userid_user
fk_note_userid_user

Dolayısıyla, bir görevi veya notu en son kimin değiştirdiğini izlemek için bir sütun eklerseniz ...

fk_task_modifiedby_user
fk_note_modifiedby_user

-2

FK'lerinizi o kadar sık ​​referans almıyorsanız ve MySQL (ve InnoDB) kullanıyorsanız, MySQL'in sizin için FK adını vermesine izin verebilirsiniz.

Daha sonra bir sorgu çalıştırarak ihtiyacınız olan FK adını bulabilirsiniz .


4
Sadece olumsuz oyumu açıklayabilirim. Hemen hemen her veritabanı sistemi, sistemin kısıtlamaları adlandırmasına izin verir. Geri dönüp bir üretim sorunu sırasında, hatta FK__123ee456ff'ın hangi ilişkiyle ilişkili olduğunu deşifre etmeye çalışırken, hatta 100 tablo veritabanıyla hızlı bir şekilde çözmeye çalışmayı hayal edebiliyor musunuz? Basittir ve basitçe KORKUNÇ bir uygulama ortaya koyar. Bu FK'ye bir dizin oluşturduğunuzda ne olacak? sistem de öyle mi? öyleyse IX_007e373f5963 dizini% 98 parçalanmışsa nedenini bulmak için nereye bakacağınızı nasıl bileceksiniz? Sadece yapılmamalı.
SSISPissesMeOff

-3

İlk sekizli yerine FK ve '-' (tire) yerine '_' (alt çizgi) ile üst harfli Sürüm 4 UUID'yi kullanmayı deneyin.

Örneğin

  • FK_4VPO_K4S2_A6M1_RQLEYLT1VQYV
  • FK_1786_45A6_A17C_F158C0FB343E
  • FK_45A5_4CFA_84B0_E18906927B53

Gerekçe şudur:

  • Kesin üretim algoritması => tek tip isimler ;
  • Anahtar uzunluğu, Oracle'da (12c'den önce) adlandırma uzunluğu sınırlaması olan 30 karakterden azdır ;
  • Varlık adınız değişirse , FK'nizi varlık adı tabanlı yaklaşımdaki gibi yeniden adlandırmanıza gerek yoktur (DB, tablo yeniden adlandırma operatörünü destekliyorsa);
  • Yabancı anahtar kısıtlamasının adı nadiren kullanılır. Örneğin, DB aracı genellikle kısıtlamanın ne için geçerli olduğunu gösterir. Şifreli görünümden korkmanıza gerek yok çünkü "şifre çözme" için kullanmaktan kaçınabilirsiniz.
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.