Birincil anahtarların neden kendi adları vardır?


19

Bir tablonun en fazla bir birincil anahtara sahip olduğu kabul edilen matematiksel bir görünümden bakıldığında, birincil anahtarlara basit bir tablo özelliği yerine rastgele bir adla atıfta bulunmak dar görüşlü bir tasarım kararı gibi görünmektedir.

Birincil anahtarı kümelenmemişten kümelenmiş veya tam tersine değiştirmek için, önce adını aramaktan, sonra onu okumanızdan ve daha sonra okumaktan önce.

Görmediğim rasgele adları kullanmanın avantajı var mı veya birincil anahtarlar için rasgele adlar kullanmayan DBMS var mı?

2011-02-22'yi düzenleyin (o tarihte sıralamak istemeyenler için 22/02/2011):

Birincil anahtarın adlarını tablo adından türetebileceğiniz işlevi göstereyim (erken sql-sever aka sybase sistem tablolarını kullanarak):

create function dbo.get_pk (@tablename sysname)
returns sysname
as
begin
    return (select k.name
    from sysobjects o 
        join sysobjects k   on k.parent_obj = o.id 
    where o.name = @tablename
    and o.type = 'U'
    and k.type = 'k')
end
go

Gbn'nin belirttiği gibi, açık bir ad sağlamadığınızda, hiç kimse oluşturulan adı gerçekten sevmez:

create table example_table (
    id int primary key
)

select dbo.get_pk('example_table')  

Yeni aldım

PK__example___3213E83F527E2E1D

Ama neden nesnelerdeki isimler benzersiz olmalı? Tablo ve birincil anahtarı için tam olarak aynı adı kullanmak mükemmel olur.

Bunu yaparak, yanlışlıkla ihlal edilebilecek adlandırma kuralları oluşturmamız gerekmiyordu.

Şimdi Marian cevaplar:

  1. Bir kümeyi kümelenmemiş bir birincil anahtara değiştirme görevini, örnek olarak bırakabilmek için pk'nin gerçek adını bilmem gereken bir örnek olarak kullandım.
  2. İşlerin uygun isimlere sahip olması gerekmez, kolayca benzersiz bir şekilde ifade edilebilirlerse yeterlidir. Bu soyutlamanın temelidir. Nesneye yönelik programlama bu şekilde devam eder. Farklı sınıfların benzer özellikleri için farklı adlar kullanmanız gerekmez .
  3. Bir tablonun bir özelliği olduğu için keyfidir. Tablonun adı, kullanmak isteyip istemediğinizi bilmeniz gereken tek şeydir.

Yanıtlar:


17

Birincil anahtarlar (ve diğer benzersiz kısıtlamalar) dizinler olarak uygulanır ve tamamen aynı şekilde ele alınır - PK'ler ve dizinler için ayrı kod yollarına sahip olmak programcının bakış açısından mantıklı değildir ( hata potansiyeli).

Yabancı anahtarlar tarafından ifade edilmekten başka, PK sadece benzersiz bir kısıtlamadır ve bu da bir dizin olarak uygulanır, bu nedenle bir PK'nın özelliklerini değiştirmek, diğer herhangi bir dizinin özelliklerini değiştirmekle aynıdır. Ayrıca açık bir ada sahip olmak, diğer herhangi bir dizin gibi sorgu ipuçlarında da atıfta bulunulabileceği anlamına gelir.


1
Evet, aynı zamanda PK değiştirilebilirken hangi sütunun kullanıldığı anlamına gelir. Kitaplar için ISBN'yi PK olarak kullanabilirsiniz. ayrı bir kayıt (örneğin kafamın üstünden). Bu yüzden PK alanını benzersiz bir kimlikle değiştirmeniz gerekir.
Nathan MacInnes

1
İfadeyi tercih ederim: "PK bir dizin kullanan bir kısıtlamadır " . Bazen iki kısıtlama (PK ve FK - veya 2 FK) aynı dizini kullanabilir.
ypercubeᵀᴹ

@ypercube "PK, gerçek dünya veritabanlarının% 99,99'unda bir dizin kullanan bir kısıtlamadır" ı tercih ediyorum . gerçek dünya bunu performans nedenleriyle uygulardı.
Pacerier

6

Soruyu tam olarak anladığımdan emin değilim.

Bir tabloda bir dizininiz varsa ve dizini değiştirmek istiyorsanız / gerekiyorsa, onun adına göre de değiştirmeniz gerekmez mi? Ben dizin için objectID bakmak ve güncelleştirme bu şekilde yapabilir, ancak isimleri insanların hangi nesne ile çalıştıklarını mantıksal olarak anlamalarına yardımcı olma eğilimindedir.

Yani, belki de cevap, kullanımda güçlü bir adlandırma kuralınız varsa (yani, Birincil Anahtar için ad_PK), tablonun birincil anahtarıyla çalıştığınızı kolayca belirleyebilmenizdir.

Aynı şey FK ilişkilerini tanımlamak için de söylenebilir. Bence nesnelerin kendilerinin farklı objectID'leri olduğundan, adların kullanımı mantıksal yorumlama için yapılır.


5

Bunun insanın okunabilirliği için bir uygulama detayı olduğunu söyleyebilirim.

Kısıtlama adları (en azından SQL Server) isteğe bağlıdır, ama ben almak istiyorum PK_MyTableiçin MyTableyerinePK_MyTabl___16feb6d8a


3

Tarihsel olarak, Birincil Anahtarlar ve Benzersiz Anahtarlar, Christopher J. Date tarafından öğretildiği gibi Aday Anahtarlar olarak adlandırılır.

Aday Anahtarı, Benzersiz olan ve Birincil Anahtarın rollerini çalabilen bir dizindir. Böylece, tüm Aday Anahtarlar Benzersiz Anahtarlardır. Birincil Anahtar, tablo verilerine erişmek için tercih edilen yöntem olarak Aday Anahtarlarından birinin atanmasıdır.

Bunun ışığında, PRIMARY KEY adı, bir table özelliği olarak eklenen tercih edilen aday anahtarın rasgele adıdır. Yalnızca bir Birincil Anahtar olabilir.

Gerçekte, sadece Aday Anahtarlar oluşturmak yeterli olacaktır.

Bir dizini kümelenmişten kümelenmemiş ve geri değiştirmek yalnızca tanım gereği en fazla 1 olan PRIMARY KEY'i bulma alıştırması olacaktır. Bir PRIMARY KEY tanımına sahip olmanın, veritabanı geliştiricileri için nostalji duygusu olduğunu söyleyebilirim. Bu veritabanı saflığı duygusu, gerçek kelimeler BENZERSİZ ANAHTAR yerine anahtar kelimeler CANDIDATE KEY tarafından benzersiz anahtarlar çağırmış olması gerekir.

Aday Anahtarının Tanımı ve CJDate'in bu konudaki yorumlarını görmek için buraya tıklayın


1

Birincil anahtarın tablo nesnesini temsil edeceğini söyleyecek bir şey yok. Tablo nesnesi, birincil anahtar değil, kümelenmiş dizindir. Birincil anahtarın kümelenmiş dizinle aynı olması gerektiğini söyleyen hiçbir şey yoktur. Genellikle öyle, ama olmak zorunda değil. Birincil anahtar, kümelenmemiş bir dizin tarafından kolayca uygulanabilir.

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.