Yerine Çoklu Key tek otomatik numara

10 Cevap php

Yerine aslında benzersiz kayıt temsil birden çok alandan bir birincil anahtarı için tek bir artan bir alanı kullanmak için bir neden var mı?

Varolan bir php uygulama üzerinde çalışıyorum ve tabloları tüm yerine aslında (kullanıcı, açık artırma, teklif gibi) kayıt için benzersiz olan 2 veya daha fazla alan kullanarak, tek bir 'id' tuşuna sahip görünmektedir.

Ben bir veritabanı uzmanı değilim, ama bu sadece bana tembel (veya deneyimsiz) görünüyor. Herhangi bir yarar (performans veya başka türlü) var mı?

Updated: Ben veri gerçekten benzersiz sağlamak isteyebilirsiniz psudo-benzersiz veri (SSN, e-posta adresi, vb), atıfta değilim. Ben bariz yabancı anahtar başvuruları ile tablolar hakkında konuşuyorum, ancak bunun yerine tablonun kendisi de benzersiz alan (lar) ile birlikte bu başvuruları kullanarak, her tablo sadece artan bir kimliği vardır.

Öznel bir tartışma başlatmak için çalışırken değil, sadece bana mantıklı gelmiyordu.

10 Cevap

Sentetik birinci tuşlarını kullanarak çeşitli avantajları vardır:

  • Sen bir dizin güncelleştirme hit almak zorunda kalmadan önemli alanlarda değerleri değiştirebilirsiniz
  • Indeksler küçük
  • Bu yabancı anahtar ilişkileri daha basit hale
  • Dizeleri ile ilgili değil, çünkü sorunlar var kodlayan asla

Veritabanları genellikle tekdüze artan tuşları ile dizin bina etrafında belirli optimizasyonları var.

Söyleniyor, şimdi ve sonra biraz denormalizasyon ile yanlış bir şey yoktur. Kullanım durum açıktır ve tablolar nispeten küçük iseniz, uygun olanı yapın.

Bu "Unique" tanımına bağlıdır. Evet, isim, e-posta adresleri ve SSN değerler "benzersiz" olması gerekiyordu. Ancak, yabancı şeyler yaşandı. Durumlarda bir çok ayrı bir kimlik değerine sahip, hayat çok daha kolay yapabilirsiniz ...

Update

Sorusuna düzenleme dayanarak, ben gerçekten bir ihtiyaç görmüyorum. Var durum gibi bir şey gibi geliyor. Bir "katılmak masa", sadece başka bir tablonun Uniqueıd bir tablodan bir uniqueid bir ilişki yaratıyor şey.

> Rol dernek - Ben bahsediyorsun düşünüyorum ne basit bir örnek kullanıcı olacaktır. Sen bir Role bir kullanıcı ilişkilendirmek gerekir. Bir UserId ve RolNo.

Eğer veritabanında benzer bir yapıya sahip

MappingId (Your Auto Number) (This is the PK)
UserId (From the user table)
RoleId (From the Role table)

Burada girişleri çoğaltmak gerek yoktur çünkü bu yapı, sadece kullanıcı ve RolNo Birincil anahtar makyaj olurdu, bana mantıklı DEĞIL.

Eğer farklı bir şey varsa o şeyleri değiştirmek olabilir ...

Biz vekil tuşları yeniden tartışmaya büyük doğal e karşı açıyorsun gibi Ah canım, o görünüyor.

Basit nedeni, veri fazlalığını önlemek için. Doğal tuşları veritabanının ömrü boyunca değişebilir birden tuşları gerektiren eğilimindedir.

Bir kişi evli ve soyadlarını değiştirir alırsa Örneğin, o soyadı Başvurulan her yerde haberdar olmak için vardır.

Eğer güncelleme çağlayan üzerinde ayarlanmış yabancı anahtarlar varsa DB sizin için yapacak gibi bu bir sorun değildir.

Daha fazla ve daha tablo yuva gibi, sizin tuşlarını daha fazla sütun gerekir bulabilirsiniz. Aslında yedi sütun birincil anahtar vardı bir tablo gördüm. Sadece dört sütun vardı bir tablo.

Genellikle birincil anahtar üzerinde kümelenmiş bir dizin istiyorum. Kümelenmiş bir bileşik, sahip sorunu, birincil anahtar yeni satırlar eklemek SQL üreticimizin gelir diğer kayıtlar arasında yeni rekor sadık olmasıdır. Buna ek olarak, daha büyük olan birincil anahtarı daha fazla alan saklamak için gereklidir.

Here birincil anahtar olarak bir GUID kullanarak bir makale, ama aynı bir bileşik anahtar için de geçerlidir.

Ayrıca bkz: this great answer.

