Her zaman bir autoincrement integer birincil anahtarına sahip olmak iyi bir uygulama mıdır?


191

Veri tabanlarımda, yaptığım idher tablo için adında otomatik artan bir tamsayı birincil anahtarına sahip olma alışkanlığına alışma eğilimindeyim, böylece herhangi bir satır için benzersiz bir arama yapabilirim.

Bu kötü bir fikir olarak mı kabul edilir? Bu şekilde yapmanın sakıncaları var mı? Bazen gibi birden indeksleri olacak id, profile_id, subscriptionsnereye idbenzersiz tanımlayıcı olan, profile_idYabancı Yabancı bağlanan ida Profilemasa, vb

Veya böyle bir alan eklemek istemediğiniz senaryolar var mı?


61
Basit bir otomatik artış tanımlayıcısının bir sorun olduğu bir örnek için Alman tank sorununa bir göz atın . Elbette bu sadece kimliklerinizi halka açık yerlerde kullanıyorsanız önemlidir.
Bergi

24
@ArukaJ Mesele sistem hakkında bazı bilgiler sızdırıyor olmasıdır. Örneğin, veritabanının, her biri sıralı bir kimliğe sahip, kullanıcı tarafından yazılmış yayınları içerdiğini varsayalım. Her biri bir kimlik belirten dört gönderi yaptığınızı söyleyin: 04:00 (20), 05:00 (25), 20:00 (100) ve 09:00 (200). ID'lere bakarak, sabah saat 04:00 ile 09:00 arasında yalnızca 5 mesajın eklendiğini, sabah saat 4 ile akşam 5 arasında eklendiğini görebilirsiniz. Bir hizmet reddi saldırısı için zaman ayırmaya çalışıyorsanız, bu değerli bilgiler olabilir.
Joshua Taylor,

29
"Alman tank problemi" hakkında şikayette bulunan herkes için .... birisinin verilere erişmesini engelleyen tek şey URL’nizde anahtar olmamalıysa, GUID ve Auto INT’den daha büyük sorunlarınız var.
Matthew Whited,

11
@MatthewWhited Sadece bir URL'deki parametreleri değiştirmekle ilgili değil. Bir site kullandığınızı ve o sırada 100 tdeğerini ve aynı anda 120 değerini oluşturduğunuzu varsayalım t + 60. Bu kimlikleri (100 ve 120) her ikisinin de net olmayan bir şekilde görebiliyorsanız, artık var olan toplam varlık sayısını ve kabaca yaratılma oranlarını biliyorsunuz. Bu bilgi sızıntısı. Bu tamamen varsayımsal değildir.
Chris Hayes,

15
"Bu iyi bir uygulama mı hep sayılı ..."
brian_o

Yanıtlar:


137

Garantili benzersiz bir satır tanımlayıcısına sahip olmak hiçbir zaman kötü bir fikir değildir. Sanırım asla dememeliyim - ama hadi zamanın büyük çoğunluğuyla başlayalım, bu iyi bir fikir.

Teorik potansiyel olumsuz taraflar, bakımı için ekstra bir indeks ve kullanılan ilave depolama alanını içerir. Bu asla kullanmamam için bir sebep olmamıştı.


11
İşte bu yaptığım şey. Çoğu kişi ya 'id' ya da 'tablename_id' kullanır (örneğin user_id). Argüman tipik olarak eğer sütun gerekliyse değil, hangi şekilde isimlendirileceğidir.
GrandmasterB

103
Şahsen tablo adının gerisini ima etmesi gerektiğini düşünüyorum. TableName.idaksine TableName.TableName_id, başka neye idişaret edecek? Tabloda başka bir kimlik
alanım

10
Bahsettiğiniz @ArukaJ SQLite kullanıyorsunuz. Bu, aslında her zaman 'başlığın altında' bir sütun oluşturduğu için, özel bir durumdan biraz bahseder. Böylece fazladan boşluk bile kullanmıyorsunuz, çünkü ister isteseniz de bir tane olsun. Ayrıca, SQLite'ın kabadayı her zaman 64bit bir tam sayıdır. Anlayışım doğruysa, otomatik artan bir satır tanımlarsanız, iç satırın takma adı olur. Öyleyse her zaman iyi yapabilirdin! Bakınız sqlite.org/autoinc.html
GrandmasterB

9
Aklıma gelen tek istisna, başka bir şekilde üretilmiş benzersiz bir tanımlayıcınız varsa, bu durumda birincil anahtar olmalı ve otomatik artan kimliği gereksizdir.
HamHamJ

4
@GrandmasterB: SQLite'nın şimdiki sürümü, optimizasyon olarak WITHOUT ROWIDtabloların oluşturulmasına (açık PRIMARY KEY) izin veriyor . Ancak, aksi takdirde, bir INTEGER PRIMARY KEYsütun, kabadayı için bir diğer addır.
dan04 23

92

Daha önce bütün cevaplara katılmıyorum. Tüm tablolara otomatik bir artış alanı eklemenin kötü bir fikir olmasının birçok nedeni vardır.

Açık anahtarların olmadığı bir tablonuz varsa, otomatik artış alanı iyi bir fikir gibi görünür. Ne de olsa istemezsin select * from blog where body = '[10000 character string]'. Tercih edersin select * from blog where id = 42. Bu vakaların çoğunda, gerçekten istediğin şeyin benzersiz bir tanımlayıcı olduğunu; sıralı bir benzersiz tanımlayıcı değil. Muhtemelen bunun yerine evrensel olarak benzersiz bir tanımlayıcı kullanmak istersiniz.

Çoğu veritabanında rastgele benzersiz tanımlayıcılar üretmek için işlevler vardır ( uuidmysql, postgres. newid, Mssql). Bunlar, farklı makinelerde, herhangi bir zamanda, aralarında ağ bağlantısı olmayan birden çok veritabanında veri oluşturmanıza ve verileri yine de sıfır çakışmalarla birleştirmenize olanak tanır. Bu, örneğin mikro servislerde olduğu gibi çoklu sunucuları ve hatta veri merkezlerini daha kolay kurmanıza olanak sağlar.

Bu ayrıca, saldırganların, URL’lerin erişememesi gereken sayfalara ilişkin tahmininde bulunmalarını engeller. Bir varsa https://example.com/user/1263muhtemelen bir https://example.com/user/1262de var. Bu, kullanıcı profili sayfasında bir güvenlik açığının otomasyonuna izin verebilir.

