Soru Birincil Anahtar ve Benzersiz Kısıtlama?
Şu anda yepyeni bir veritabanı tasarlıyorum. Okulda, her masaya bir ana anahtar koymayı her zaman öğrendik.
Çok fazla makale / tartışma / haber grubu yazısı okudum. Bunun yerine, PK yerine kendine özgü kısıtlama (bazı db için benzersiz dizin) kullanmanın daha iyi olduğunu söylüyor.
Bakış açınız nedir?
44
2017-10-01 16:10
Menşei
Cevaplar:
Bu makalelere referans verebilir misiniz?
Denenmiş ve doğru yöntemleri değiştirmek için bir sebep göremiyorum. Sonuçta, Ana Anahtarlar ilişkisel veritabanlarının temel tasarım özelliğidir.
Aynı amacı sunmak için BENZERSİZ kullanmak gerçekten hackish geliyor. Onların mantığı nedir?
Düzenleme: Dikkatim bu eski cevaba geri çekildi. Belki de PK'ye karşı UNIQUE ile ilgili olarak okuduğunuz tartışma, tek başına PK'yi bir tek yapması için bir şey yapan insanlarla uğraşmıştır. Bunun cevabı, eğer bir anahtar ise, o zaman anahtarlayın, aksi halde UNIQUE yapın.
38
2017-10-01 16:55
Birincil Anahtar gerçekten sadece bir aday anahtar NULL için izin vermez. Bu nedenle, SQL terimlerinde, başka hiçbir benzersiz anahtardan farklı değildir.
Ancak, teorik olmayan RDBMS'lerimiz için, Birincil Anahtarınız olmalıdır - Bunu başka türlü iddia etmedim. Bu Birincil Anahtar ise Vekil anahtarı, o zaman sen-meli Ayrıca üzerinde benzersiz kısıtlamalar var doğal anahtar (lar).
Uzaklaşmanın önemli bir yanı, benzersiz kısıtlamalara sahip olmanız gerektiğidir. herşey aday (doğal veya vekil) anahtarları. Daha sonra başvurmak için en kolay olanı seçmelisiniz. Yabancı anahtar Birincil Anahtarınız *.
Ayrıca bir kümelenmiş dizin*. bu could Birincil Anahtarınız veya doğal bir anahtar olmanız gerekir - ancak bunun da olması gerekmez. Kümelenmiş dizininizi tablonun sorgu kullanımına göre seçmelisiniz. Şüphe edildiğinde, Birincil Anahtar, kötü bir ilk tercih değildir.
-
Teknik olarak sadece bir yabancı anahtar ilişkisinde benzersiz bir anahtarı belirtmek için gerekli olmasına rağmen, standart uygulama kabul edilir çokça birincil anahtarı tercih edin. Aslında, bazı RDBMS yalnızca birincil anahtar referanslara izin verirse şaşırmam.
-
Düzenleme: Oracle'ın "kümelenmiş tablo" ve "kümelenmiş dizin" terimlerinin Sql Server'dan farklı olduğuna dikkat çekildi. Oracle-ese’da bahsettiğim şeyin karşılığı bir Dizin Siparişi Tablosu ve OLTP tabloları için tavsiye edilir - ki, bu SO sorularının ana odağı olacaktır. Büyük bir OLAP veri deposundan sorumluysanız, veritabanı tasarımı ve optimizasyonu konusunda kendi fikirlerinizi almanız gerektiğini düşünüyorum.
46
2017-10-01 16:19
Birincil anahtar, özel tedavi için (dizinlerin otomatik oluşturulması, vb.) Sadece bir aday anahtardır (benzersiz bir kısıtlama).
Onlara karşı tartışan milletlerin, bir anahtardan diğerine göre farklı bir muamele yapmak için bir sebep görmediklerini umuyorum. Ben burada duruyorum.
[Düzenle] Görünüşe göre kendi cevabımda bile 50 puan olmadan yorum yapamam.
@chris: Bence bir zararı yok. "Birincil Anahtar" gerçekten sadece sözdizimsel şekerdir. Onları her zaman kullanırım ama kesinlikle gerekli olduğunu düşünmüyorum. Benzersiz bir anahtar gerekli, evet, ancak mutlaka bir birincil anahtar değil.
10
2017-10-01 16:16
Birincil anahtar olmadan bir tabloya sahip olmak isteyeceğiniz çok nadir bir dezenfektasyon olurdu. Birincil anahtarlar, sadece kendi doğası gereği otomatik olarak PK olarak benzersiz kısıtlamalara sahiptir.
Birincil anahtarın ADDITION değerinde bir sütunda benzersizliği garanti etmek istediğinizde benzersiz bir kısıtlama kullanılır.
Her zaman bir PK'ye sahip olmak iyi bir kuraldır.
http://msdn.microsoft.com/en-us/library/ms191166.aspx
9
2017-10-01 19:20
Malısın her zaman Birincil anahtar var.
Bununla birlikte, sorunuzun yalnızca yanlış yönlendirilmiş olduğundan şüpheleniyorum ve aslında, birincil anahtarın her zaman otomatik olarak oluşturulan bir sayı (aynı zamanda temsilci anahtarı olarak da bilinir) veya gerçek anlamlı veri olan (aynı zamanda doğal olarak da bilinir) benzersiz bir alan olması gerekip gerekmediğini sormak istersiniz. anahtar), insanlar için SSN, kitapların ISBN'si vb.
Bu soru, DB alanındaki bir yaş eski dini savaştır.
Benim aldığım şey, gerçekten eşsiz ve asla değişmezse, doğal anahtarların tercih edilmesidir. Ancak, dikkatli olmalısınız, SSN'nin belirli koşullar altında değişebileceği gibi, görünüşte istikrarlı bir şey bile olmalısınız.
5
2017-10-01 16:17
Birincil anahtarlar, bu tablodan ilişki kuracağınız durumlarda bu değere referans verecek diğer tablolara kullanılmalıdır. Bununla birlikte, tablonun yapısına ve benzersiz kısıtlamayı uyguladığınızı düşündüğünüz verilere bağlı olarak, o belirli alanı bir vekil anahtar oluşturmak zorunda kalmak yerine doğal bir birincil anahtar olarak kullanabilirsiniz. Tabi ki, doğal anahtarlara karşı temsilci bir başka tartışmadır. :)
Bu tablo ve diğer tablolar arasında hiçbir ilişki kurulmayacaksa benzersiz anahtarlar kullanılabilir. Örneğin, yeni bir kullanıcı kaydı veya bazılarını eklemeden önce karşılaştırılacak geçerli e-posta adreslerinin bir listesini içeren bir tablo. Veya benzersiz anahtarlar, birincil anahtara sahip bir tabloda değerleriniz olduğunda, ancak aynı zamanda kesinlikle benzersiz olması gerektiğinde de kullanılabilir. Örneğin, kullanıcı adına sahip bir kullanıcı tablonuz varsa. Kullanıcı adını birincil anahtar olarak kullanmak istemezsiniz, ancak giriş yapmak için kullanabilmesi için benzersiz olması gerekir.
3
2017-10-01 18:20
Tablo, üzerinde çalışırken verileri düzenlemek için geçici bir tablo olmadığı sürece, her zaman masaya birincil anahtar koymak istersiniz ve işte neden:
1 - benzersiz bir kısıtlama, boş değerlere izin verebilir, ancak birincil anahtar olabilir asla boş değerlere izin verir. Boş değerler içeren sütunlarda bir birleştirmeyle bir sorgu çalıştırırsanız, null değeri null değerine eşit olmadığından sonuçta elde edilen veri kümesinden bu satırları kaldırırsınız. Büyük şirketlerin bile muhasebe hataları yapabilmeleri ve karlarını yeniden belirlemeleri bu şekilde gerçekleşiyor. Sorguları, toplamına dahil edilmesi gereken belirli satırları göstermediler çünkü benzersiz endekslerinin bazı sütunlarında boş değerler vardı. Shoulda birincil anahtar kullandı.
2 - benzersiz bir dizin, birincil anahtara otomatik olarak yerleştirilir, böylece bir tane oluşturmanız gerekmez.
3 - çoğu veritabanı motoru otomatik olarak kümelenmiş bir dizini birincil anahtar üzerine koyar, satırlar veri bloklarında bitişik olarak saklandığından sorguları daha hızlı yapar. (Bu, sorguları hızlandıracak şekilde kümelenmiş dizini farklı bir dizine yerleştirmek için değiştirilebilir.) Bir tablonun kümelenmiş bir dizini yoksa, satırlar veri bloklarında bitişik olarak depolanmayacak ve sorgular oluşturulmayacaktır. daha yavaş çünkü okuma / yazma kafası verileri toplamak için diskin her tarafına gitmelidir.
4 - Birçok ön uç geliştirme ortamı, tabloyu güncellemek veya silme yapmak için birincil anahtar gerektirir.
3
2017-10-01 18:51
Mantıksal yapılar ve fiziksel yapılar arasında ve benzer şekilde teori ve pratik arasında bir ayrım yapmamız gerekiyor.
Bununla başlamak için: teorik bir bakış açısıyla, birincil bir anahtarınız yoksa, bir tablonuz yoktur. Sadece bu kadar basit. Dolayısıyla, sorunuz, tablonuzun birincil anahtarı (tabii ki gerekir) olmalı, ancak RDBMS'nizde nasıl etiketlediğiniz değildir.
Fiziksel düzeyde, çoğu RDBMS, Birincil Dizin kısıtını Benzersiz Dizin olarak uygular. Seçtiğiniz RDBMS bunlardan biri ise, birincil Anahtar olarak bir sütun tanımlamak ve sadece sütuna benzersiz bir kısıtlama koymak arasında çok pratik bir fark yoktur. Ancak: bu seçeneklerden biri amacınızı ele geçirir ve diğeri olmaz. Yani karar, no-brainer.
Ayrıca, bazı RDBMS'ler, Ana Anahtarlar uygun şekilde etiketlendiğinde, örneğin şemalama ve yarı otomatik yabancı anahtar kısıtlama desteği gibi ek özellikler sağlar.
Genel Kurallar yerine Ana Anahtarlar yerine Benzersiz Kısıtlamaları kullanmanız gerektiğini söyleyen herkes güzel bir lanetlenmiş iyi bir neden sunmalıdır.
2
2017-10-01 16:18
asıl anahtar, bir tablonun tek bir kaydını tek bir şekilde tanımlayan bir veya daha fazla sütun olabilir; burada, Benzersiz Kısıtlama, bir tabloda sadece belirli bir veri elemanının sadece tek bir örneğini sağlayan bir alan üzerinde bir kısıtlamadır.
PERSONALLY, tablolarım arasında çapraz referans vermek için kullanılan benzersiz anahtarlar için GUID veya otomatik artımlı BIGINTS (SQL SERVER için Identity Insert) kullanıyorum. Sonra kullanıcının belirli kayıtları seçmesine izin vermek için diğer verileri kullanacağım.
Örneğin, çalışanların bir listesini alacağım ve sahne arkasında kullandığım her kayda bir GUID ekledim, ancak kullanıcı bir çalışanı seçtiğinde, aşağıdaki alanları temel alarak bunları seçiyorlar: LastName + FirstName + ÇalışanNumber.
Bu anahtardaki birincil anahtarım, LastName + FirstName + EmployeeNumber, benzersiz anahtar ise ilişkili GUID'dir.
1
2017-10-01 19:02