Peki, id 1-sonsuzdan veritabanına sıralı sipariş vermek. Kullanıcı adları ve bu geçicidir ve her zaman sipariş edilmez. Yani, muhtemelen, daha hızlı arama yapar. Eğer birden fazla anahtar bir öğe anlamına sahip düşündüren konum gibi Artı, öyle görünüyor. Bu genellikle Şimdi iki şey emin şey bir yerine sağ öğedir yapmak için kontrol edilmesi gerekir, çünkü işleri yavaşlatmak için gidiyor.

İşte OtomatikSayı kullanmak için birkaç nokta vardır

  • Autonumbers are a single unique key that make foreign key relationships much easier to maintain and use

    Autonumbers are numbers so it is pretty easy to use them and not mess them up. What I mean is, if your primary key is a string and your developer forgets to put that in single quotes it will destroy your performance

    Bu bir OtomatikSayı kullanmak normal standart bir uygulamadır

    Hala diğer alanlar "benzersiz" yapabilir

    bir dizi sıfırlama Otomatik Sayı ile çok daha kolay

    if you need to jump ahead in the sequence it is much easier with a number than a combo of attributes, or strings

Sadece bir kaç şey ...

bu alanlar gerçekten benzersiz rekor tarafından temsil varlık tespit Çoğu durumda, gerçekten kesin değil. Tekrar ve tekrar iş zihniyet yerleşmiş eski veritabanı kavramları herhangi bir başka evrim engel durumlarda gördüm.

Hemen hemen her Ben hiç bir veritabanında kullanmak denedim "doğal" tuş kombinasyonu zamanla benzersiz olmayan olarak sona erdi. Veri modelleri soyutlamalar zayıflamasına kadar hızlı gelişmeye gerekir.

Bu isimler, telefon numaraları, SSNs, yasal belge başvurularını, sayfa numaraları, e-posta adresi, kullanıcı adı, proje sayıları, ve benim kariyer üzerinden kullanmak denedim bir kaç başka şeyler içerir.

Bunun dışında, vb, yeni kayıtlar yazma yabancı anahtarları karşılaştırmak için performansına ilişkin diğer cevaplar tek başına yeterli bir neden vardır.

Sen birincil anahtar içine pişirme olmadan teklik mevcut iş mantığını koruyabilirsiniz - sadece doğal anahtar sütunları benzersiz bir dizin kurmak. Herhangi indeksi gibi, ekler ve güncellemeler üzerinde bir fiyat ödemek, ama olacak o da bir useful indeksi (bazı sorguları karşılamak için yardımcı olur), tüm iyi olmak olur.

Bu aşağı tüm veri yapısı ne kadar "normal" geliyor. Son derece normalize veritabanı, tanımı gereği, sadece birincil anahtar için tek bir alana sahip olabilir. Bu durumda, bir PK olarak bir seri veya otomatik oluşturulan numarayı kullanmak için herhangi bir nedenle az var. Veri yapısı PK (izleme insanlar sadece çok isim var, bir sorun) gibi benzersiz girişleri ile dizayn edilmelidir.

Tabii normalleşme ile performans ceza geliyor, veritabanı yapmak için de-normalize edilir (web uygulamaları için çok yaygın) kullanılabilir. Bir ağır de-normalize DB ile, birçok kez bu tablodaki her alanını kullanarak olmadan PK almak mümkün değildir. Yapı de-normalize olması nedeni performansını artırmak için olduğunu unutmayın. Ben aşinayım tüm veritabanlarını her PK için bir dizin oluşturur. Daha büyük endeks, dizin korumak için genel kadar büyük olur.

Dev dizin oluşturulurken (onun bir sürece salt okunur DB) elemanını öldürmek ve zaman performansını güncellemek, de-normalizasyon işe yaramaz hale olacaktır. Ayrıca devasa endeksleri aramak için daha uzun sürer ve de küçük olanlardan daha fazla bellek kullanır.

Özet olarak, bu benzersiz bir PK almak için birden çok alan gerektiren herhangi bir tablo için PK otomatik oluşturmak için performans nedenleriyle genellikle avantajlıdır.

Evet, bu tartışmayı teşvik edecektir.

Genel olarak, birincil anahtar veri tablo verilerinden elde edilen doğal bir anahtarı kullanırken sık sık böyle değil, değişmez olmalıdır. Daha önce belirtildiği gibi, SSNs gibi şeyler sık ​​sık bu nedenle değişmezliğini kapalı atma, değiştirilebilir.

Tekdüze, "OtomatikSayı" ya da "kimlik" sütun gibi, yedek anahtarları doğal bir anahtar için basit bir yedek vardır artmaktadır. Onlar B-tree index tarzı algoritmalar karşısında iyi dengelemek olmayabilir Ancak, onlar indeksi yetersizliklere eğilimli olabilir. Bu MS SQL Server bir uniquesidentifier yani GUID gibi, rastgele oluşturulmuş vekil anahtarı kullanılarak çözülebilir, ama bu aynı zamanda performans etkileri olduğunu okudum.

Genellikle, tablo katıldı kolaylığı için otomatik numara veya kimlik gibi sıralı özelliği üretilen bir vekil tuşunu kullanabilirsiniz.