Ayrıca, bir uuid sütunun işe yaramaz ve hatta zararlı olduğu birçok durum vardır. Diyelim ki sosyal bir ağınız var. Bir usersmasa ve bir friendsmasa var. Arkadaşlar tablosu iki kullanıcı kimliği ve bir otomatik artış alanı içerir. 3Arkadaş olmak istiyorsun 5, bu yüzden 3,5veritabanına ekle . Veritabanı bir otomatik artış kimliği ekler ve depolar 1,3,5. Her nasılsa, kullanıcı 3"arkadaş ekle" düğmesini tekrar tıklatıyor. 3,5Veritabanına tekrar eklerseniz , veritabanı bir otomatik artış kimliği ekler ve ekler 2,3,5. Ama şimdi 3ve 5iki kez arkadaşız! Bu bir alan kaybıdır ve eğer bunu düşünürseniz, otomatik artış sütunu da öyle. Tüm yapmanız gereken eğer avebarkadaşlar ise bu iki değere sahip satır için seçmektir. Birlikte benzersiz bir satır tanımlayıcısıdırlar. (Muhtemelen emin olmak 3,5ve 5,3kesinti yapmak için bazı mantıklar yazmak istersiniz .)

Bir URL kısaltıcı oluştururken olduğu gibi sıralı id'lerin yararlı olabileceği durumlar vardır, ancak çoğunlukla (ve hatta URL kısaltıcıyla bile) rastgele oluşturulmuş benzersiz bir kimlik, bunun yerine gerçekten kullanmak istediğiniz şeydir.

TL; DR: Her satırı tanımlamak için benzersiz bir yönteminiz yoksa, otomatik artış yerine UUID'leri kullanın.


26
UUID'lerle ilgili sorun, tabloların çoğu için çok fazla yer kaplamalarıdır. Her tablo için doğru benzersiz tanımlayıcıyı kullanın.
Stephen

49
Özgünlük hakkındaki tüm paragraf tartışmalıdır - özgünlük, bir birincil anahtarla veya anahtarsız olarak uygulanabilir. Ayrıca, UUID'ler teorik olarak daha iyidir, ancak DBA görevlerinde hata ayıklama / uygulama yaparken veya "saldırılara direnmeyen" herhangi bir şey yaparken kullanmaları berbattır.

11
UUID'ler daha iyi olduğunda başka bir senaryo: belirsiz bir PUT işlemi uygulamak, böylece yinelenen satırlar eklemeden istekleri güvenle yeniden deneyebilirsiniz.
saat

21
"URL tahmini" noktasında, benzersiz bir kimliğe (sıralı veya başka şekilde) sahip olmak, bu kimliği uygulamanın kullanıcılarına göstermek anlamına gelmez.
Dave Sherohman

7
Tamamen bir veritabanı bakış açısından, bu cevap tamamen yanlıştır. Otomatik artan tamsayılar yerine UUID'lerin kullanılması, dizinleri çok hızlı büyütür ve performansı ve bellek tüketimini olumsuz etkiler. Web servisi veya web uygulaması açısından konuşuyorsanız, yine de veritabanı ile ön uç arasında bir katman olmalıdır. Başka bir şey kötü tasarım. Verileri birincil anahtar olarak kullanmak daha da kötüdür. Birincil anahtarlar yalnızca veri katmanında, başka hiçbir yerde kullanılmamalıdır.
Sarhoş Kod Maymun

60

Oto iç tuşlar çoğunlukla avantajlara sahiptir.

Ancak bazı olası dezavantajlar şunlar olabilir:

  • Bir işletme anahtarınız varsa, işletme kurallarını uygulamak için de bu sütunlara benzersiz bir dizin eklemeniz gerekir.
  • İki veri tabanı arasında veri aktarırken, özellikle veri birden fazla tablodayken (örn. Ana / ayrıntı), sıralar veri tabanları arasında senkronize edilmediğinden ileri doğru değildir ve ilk önce bir eşdeğerlik tablosu oluşturmanız gerekecektir. Hedef veritabanındaki hangi kimliğin orijin veritabanındaki hangi kimliğe karşılık geldiğini bilmek için bir iş anahtarı Bununla birlikte, yalıtılmış tablolardan / yalıtılmış tablolara veri aktarırken sorun olmamalıdır.
  • Pek çok işletme geçici, grafiksel, göster ve tıkla, sürükle ve bırak raporlama araçlarına sahiptir. Kendiliğinden özdeş kimlikler anlamsız olduğu için, bu tür kullanıcılar "uygulama" dışındaki verileri anlamayı zor bulacaktır.
  • Eğer iş anahtarını yanlışlıkla değiştirirseniz, insanın tanımlayabilmesi için artık bir şeyiniz olmadığından, bu satırı asla geri kazanamayacaksınız. Bu bir kez BitCoin platformunda bir hataya neden oldu .
  • Bazı tasarımcılar, PK'nın iki yabancı kimlikten oluşması gereken iki tablo arasındaki birleşme tablosuna bir kimlik eklerler. Açıkçası, birleştirme tablosu üç veya daha fazla tablo arasındaysa, o zaman bir otomatik kimlik numarası mantıklıdır, ancak iş kurallarını uygulamak için FK'lerin kombinasyonuna uygulandığında benzersiz bir anahtar eklemeniz gerekir.

İşte vekil anahtarların dezavantajları hakkında bir Wikipedia makale bölümü .


13
Mt.gox kusurunu vekil tuşlar üzerinde suçlamak oldukça şüpheli görünüyor. Sorun, bileşik anahtarlarındaki tüm alanları, hatta değişken / dövülebilir alanları bile içermeleriydi.
CodesInChaos

6
Otomatik artış anahtarlarının kullanılmasının "sosyal" bir dezavantajı, bazen "işletme" nin, başarısız bir ekleme gerçekleştiğinde gerçekleşen eksik satırlara ne olduğunu bilmek için hiçbir boşluk kalmaması ve talep edilmesinin gerekmediğini varsaymasıdır (işlem geri dönüşü).
Rick Ryker

4
Diğer bir dezavantaj, eğer sistem o kadar büyürse, veritabanını parçalamak zorunda kalacağınız zaman, artık global olarak benzersiz bir anahtar üretmek için otomatik düzeltme kullanamazsınız. Bu noktaya geldiğinizde, bu varsayıma dayanan birçok kodunuz olabilir. Veritabanı paylaşılırsa çalışmaya devam edecek benzersiz bir tanımlayıcı üretmenin başka yolları da vardır.
kasperd

1
@Voo Seçtiğiniz veritabanının bunu desteklediği garanti edilmez. Ve veritabanının kendisinden daha yüksek bir katman oluşturmaya çalışmak, SQL'in size sağlayacağı garantilerin bir kısmını kaybettiğiniz anlamına gelir. Son olarak, herhangi bir merkezi kimlik ataması, dağıtık bir sisteminiz varsa gecikmeyi artıracaktır.
kasperd

1
Elbette, sistemin ölçeğine bakılmaksızın, oto-kimliklendirilmiş kimliklerin doğası hakkında çok fazla varsayımda bulunulmamalıdır. Yalnızca tek bir veritabanınız varsa, sırayla atanır, ancak sırayla işlediğinin garantisi yoktur. Ve tüm işlemler taahhüt edilmediğinden, sıralamada boşluk olabilir.
kasperd

20

Aksine, Hayır, her zaman bir sayısal AutoInc PK’ya sahip olmanıza gerek yok.

