Neden birden çok sütunu birincil anahtar olarak kullanmalısınız (bileşik birincil anahtar)


109

Bu örnek w3schools'tan alınmıştır .

CREATE TABLE Persons
(
    P_Id int NOT NULL,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Address varchar(255),
    City varchar(255),
    CONSTRAINT pk_PersonID PRIMARY KEY (P_Id,LastName)
)

Anladığım kadarıyla, her iki sütun birlikte ( P_Idve LastName) tablo için birincil bir anahtarı temsil ediyor Persons. Bu doğru mu?

  • Neden birisi tek bir sütun yerine birincil anahtar olarak birden çok sütunu kullanmak ister ki?
  • Belirli bir tabloda birincil anahtar olarak birlikte kaç sütun kullanılabilir?

... şimdi 2. soru için
Wolf

1
@Martijn Peters. Cevap neden silindi?
PerformanceDBA

Yanıtlar:


119

Anlayışınız doğru.

Bunu birçok durumda yaparsınız. Bir örnek OrderHeaderve gibi bir ilişkide OrderDetail. PK girişi OrderHeaderolabilir OrderNumber. PK, AND OrderDetailolabilir . Bu ikisinden biri olsaydı, benzersiz olmazdı, ancak ikisinin kombinasyonu benzersiz garantilidir.OrderNumberLineNumber

Alternatif, örneğin bu durumda oluşturulmuş (akıllı olmayan) bir birincil anahtar kullanmaktır OrderDetailId. Ama o zaman ilişkiyi her zaman bu kadar kolay göremezsiniz. Bazıları tek yolu tercih eder; bazıları diğer yolu tercih eder.


2
Branch_id kullanıyorsam ve iki veritabanı arasında çoğaltma kullanıyorsam bu yararlı olur mu, kimliklerin kopyasını çözecek mi? !!
Mhmd

11
Üretilmiş bir birincil anahtarın kullanıldığı çoğu durumda, çoğu zaman bileşik değerlerde benzersiz bir anahtar istediğinizi unutmayın.
Bacon Bits

Lütfen "Bazıları bir yolu tercih eder, bazıları diğerini tercih eder" konusunu detaylandırın.
Kullanıcı adı

1
Lütfen detaylandırmak mı? Ne söyleyeceğimi bilmiyorum. Neye baktıklarını anlamak sezgisel olarak daha kolay olduğu için anahtar olarak birden çok birleştirilmiş alanlara sahip olmayı tercih eden insanlar tanıyorum. Yazmak daha kolay ve daha hızlı olduğu için her satıra benzersiz bir anahtar atamayı tercih eden başkalarını da tanıyorum. Sorduğun bu mu?
MJB

Bu mesaj @ Kullanıcı adı içindi. Yönetmeyi unuttum.
MJB

26

Bileşik birincil anahtarlara başka bir örnek, İlişkilendirme tablolarının kullanımıdır. Bir grup kişi içeren bir kişi tablonuz ve bir grup grup içeren bir grup tablonuz olduğunu varsayalım. Şimdi kişi ve grup üzerinde çoktan çoğa bir ilişki oluşturmak istiyorsunuz. Yani, her kişi birçok gruba ait olabilir. Tablo yapısı, bileşik birincil anahtar kullanıldığında nasıl görüneceğidir.

Create Table Person(
PersonID int Not Null,
FirstName varchar(50),
LastName varchar(50),
Constraint PK_Person PRIMARY KEY (PersonID))

Create Table Group (
GroupId int Not Null,
GroupName varchar(50),
Constraint PK_Group PRIMARY KEY (GroupId))

Create Table GroupMember (
GroupId int Not Null,
PersonId int Not Null,
CONSTRAINT FK_GroupMember_Group FOREIGN KEY (GroupId) References Group(GroupId),
CONSTRAINT FK_GroupMember_Person FOREIGN KEY (PersonId) References Person(PersonId),
CONSTRAINT PK_GroupMember PRIMARY KEY (GroupId, PersonID))