Verilerinizi dikkatli bir şekilde analiz ederseniz, verilerdeki doğal anahtarları genellikle belirlersiniz. Bu genellikle verinin işletme için kendine özgü bir anlamı olduğunda söz konusudur. Bazen PK'ler, işletme kullanıcılarının, sistem özelliklerini tanımlamak için ikinci bir dil olarak kullandıkları eski sistemlerden gelen eserlerdir. Örneğin filo yönetim sisteminde "Araç" masasının ana anahtarı olarak kullanılan araç VIN numaralarını gördüm.

Bununla birlikte, ortaya çıktıysa, zaten benzersiz bir tanımlayıcınız varsa kullanın. İkinci, anlamsız bir birincil anahtar oluşturmayın; israflıdır ve hatalara neden olabilir.

Bazen bir müşteriye anlamlı değer üretmek için bir AutoInc PK kullanabilirsiniz, örneğin Politika Numaraları. Başlangıç ​​değerini anlamlı bir şeye ayarlamak ve önde gelen sıfırlar vb. İş kurallarını uygulamak. Bu muhtemelen "her iki dünyanın da en iyisi" yaklaşımıdır.

Göreceli olarak statik olan az sayıda değeriniz varsa, sistem kullanıcısına duyarlı olan değerleri kullanın. L, C, H'yi kullanabiliyorken neden 1,2,3 kullanmalı, burada L, H ve C sigorta, "Politika Türü" bağlamında Life, Car and Home'u temsil eder veya VIN örneğine dönersek, "TO" "Toyota için mi? Tüm Toyata otomobillerinin "TO" başlatan bir VIN'si var, kullanıcıların hatırlamaları için daha az şey var, programlama ve kullanıcı hatalarını ortaya koymalarını daha az olası kılıyor ve raporları daha basit hale getiren yönetim raporlarında tam bir açıklama için kullanılabilir bir destekleyici bile olabilir yazmak ve belki daha hızlı üretmek.

Bunun daha da gelişmesi, muhtemelen "çok uzak bir köprü" dür ve genel olarak bunu tavsiye etmiyorum, ancak bütünlüğünü dahil ediyorum ve bunun için iyi bir kullanım bulabilirsiniz. Başka bir deyişle, Açıklama'yı Ana Anahtar olarak kullanın. Hızla değişen veriler için bu bir istismardır. İçin çok üzerinde bildirilmektedir statik veriler Tüm Zamanların , belki de değil. Sadece söylüyorum ki orada bir olasılık olarak oturuyor.

AutoInc PK'ları kullanıyorum, sadece beynimi çalıştırıyorum ve önce daha iyi alternatifler arıyorum. Veri tabanı tasarımı sanatı hızlıca sorgulanabilecek anlamlı bir şeydir. Çok fazla birleşme olması bunu engelliyor.

EDIT Otomatikleştirilmiş bir PK'ye ihtiyaç duymadığınız diğer bir önemli durum, diğer iki tablonun kesişimini temsil eden tablolardır. Araba benzetmesine sadık kalabilmek için, Bir Arabada 0. Aksesuar var, Her Aksesuar birçok arabada bulunabilir. Bunu temsil etmek için, Araba ve Aksesuarlardan PK'leri ve bağlantı Tarihleri ​​vb. İle ilgili diğer bilgileri içeren bir Car_Accessory tablosu oluşturursunuz.

İhtiyacınız olmayan (genellikle) bu masadaki bir AutoInc PK'dir - arabaya yalnızca "bu araçta hangi aksesuarların olduğunu söyle" veya Aksesuar "dan" hangi araçların bu aksesuara sahip olduğunu söyleyin "üzerinden erişilir


4
> Tüm Toyata otomobillerinde "TO" ile başlayan bir VIN var. Bu sadece doğru değil. Japonya'da yapılırsa "JT" ile başlarlar. Amerikan yapımı Toyota'lar bambaşka Vins var en.wikibooks.org/wiki/...
Monty Harder

17
Don't create a second, meaningless primary key; it's wasteful and may cause errors.Ancak, bir kayıt için benzersiz olma şekliniz 6 sütunun bir birleşimi ise, o zaman her zaman 6'ya katılarak başlı başına bir hata yapabilirsiniz. Verilerin doğal olarak bir PK'si var, ancak idbu 6 sütunda bir sütun ve benzersiz bir kısıtlama kullanmanız daha iyi olacaktır .
Brad,

14
Bu önerilerden bazılarının benim için biraz uzağa gittiğini itiraf ediyorum. Evet, pragmatik olmak iyi, ama birisinin ilk doğanın hayatını ne kadar sık yemin ettiğini, alan dışından gelen bir özelliğin geri kalan günler için benzersiz kalacağını sayamıyorum. Genelde, ilk kopyalandığında, canlı yayına girdikten sonraki ikinci haftaya kadar iyi çalıştı. ;) PK olarak bir "açıklama" kullanmak çok uzaktır.
AnoE

2
@Monty, benim hatam, haklısın. Yanlış hafıza, filo yönetim sistemlerini tasarladığımdan bu yana 20 yıl geçti. Hayır, VIN birincil anahtar değildi :) Ben unuttum bir şey yol açan bir AutoInc Asset_ID IIRC kullandım. Arabaya aksesuara (örneğin sunroof) bağladığınız birçok-çok ilişkinin bağlayıcısı olan tablolar Birçok aracın birçok aksesuarı vardır; bir AutoInc PK.
mcottle

7
Gerçekten kaç tane değişmez "doğal anahtar" olduğu gerçekten şaşırtıcı. SSN en? Hayır, değişebilirler. Nadirdir, ancak olabilir. Kullanıcı adları? Hayır! Sonunda birinin değişmesi için geçerli bir ticari nedeni olacak. VIN genellikle bir ders kitabı örneğidir, ancak çok fazla yoktur. Sokak isimleri de olsa, ev adresleri bile değişebilir.
Erik Funkenbusch

12

Pek çok tablonun zaten doğal bir benzersiz kimliği var. Bu tablolara başka bir benzersiz kimlik sütunu (otomatik artış veya başka türlü) eklemeyin. Bunun yerine doğal benzersiz kimliği kullanın. Başka bir benzersiz kimlik eklerseniz, esas olarak verilerinizde fazlalık (çoğaltma veya bağımlılık) olur. Bu normalleşme ilkelerine aykırıdır. Bir benzersiz kimlik, doğruluk için diğerine bağlıdır. Bu da mükemmel senkronize tutulması gerektiği anlamına gelir her zaman içinde her sistemde bu satırları yönetir. Veri bütünlüğünüzdeki bir başka kırılganlık, uzun vadede gerçekten yönetmek ve onaylamak istemediğiniz şeydir.

Bugünlerde çoğu tablo, ek bir benzersiz kimlik sütununun vereceği çok küçük bir performans artırmasına gerçekten ihtiyaç duymuyor (ve bazen performanstan bile düşüyor). BT'de genel bir kural olarak veba gibi fazlalıktan kaçının ! Size önerildiği her yere direnin. Bu bir anathema. Ve alıntıyı dikkate al. Her şey mümkün olduğunca basit olmalı, ancak daha basit olmamalıdır. Doğal olan daha az düzenli görünse bile, birinin yeteceği iki benzersiz kimlik yok.


3
Asla değişmeyeceğinin kesin garantisi varsa, "doğal" kimlikleri yalnızca birincil anahtar olarak kullanmamalı mıydınız? Örneğin, bir ehliyet numarasını birincil anahtar olarak kullanmamalısınız, çünkü bir kişi yeni bir ehliyet alırsa, yalnızca bu tabloyu değil, yabancı anahtarlara başvuran tabloları da güncellemeniz gerekir!
ekolis

1
Sürücü ehliyet numarasının doğal bir benzersiz kimlik olarak nitelenmemesinin birkaç nedeni vardır. Öncelikle, bazıları doğum tarihi ve adı gibi diğer verilerden türetilmiştir. Eyaletler arasında benzersiz olmaları garanti edilmez. Ve bir örnek vermek gerekirse, bir kişiye aynı numaraya sahip bir lisansı yeniden verdiğinde, ancak uzatılmış bir kullanım süresi bittiğinde, sonra ne olacak? Aynı numaraya sahip farklı lisansları var. Doğal bir kimlik hala bir birincil anahtarın temel özelliklerini yerine getirmek zorundadır. Ehliyet numarası (en azından ABD'de) bu konuda bazı eksikliklere sahiptir.
Brad Thomas

1
Tamam, sanırım doğal kimliğin tanımını yanlış anladım; Değişmez olması gerçekten garanti edilip edilmediği, sadece iş kuralları tarafından tanımlanan bir kimlik olduğunu düşündüm.
ekolis

10

Daha büyük sistemlerde, ID tutarlılık arttırıcıdır, hemen hemen her yerde kullanırsınız. Bu bağlamda, bireysel birincil anahtarlar önerilmemektedir, bunlar en alt satırda pahalıdır (nedenini okuyun).

Her kuralın bir istisnası vardır, bu nedenle, dışa aktarma / içe aktarma için kullanılan hazırlama tablolarında ve benzer tek yönlü tablolarda veya geçici tablolarda tam sayı otomatik ekleme kimliğine ihtiyacınız olmayabilir. Ayrıca, dağıtılmış sistemlerdeki kimlikleri yerine GUID'leri tercih edersiniz.

Buradaki birçok cevap, mevcut benzersiz anahtarın alınması gerektiğini göstermektedir. Peki 150 karakter olsa bile? Sanmıyorum

Şimdi ana noktam:

Autoincrement integer ID karşıtlarının 20 tabloya kadar olan küçük veritabanları hakkında konuştukları görülüyor. Orada her tabloya bireysel yaklaşım sağlayabiliyorlar.

AMA 400'den fazla masaya sahip bir ERP'ye sahip olduğunuzda, her yerde tam sayı otomatik ekleme kimliğine sahip olmak (yukarıda belirtilen durumlar hariç) çok mantıklı geliyor. Eşsiz olmaları için mevcut ve güvencede olsalar bile diğer benzersiz alanlara güvenmiyorsunuz.

  • Evrensel zaman kazandıran, çaba tasarrufu sağlayan, hatırlaması kolay olan sözleşmeden faydalanırsınız.
  • Çoğu durumda JOINmasaları, anahtarların ne olduğunu kontrol etmenize gerek kalmaz.
  • Tamsayılı otomatik değiştirme sütununuzla çalışan evrensel kod yordamlarına sahip olabilirsiniz.
  • Sisteminizi, daha önce öngörülmeyen yeni tablolarla veya kullanıcı eklentileriyle genişleterek, mevcut tabloların kimlik numaralarına başvurabilirsiniz. Zaten baştan beri oradalar, ek olarak ilave etmenin maliyeti yok.

Daha büyük sistemlerde, bu birincil anahtarların önemsiz yararlarını görmezden gelmeye değer olabilir ve çoğu durumda sürekli tamsayı otomatik ekleme kimliğini kullanır. Mevcut benzersiz alanları birincil anahtarlar olarak kullanmak, kayıt başına bazı baytları kurtarıyor olabilir, ancak ek depolama veya endeksleme süresi günümüzün veritabanı motorlarında sorun çıkarmaz. Aslında, geliştiricilerin / bakımverenlerin boşa harcanan zamanlarında çok daha fazla para ve kaynak kaybediyorsunuz. Günümüzün yazılımı, programcıların zaman ve çabaları için optimize edilmelidir - tutarlı ID'lerle hangi yaklaşım daha iyi sonuç verir?


Kişisel deneyimimden cevabınızın ikinci yarısına gönülden katılıyorum. Hızlı ve kompakt dizinlere gerek duyduğunuzdan çok daha az sıklıkla, dünya çapında benzersiz anahtarlara ihtiyacınız olacak. İhtiyacınız olursa, otomatik olarak oluşturulmuş bir ID ve bir UUID sütunu olan bir GlobalEntities tablosu oluşturun. Ardından, örneğin Müşteriler tablosuna bir ExGlobalEntityId yabancı anahtarı ekleyin. Veya bazı değerlerin bir karma değerini kullanın.
Sarhoş Kod Maymun

8

Gereksiz tasarımlar yapmak iyi bir uygulama değildir. Yani - gerekli olmadığında her zaman bir otomatik artış int birincil anahtarına sahip olmak iyi bir uygulama değildir.

İhtiyacı olmayan bir örnek görelim.

Makaleler için bir tablonuz var; bunun bir int birincil anahtarı idve adında bir varchar sütunu var title.

Ayrıca, makale kategorileriyle dolu bir tablonuz var; idint birincil anahtar, varchar name.

Makaleler tablosundaki bir satırda id5 ve title "Tereyağlı kaz nasıl pişirilir". Bu makaleyi, Kategoriler tablonuzda bulunan aşağıdaki satırlara bağlamak istersiniz: "Kanatlı" ( id : 20), "Kaz" ( id : 12), "Yemek Yapma" ( id : 2), "Tereyağı" (id: 9) .

Şimdi 2 tablonuz var: makaleler ve kategoriler. İkisi arasındaki ilişkiyi nasıl yaratırsınız?

3 sütunlu bir tablonuz olabilir: id (birincil anahtar), article_id (yabancı anahtar), category_id (yabancı anahtar). Ama şimdi şöyle bir şeyin var:

| id | a_id | c_id |
| 1 | 5 | 20 |
| 2 | 5 | 12 |
| 3 | 5 | 2 |

Daha iyi bir çözüm, 2 sütundan oluşan bir birincil anahtara sahip olmaktır.

| a_id | c_id |
| 5 | 20 |
| 5 | 12 |
| 5 | 2 |

Bu yaparak gerçekleştirilebilir:

create table articles_categories (
  article_id bigint,
  category_id bigint,
  primary key (article_id, category_id)
) engine=InnoDB;

Bir otomatik artış tamsayı kullanmamak için başka bir neden, birincil anahtarınız için UUID kullanıyorsanız.

UUID'ler, tanımlarına göre benzersizdir; bu, benzersiz tamsayıları kullanmakla aynı şeyi gerçekleştirir. Ayrıca tamsayılar üzerine kendi ek avantajları (ve dezavantajları) vardır. Örneğin, bir UUID ile, bahsettiğiniz benzersiz dizenin belirli bir veri kaydına işaret ettiğini; Bu, 1 merkezi veritabanınızın olmadığı veya uygulamaların çevrimdışı veri kayıtları oluşturma yeteneğine sahip olduğu durumlarda (daha sonra bunları veritabanına yükleyin) yararlıdır.

Sonunda, birincil anahtarlar hakkında bir şey düşünmemelisiniz. Onları gerçekleştirdikleri işlev olarak düşünmeniz gerekir. Neden birincil anahtarlara ihtiyacınız var? Gelecekte değişmeyecek bir alan kullanarak tablodaki belirli veri kümelerini benzersiz şekilde tanımlayabilmek. Bunu idyapmak için adlandırılan belirli bir sütuna mı ihtiyacınız var , yoksa bu benzersiz tanımlamayı diğer (değiştirilemez) verilere dayandırabilir misiniz?


7

Veya böyle bir alan eklemek istemediğiniz senaryolar var mı?

Elbette.

Her şeyden önce, kendiliğinden özdeşleşmemiş veritabanları var (örneğin, kesinlikle en küçük rakiplerden biri olmayan Oracle). Bu, herkesin sevmediğine veya ihtiyaç duymadığına dair ilk gösterge olmalı.

Daha da önemlisi, kimlik aslında düşün olduğunu - bu verileriniz için birincil anahtardır. Farklı bir birincil anahtar içeren bir tablonuz varsa, o zaman bir kimliğe ihtiyacınız yoktur ve bir tane içermemelidir. Örneğin, bir masa (EMPLOYEE_ID, TEAM_ID)(her çalışanın aynı anda birkaç takımda olabileceği), bu iki kimlikten oluşan açıkça tanımlanmış bir birincil anahtara sahiptir. IDAynı zamanda bu tablo için ana anahtar olan bir otomatik ekleme sütunu eklemek hiç bir anlam ifade etmiyordu. Şimdi etrafta 2 ana anahtar geziyorsunuz ve "birincil anahtar" daki ilk kelime size gerçekten sadece bir tane olması gerektiği konusunda bir ipucu vermeli.


9
(Bir Oracle kullanıcısı değil bu soruyu affeder ancak) Oracle, Sequence'i başkalarının Autoincrement / Identity kullandığı gibi kullanmıyor mu? Oracle'ın bir Autoincrement veri türüne sahip olmadığını söylemek gerçekten sadece sematik bir argüman mıdır?
Brad,

Peki, bu sadece küçük bir nokta vardı; Ana bölüm, çalışan bir kimliğin her tablo için uygun olmamasıdır, bu nedenle her bir masaya otomatik bir kimliği eklemek için alışmak en akıllıca olmayabilir.
AnoE

İki ana anahtar yoktur, sadece bir ana anahtar vardır ve ana anahtar olarak da hizmet edebiliyorlarsa geri kalanların hepsine aday anahtar denir ..
rahul tyagi

7

"Uzun ömürlü" veriler için yeni tablolar tanımlarken genellikle "kimlik" sütununu (otomatik artan tamsayı) kullanıyorum (kayıtlar bir bitlik alan ayarlayarak "mantıksal olarak silinmiş" olsalar bile) ).