harika açıklama: bence m'den n'ye ilişkiler için niteliklere olan ihtiyaç (normalleştirilmiş bir fasılda) anahtardır.
Wolf

belki biraz fayda eklemek daha iyi olurdu
Martian2049

10

W3Schools örneği, bileşik birincil anahtarları ne zaman kullanmanız gerektiğini söylemiyor ve yalnızca diğer anahtarlarla aynı örnek tabloyu kullanarak örnek sözdizimi veriyor.

Örnek seçimleri belki de anlamsız bir anahtar (P_Id) ile doğal bir anahtarı (Soyadı) birleştirerek sizi yanıltmaktadır. Bu garip birincil anahtar seçimi, aşağıdaki satırların şemaya göre geçerli olduğunu ve bir öğrenciyi benzersiz bir şekilde tanımlamak için gerekli olduğunu söylüyor. Sezgisel olarak bu mantıklı değil.

1234     Jobs
1234     Gates

Daha Fazla Okuma: Büyük birincil anahtar tartışması veya sadece Google meaningless primary keysveya hatta bu SO sorusunu inceleyin

FWIW - Benim 2 sentim, çok sütunlu birincil anahtarlardan kaçınmak ve birincil anahtar olarak oluşturulan tek bir kimlik alanını (vekil anahtar) kullanmak ve gerektiğinde ek (benzersiz) kısıtlamalar eklemek.


1
1) "harika birincil anahtar tartışması" bağlantısı özellikle aptalca, bilgi kendi kendine hizmet ediyor ve yanlış. 2) Satırı benzersiz kılan sütunlar üzerindeki dizinden kaçınılamaz. Bir dizine sahip "vekil" kimlik her zaman ek bir sütun ve ek bir dizindir. Gereksiz olduğu için oldukça aptalca. Ve daha yavaş.
PerformanceDBA

2
"Büyük birincil anahtar tartışması" aptalca değil. Bu, sql geliştiricileri veya sql DBA'lar olmayan ve tüm zamanlarını sql'de harcamayan geliştiricilerin çok geçerli bir sorunu. Saf sql'de bile, doğal anahtar olarak n bitlik veriyi geçirmeyi hatırlamak zorunda kalmaktansa, birleştirme sırasında birincil anahtar olarak anlamsız otomatik oluşturulmuş bir anahtara sahip olmayı tercih ederim. Bakış açınıza hoş geldiniz, ancak bu kadar küçümseyici olmamanızı takdir ederiz.
Robert Paulson

4

Birkaç özniteliğin bir kombinasyonunun benzersizliğini sağlamak istediğinizde bileşik anahtar (birden fazla özniteliğe sahip bir anahtar) kullanırsınız. Tek bir özellik anahtarı aynı şeyi başaramaz.


1
Benzersiz bir anahtar sağlamaya gelince, mantıksal olarak kopyalanamayan bir anahtar oluşturmak için iki özniteliğin kombinasyonuna güvenebilirsiniz, daha büyük bir veri kümesindeki Kişi ve mezuniyet tarihi buna bir örnek olabilir.
John Mark

3

Evet, ikisi de birincil anahtarı oluşturur. Özellikle bir vekil anahtarınızın olmadığı tablolarda , her kayıt için benzersiz tanımlayıcı olarak birden çok öznitelik belirtmeniz gerekebilir (kötü örnek: hem adı hem de soyadı olan bir tablo, bunların kombinasyonunu gerektirebilir benzersiz).


3

Bir anahtardaki birden çok sütun, genel olarak, bir vekil anahtardan daha kötü performans gösterecektir. Bir yedek anahtara ve ardından çok sütunlu bir anahtarda benzersiz bir dizine sahip olmayı tercih ederim. Bu şekilde daha iyi performans elde edebilirsiniz ve ihtiyaç duyulan benzersizlik korunur. Ve daha da iyisi, bu anahtardaki değerlerden biri değiştiğinde, 215 alt tablodaki bir milyon alt girişi de güncellemeniz gerekmez.