Bunları ne zaman kullanmak istemediğinizi düşünebileceğiniz birkaç durum var, bunların çoğu DB'nin bir örneğindeki bir tablonun yeni ID değerleri için yetkili kaynak olamayacağı senaryolara düşüyor:

  • Artımlı kimlikleri potansiyel bir saldırgan için çok fazla bilgi olduğunda. "Halka açık" veri hizmetleri için bir kimlik sütununun kullanılması, sizi "Alman Tank Sorunu" na karşı savunmasız hale getirir; 10234 kayıt kimliği varsa, 10233, 10232, vb. kayıtların en azından 10001 kayıt olmasına rağmen, kimlik sütununuzun nerede başladığını bulmak için kayıt 1001, 101 ve 1'i kontrol etmek kolaydır. Esas olarak rasgele verilerden oluşan V4 GUID'leri bu artımlı davranışı tasarım gereği bozar, böylece yalnızca bir GUID olduğu için, bir GUID'in bir baytını artırarak veya azaltarak oluşturulan bir GUID olması gerekmez; Bir döküm aracı olarak tek kayıt alımı için. Erişimi daha iyi kısıtlayabilecek başka güvenlik önlemleri de var, ancak bu yardımcı oluyor.
  • M: M çapraz referans tabloları. Bu bir tür vericiydi ama daha önce de yaptığını gördüm. Veritabanınızdaki iki tablo arasında çoktan çoğa bir ilişkiniz varsa, çözüm, her tablonun PK'sini referans alan yabancı anahtar sütunları içeren bir çapraz referans tablodur. Bu tablonun PK'si, yerleşik indeks davranışını elde etmek ve referansların benzersizliğini sağlamak için hemen hemen her zaman iki yabancı anahtarın birleşik anahtarı olmalıdır.
  • Bu masanın üzerine toplu olarak ekleme ve silmeyi planladığınızda çok fazla. Muhtemelen kimlik sütunlarının en büyük dezavantajı, orijinal tablonun anahtar değerlerini korumak istediğiniz başka bir tablodan veya sorgudan satır eklerken geçirmeniz gereken fazladan çemberdir. "Kimlik ekleme" özelliğini açmanız gerekir (ancak DBMS'nizde yapılır), sonra da eklediğiniz tuşların benzersiz olduğundan emin olun ve ardından içe aktarma işlemini tamamladığınızda kimlik sayacını tablonun meta verilerini mevcut maksimum değere. Bu işlem bu tabloda çok fazla olursa, farklı bir PK şeması düşünün.
  • Dağıtılmış tablolar için.Kimlik sütunları, tek örnekli veritabanları, yük devretme çiftleri ve herhangi bir zamanda tüm veri şemasında tek bir veritabanı örneğinin tek yetkili olduğu diğer senaryolar için harika çalışır. Ancak, gidebileceğiniz ve hala bir bilgisayarın yeterince hızlı olması için o kadar büyük ki. Çoğaltma veya işlem günlüğü gönderimi size salt okunur ek kopyalar sağlayabilir, ancak bu çözümün ölçeğinde de bir sınır vardır. Er ya da geç, veri eklerini işleyen ve sonra birbirleriyle senkronize olan iki ya da daha fazla sunucu örneğine ihtiyacınız olacak. Bu durum ortaya çıktığında, artımlı bir alan yerine bir GUID alanı isteyeceksiniz, çünkü çoğu DBMS, bir örneğe özgü tanımlayıcı olarak oluşturdukları GUID'lerin bir kısmını kullanacak şekilde önceden yapılandırılmış olarak geliyor, ardından tanımlayıcının geri kalanını rasgele olarak oluşturuyor veya artımlı olarak. Her iki durumda da,
  • DB'deki birden fazla tablodaki benzersizliği zorlamanız gerektiğinde.Örneğin Muhasebe sistemlerinde, Genel Mutabakatı (şimdiye kadar gerçekleşen her hesabın her bir kredisi veya tahsilatı için bir sıra ile, bu yüzden çok hızlı bir şekilde büyük olur) her birinin bir takvim ayını temsil eden bir tablo sırası olarak yönetmesi yaygındır. yıl. Daha sonra raporlama için bunları birbirine bağlamak için görünümler oluşturulabilir. Mantıksal olarak, bu hepsi çok büyük bir masa, ancak kesmek, DB'nin bakım işlerini kolaylaştırıyor. Bununla birlikte, ekleri birden fazla tabloda nasıl yöneteceğinizi (yinelenen kapanırken yine de bir sonraki aydaki işlemlere başlayabilmenizi sağlar) yinelenen anahtarlarla bitmeden sorunu sunar. Yine, kimlik tamsayı sütunları yerine GUID'ler kullanıma hazır çözümdür, çünkü DBMS bunları gerçekten benzersiz bir şekilde oluşturmak üzere tasarlanmıştır.

Umarım bahsettiğim gibi, bu durumlarda kimlik sütunlarının kullanılmasına izin veren geçici çözümler vardır, ancak bunların çoğunda, kimlik tamsayı sütunundan bir GUID'e yükseltme daha basittir ve sorunu daha iyi çözer.


1
ID, ID_M, ID_NM: N ilişkinizin özelliklerine özellikler eklemesi nedeniyle hala M: N tablolarında (sütunlar kullanarak ) kimliğe ihtiyaç duyabilirsiniz .
miroxlav

V4 GUIDS'in kriptografik olarak güçlü bir PNRG kullanması garanti edilmez, bu nedenle ilk örnek imo için gerçekten ona güvenmemelisiniz (db motorunuz daha güçlü sözler verirse, ancak bu oldukça taşınabilir değildir). Aksi takdirde iyi bir gerekçeli yazı.
Voo

1
@miroxlav - Bir masa, iki FK'nin dışındaki ayrı bir PK'nin iyi bir fikir olduğu ilişkisine ilişkin yeterli ek meta veriye sahipse, bunun artık bir çapraz referans tablosu olmadığını; Diğer ikisine de atıfta bulunacak olan kendi varlığıdır.
KeithS

@Voo - Haklısın, V4 GUID'lerin kriptografik olarak rasgele olmaları garanti edilmiyor, sadece benzersiz (tüm GUID'ler gibi). Bununla birlikte, ABD jet avcılarının kuyruk sayıları da kriptografik olarak rasgele tohum verisinden / algoritmasından üretilmez. Aradığın şey seyrek nüfuslu bir alan; Bir V4 GUID, 5e33 kayıtları benzersiz şekilde tanımlayabilen 112 bayt rastgele veriye sahiptir.
KeithS

Perspektifte bu sayıyı ifade etmek gerekirse, gezegendeki her erkek, kadın ve çocuk (7 milyar dolar) 741 olabilir trilyon bireysel Katalogda ve DB veri noktalarını IDed ve biz hala sadece başına bir GUID değeri kullanılarak olurdum milyar mevcuttur. Küresel bir endüstri olarak Büyük Veri, bu bilgi ölçeğine bile yakın değil. GUID nesnesine bir kalıp verilmiş olsa bile, verinin sisteme girdiği ve bir GUID atandığı sıra gibi diğer entropi kaynakları vardır.
KeithS

7

Otomatik artan (kimlik) bir birincil anahtar, veritabanının bağlamı ve söz konusu veritabanının hemen istemcileri dışında anlamsız olduğunu not etmek dışında iyi bir fikirdir. Örneğin, verilerin bir kısmını başka bir veritabanına aktarır ve saklarsanız, her iki veritabanı tablosuna farklı veriler yazmaya devam ederseniz, kimlik bilgileri birbirinden uzaklaşacaktır; yani, bir veritabanında 42 kimliği olan veriler mutlaka verilerle eşleşmeyecektir diğerinde 42 bir kimliği ile.

Bunu göz önüne alındığında, yine de veritabanlarının dışındaki benzersiz satırları tanımlayabilmeniz gerekirse (ve sık sık bu ise), bu amaç için farklı bir anahtarınız olmalıdır. Dikkatlice seçilmiş bir işletme anahtarı işe yarar, ancak genellikle benzersizliği garanti etmek için gereken çok sayıda sütunun bulunduğu bir konumda kalırsınız. Diğer bir teknik ise, otomatik olarak artan bir kümelenmiş birincil anahtar olarak bir Id sütununa ve dünyadaki her yerde satırı benzersiz bir şekilde tanımlamak amacıyla, kümelenmemiş bir benzersiz anahtar olarak başka bir benzersiz tanımlayıcı (kılavuz) sütuna sahip olmaktır. Bu durumda hala otomatik artan bir anahtara sahip olmanızın nedeni, otomatik artan anahtara aynı işlemi bir kılavuza göre yapmaktan daha kümelemek ve dizine eklemek daha verimli olmasıdır.

Bir otomatik artan anahtar istemeyebileceğiniz bir durum, birincil anahtarın diğer iki tablonun Id sütunlarının bir bileşimi olduğu çoktan çoğa bir tablo olabilir (burada yine de otomatik artan bir anahtarınız olabilir, ancak ben amacını görmüyorum).

Başka bir soru otomatik artan anahtarın veri tipidir. Bir Int32 kullanmak size geniş ama nispeten sınırlı bir değer aralığı sunar. Şahsen, neredeyse hiçbir zaman değerlerin tükenmesi konusunda endişelenmenize gerek kalmaması için, Id için bigint sütunlarını kullanıyorum.


6