1
1) Performans. SQL platformunda değil (belki "sql" ve ücretsiz yazılım gibi). 2) Tercih konu dışıdır. Bütünlük için tabloların gerektirdikleriyle ilgilidir. 3) İndeksi olan "vekil" ID her zaman ek bir sütun ve ek bir indekstir. Bu, herhangi bir platformda daha yavaş olacaktır. Yeniden performans, kendinle çelişiyorsun. 4) Efsanevi "215 alt tablodaki milyon çocuk girişini" doğru şekilde nasıl güncelleyeceğinizi bilmiyorsanız , bir soru sorun.
PerformanceDBA

2
'Bir anahtardaki birden fazla sütun, genel olarak, bir vekil anahtardan daha kötü performans gösterecek' ifadesine katılmıyorum. Çoğunlukla, bir ilişkiyi düşündüğünüzde yedek anahtarını almak için fazladan bir sorgu gerekir. Bu noktada tam bir ekstra gidiş-dönüş daha yavaş performans anlamına gelir.
2019

3

İkinci sorunuz

Belirli bir tabloda birincil anahtar olarak birlikte kaç sütun kullanılabilir?

uygulamaya özgüdür: kullanılan gerçek DBMS'de tanımlanmıştır. [1], [2], [3] Kullandığınız veritabanı sisteminin teknik özelliklerini incelemelisiniz. Bazıları çok detaylı, bazıları değil. İnternette bu tür sınırlamalar hakkında araştırma yapmak zor olabilir çünkü terminoloji değişir. Bileşik birincil anahtar terimi zorunlu olmalıdır;)

Açık bilgi bulamazsanız, sınır ihlallerinin (beklenen) kararlı (ve spesifik) işlenmesini bekleyebileceğinizden emin olmak için bir test veritabanı oluşturmayı deneyin. Bununla ilgili doğru bilgileri almak için dikkatli olun: Bazen sınırlar birikir ve farklı veritabanı düzenleriyle farklı sonuçlar görürsünüz.



2

İlişkisel bir veritabanında bir ara tablo kullandığınızda, birden çok tabloda birincil anahtar kullanmak kullanışlı olur.

Bir örnek için yaptığım bir veritabanını ve özellikle bu tablo içindeki üç tabloyu kullanacağım. Birkaç yıl önce bir webcomic için bir veritabanı oluşturdum. Tablolardan birine "çizgi roman" adı verildi - tüm çizgi romanların, başlıklarının, resim dosyası adlarının vb. Listesi. Birincil anahtar "çizgi roman" idi.

İkinci tablo "karakterler" idi - isimleri ve kısa bir açıklama. Birincil anahtar "karakter adı" üzerindeydi.

Her çizgi romanda - bazı istisnalar dışında - birden fazla karakter olduğundan ve her karakter birden fazla çizgi roman içinde göründüğünden, bunu yansıtmak için "karakterlere" veya "çizgi romanlara" bir sütun koymak pratik değildi. Bunun yerine, "çizgi roman" adı verilen üçüncü bir tablo yarattım ve bu, hangi çizgi romanlarda hangi karakterlerin göründüğünün bir listesiydi. Bu tablo esasen iki tabloyu birleştirdiğinden, iki sütuna ihtiyaç duyuyordu: charname ve comicnum ve birincil anahtar her ikisinde de vardı.


1

Tek bir kayıt oluşturan benzersiz sütun değerlerini garanti etmek için bileşik birincil anahtarlar oluştururuz. Yinelenmemesi gereken verilerin eklenmesini engellemeye yardımcı olan bir kısıtlamadır.

ör: Tüm öğrenci kimlikleri ve doğum belgesi numaraları benzersiz bir şekilde tek bir kişiye atanmışsa. Öyleyse, bir kişi için birincil anahtarı, öğrenci kimliği ve doğum belgesi numarasından oluşan bir kompozisyon haline getirmek iyi bir fikirdir, çünkü bu, yanlışlıkla farklı öğrenci kimliklerine ve aynı doğum belgesine sahip iki kişiyi eklemenizi engeller.

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.