Diğer insanlar artan bir birincil anahtar için durum yarattığından, bir GUID için bir tane yapacağım:

  • Benzersiz olması garantilidir
  • Uygulamanızdaki veriler için veritabanına bir daha az seyahat edebilirsiniz. (Örneğin bir tür tablosu için, GUID'i uygulamada saklayabilir ve kaydı almak için kullanabilirsiniz. Bir kimlik kullanıyorsanız, veritabanını ada göre sorgulamanız gerekir ve bunu PK almak için yapan birçok uygulama gördüm. ve daha sonra tüm detayları öğrenmek için tekrar sorgular).
  • Veri gizlemek için kullanışlıdır. www.domain.com/Article/2 Yalnızca iki makaleniz olduğunu belirtirken www.domain.com/article/b08a91c5-67fc-449f-8a50-ffdf2403444a hiçbir şey söylemez.
  • Farklı veritabanlarından kayıtları kolayca birleştirebilirsiniz.
  • MSFT kimlik için GUIDS kullanır.

Düzenleme: Yinelenen Nokta


5
-1. Bir GUID / UUID'in benzersiz olacağı garanti edilmez ve% 100 benzersiz değildir. Bir GUID hala sınırlı bir uzunluğa sahiptir, bu nedenle bir noktada bir kopya alma riskini göze alabilirsiniz, ancak çok düşük bir ihtimaldir. Veritabanına daha az yolculuk yapma noktanız da geçersiz - neden birincil kimliği GUID anahtarıyla olduğu gibi uygulamada saklayamıyorsunuz?
Niklas H

2
Jeff Atwood söylediğimden daha iyi olduğunu söylüyor. blog.codinghorror.com/primary-keys-ids-versus-guids
Üç Değer Mantığı

Neden olarak birincil kimliğini uygulamanızda saklayamıyorsun? Çünkü veritabanı onu yaratıyor. Tohumlarınızı boş bir veritabanında çalıştırırsanız, kimliğin 1 olacağını varsayabilirsiniz. Ya aynı betiği içinde veri bulunan bir veritabanında çalıştırırsanız? Kimlik 1 olmayacak.
Üç Değer Mantığı

Uygulamada kimlik oluşturma hakkında hiçbir şey söylemediniz - sadece "depolama" yazdınız. Ancak, kimliği veritabanının dışında oluşturmak gerekirse, o zaman evet, bir GUID cevap olabilir.
Niklas H

2
Daha iyi ölçeklendiklerini eklerdim. Büyük veri Cassandra gibi NoSQL veritabanları otomatik artış anahtarlarını bile desteklemiyor.
Karl Bielefeldt

2

İyi bir tasarım prensibi olarak, her masanın bir satırı benzersiz şekilde tanımlamak için güvenilir bir yolu olmalıdır. Bir birincil anahtarın bunun için olmasına rağmen, her zaman bir birincil anahtarın varlığını gerektirmez. Her tabloya bir birincil anahtar eklemek, benzersiz satır tanımlaması sağladığı için kötü bir uygulama değildir, ancak gereksiz olabilir.

İki veya daha fazla tablonun satırları arasında güvenilir ilişkileri sürdürmek için, bunu yabancı anahtarlar üzerinden yapmanız gerekir; bu nedenle, en azından bazı tablolarda birincil anahtarlara ihtiyaç duyulur. Her tabloya bir birincil anahtar eklemek, mevcut verilere yeni tablolar veya ilişkiler ekleme zamanı geldiğinde veritabanı tasarımınızı genişletmeyi kolaylaştırır. Önceden planlama yapmak her zaman iyi bir şeydir.

Temel bir prensip olarak (belki de zor kurallar), birincil anahtarın değeri, sırasının ömrü boyunca asla değişmemelidir. Bir satırdaki herhangi bir işletme verisinin kullanım ömrü boyunca değişebileceğini varsaymak akıllıcadır, bu nedenle herhangi bir işletme verisi birincil anahtar için zayıf bir aday olacaktır. Bu yüzden otomatik artımlı bir tamsayı gibi soyut bir şey genellikle iyi bir fikirdir. Bununla birlikte, otomatik artan tam sayıların sınırlamaları vardır.

Verileriniz yalnızca veritabanınızda bir ömre sahipse, otomatik artan tam sayılar iyidir. Ancak, diğer yanıtlarda da belirtildiği gibi, verilerinizin paylaşılmasını, senkronize edilmesini veya başka şekilde veritabanınızın dışında bir yaşam olmasını istiyorsanız, otomatik artan tamsayılar zayıf birincil anahtarlar yapar. Daha iyi bir seçim bir rehber olacaktır (aka uuid "evrensel olarak benzersiz bir kimlik").


2

Soru ve cevapların çoğu, her bir tablonun tüm doğal anahtarlarının yalnızca veritabanının mantıksal şemasında bulunduğunu ve her tablonun tüm yedek anahtarlarının yalnızca veritabanının fiziksel şemasında bulunduğunu gösteren önemli noktayı kaçırır . diğer cevaplar, yalnızca anahtar anahtarlarının neden doğru kullanılma nedenlerini ve ne zaman kullandıklarını tartışmadan tamsayıya karşı GUID vekil anahtarlarının göreceli faydalarını tartışır.

BTW: Kötü tanımlanmış ve kesin olmayan terim birincil anahtarını kullanmaktan kaçınalım . Önce ilişkisel modele (akıllıca), sonradan çeşitli RDBMS satıcıları tarafından fiziksel bölgeye yeniden dahil edilen ön-ilişkisel veri modellerinin bir ürünüdür. Kullanımı sadece anlambilimi karıştırmaya yarar.

Notu Bağıntısal modelin veritabanı için sırayla, mantıksal şema olmak ilk normal formda , her tablo olmalıdır bir şekilde bilinmektedir alanları, kullanıcı tarafından görülen dizi doğal anahtarı, benzersiz tablonun her satırı tanımlar. Çoğu durumda, böyle bir doğal anahtar kolayca tanımlanır, ancak bazen bir bağlayıcı kırıcı alan olsun veya olmasın, bir kişi yapılmalıdır . Bununla birlikte, bu tür bir anahtar her zaman hala kullanıcı tarafından görülebilir ve bu nedenle daima veritabanının mantıksal şemasında bulunur.

Buna karşılık , bir tablodaki herhangi bir vekil anahtar tamamen veritabanının fiziksel şemasında bulunur (ve bu nedenle her zaman, hem güvenlik nedeniyle hem de veritabanı bütünlüğünün bakımı için veritabanı kullanıcılarına tamamen görünmez olmalıdır). Bir vekil anahtar tanıtmanın tek nedeni , DB'nin fiziksel bakım ve kullanımındaki performans sorunlarını ele almak ; Bunların birleştirilip birleştirilmediği, çoğaltma, veri için birden fazla donanım kaynağı veya başka olması.

Bir vekil anahtarın tanıtılmasının tek nedeni performans olduğundan, performansın olmasını istediğimizi varsayalım. Eldeki performans sorunu birleşiyorsa, vekil anahtar anahtarımızı olabildiğince dar hale getirmek isteriz (donanımın önüne geçmeden, kısa tam sayılar ve baytlar genellikle dışarı çıkar). Birleştirme performansı minimum endeks yüksekliğine dayanır, bu nedenle 4 baytlık bir tamsayı doğal bir çözümdür. Performans sorununuz ekleme oranı ise 4 baytlık bir tam sayı da doğal bir çözüm olabilir (RDBMS’nizin dahili durumuna bağlı olarak). Bir tablodaki performans sorununuz çoğaltma veya başka bir yedek anahtar teknolojisinden çok sayıda veri kaynağıysa , bir GUID veya iki parçalı bir anahtar (Host ID + integer) daha uygun olabilir. Şahsen GUID'lerin favorisi değilim, ancak bunlar uygun.

Özetlemek gerekirse, tüm tablolar bir vekil anahtar gerektirmez (herhangi bir türde); sadece düşünülen tablonun performansı için gerekli görüldüğünde kullanılmaları gerekir. Hangi ortak vekil anahtar teknolojisini tercih ederseniz edin, bir seçim yapmadan önce masanın gerçek gereksinimlerini dikkatlice düşünün; Bir tablo için vekil anahtar teknoloji seçimini değiştirmek çok yorucu olacaktır. Masanızın temel performans ölçümünü, haleflerinizin yapılan seçimleri anlayabilmesi için belgelendirin.

Özel durumlar

  1. İş gereksinimleriniz, bu alanın denetleme (veya diğer) amaçları için sıralı işlem numaralandırmasını zorunlu kılarsa, bir vekil anahtar değildir ; bu doğal bir anahtardır (ekstra gereksinimlerle birlikte). Dokümantasyondan, otomatik artan bir tamsayı yalnızca yedek anahtarlar oluşturur , bu yüzden onu oluşturmak için başka bir mekanizma bulun. Açıkçası, bir çeşit izleyici gerekli olacak ve işlemlerinizi birden fazla siteden alıyorsanız , izleyici için belirlenmiş ana site olma özelliği nedeniyle bir site özel olacaktır .

  2. Eğer tablonuz asla yüz sıradan fazla olmayacaksa, indeks yüksekliği önemsizdir; Her erişim bir tablo taraması ile olacaktır. Ancak, uzun dizelerdeki dize karşılaştırmaları 4 baytlık bir tamsayıdan çok daha pahalı ve bir GUID'in karşılaştırılmasından daha pahalı olacaktır.

  3. Bir karakter (4) kod alanı tarafından anahtarlanan bir kod değerleri tablosu, 4 baytlık bir tamsayı ile bir performans kadar olmalıdır. Bunun kanıtı olmamasına rağmen, bu varsayımı sık sık kullanıyorum ve buna dayanmak için hiçbir nedenim yoktu.


-1

Sadece iyi bir uygulama değil, aslında Bill Karwin'in SQL Antipatterns kitabında bir kalıp karşıtı olarak tanımlanıyor.

Her tablonun takma adı gerekmiyor - keyfi bir değeri olan birincil anahtar, model için anlamsal değeri olan bir şey değil - ve bunu her zaman çağırmak için hiçbir neden yok id.


Bu, önceki 9
cevapta

2
ve bu neden önemli olabilir?
gnat

3
@gnat Çünkü soruyu doğrudan ele alan en iyi uygulamalar üzerine bir kitap. Belli değil mi?
Pedro Werneck

3
en ufak değil. "En iyi kitap sql uygulamaları" için Google’da arama bana yaklaşık 900 bin bağlantı gösteriyor, bu neden buna
değerdi?

1
@gnat Bütün gün tartışmayacağım. Cevabı beğenmediniz, bunun için indirimler var.
Pedro Werneck

-2

Bu oldukça evrenseldir - aksi halde anahtarın gerçekten benzersiz olduğunu doğrulamanız gerekir. Bu, zaman alıcı olan diğer tüm anahtarlara bakarak yapılır. Artımlı bir tuşa sahip olmak, kayıt numaranız anahtar taşma değerine yaklaştığı için pahalı olur.

Genelde işaretçileri ref_{table}benzer veya benzeri bir fikir olarak alan adlarını daha belirgin hale getiririm .

Harici olarak bir kayda işaret etmek gerekli değilse, o zaman bir kimliğe ihtiyacınız olmaz.


Anahtar devir değeri?
AJJ

İmzasız bir tamsayı en fazla 4294967295 değerine sahip ve 1 eklemeden önce değeri 0 a dönecek. unsigned intAlan türü için kullandığınızdan emin olun , aksi halde limit bu sayının yarısıdır.
Johnny V


2
Çok sayıda satır ekler / kaldırırsanız, otomatik artış sayacı sonunda taşar.
Johnny V

1
İnsanlar rollover'ı nasıl idare ediyor? Asla silinmeyen düşük bir kimliğe sahip kayıtlar varsa, ancak bazı kimliklerin 4294967295'in üst ucunda olduğu noktaya yaklaşıyorsanız ne olur? Bir "yeniden indeksleme" yapılabilir mi?
AJJ

-2

Her zaman yapılması gerektiğini söyleyemem . Burada eşsiz bir anahtarın olmadığı bir masa var - ve buna gerek yok. Bu bir denetim günlüğü. Asla bir güncelleme olmayacak, sorgular günlüğe kaydedilene yapılan tüm değişiklikleri geri getirecek, ancak yanlış bir değişikliği tanımlamak bir insanı makul olarak yapabilecek en iyisidir. (Eğer kod ilk etapta onu yasaklamış olurdu!)


-3

Birincil anahtar için bir otomatik artış sayacı iyi bir fikir değildir. Bunun nedeni, bir sonraki anahtarı bulmak için veri tabanına geri dönmeniz ve verilerinizi eklemeden önce birer birer artırmanız gerektiğidir.

Bu, genellikle uygulamanın bir parçası olarak değil, birincil anahtar için veritabanının sağlayabileceği her şeyi kullanacağımı söylüyor.

Veritabanını sizin için doğal olarak sağlamasına izin vererek, anahtarın ihtiyaç duyduğu şey için benzersiz olmasını garanti edebilir.

Tabii ki tüm veritabanları bunu desteklemiyor. Bu durumda, genellikle anahtar kovalarını depolayan ve uygulamada yönetilen yüksek ve düşük aralıkları kullanan bir masa kullanıyorum. Bu bulduğum en performanslı çözüm. Çünkü 10000 sayı aralığı alıyorsunuz ve bunları uygulama örneğinde otomatik olarak artırıyorsunuz. Başka bir uygulama örneği, çalışmak için başka bir sayı kovası alabilir. 64 bit uzunluğunda gibi yeterince büyük bir birincil anahtar ilkesine ihtiyacınız var.

UUID'ler Birincil anahtar olarak kullanmıyorum, çünkü bunları oluşturma ve saklama maliyeti, uzun bir değeri birer birer arttırmaktan çok daha yüksek. UUID'ler yine de, bir kopyanın teorik olarak ortaya çıkabileceği doğum günü paradoksunu ele alıyor.


3
Hayır. Otomatik artış tuşları, anahtar artışının veritabanı tarafından otomatik olarak yapılması anlamına gelir. Bazen bunu yapmak için bir dizi + tetik kombinasyonunu gerek (ben! Şu haline Oracle arıyorum), ancak hiçbir zaman sonra da kullanmaya, 1 ekleyin, anahtar için daha önce eklenen değer bakmak gerekir.
SQB

JPA gibi bazı kalıcılık çerçevelerinde, arayan kişiye geri getirilen anahtarın değerini döndürmek istiyorsanız, anahtarı görebilmek için kaydı yüklemeniz gerekir.
Arşimet Trajano
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.