2011-01-02 22 views
5

i JPA/hazırda varlık içinde bir uzun alan üzerinde @id ve @GeneratedValue her kullandığınızda, ben aslında bir vekil anahtar kullanıyorum ve ben bu bir olduğunu düşünüyorum, Anladığım kadarıylakipi: Kompozit PK Görüşler vs Vekil PK

  1. benzersiz PK
  2. 1'den fazla iş-değer sütunlar kombinasyonu var olmak gibidir: bileşik birincil anahtarlar kullanılarak benim değil çok iyi deneyimler dikkate birincil anahtar tanımlamak için çok güzel bir yol kompozit pk değerleri tablo ayrıntıları çoğaltılmasına olsun
  3. o kompozit PK
  4. 0 içeride iş değeri değiştiremezsiniz

Ben hazırda PK her iki türdeki destekleyebilir biliyorum, ama onlar kompozit PK karmaşık SQL sorguları ve saklı yordam süreçlerini yaparken başa kolay olduğunu söyleyen nerede im deneyimli meslektaşları ile önceki sohbetler tarafından merak bıraktı.

İşleri çok karmaşık hale getirecektir vekil tuşlarını kullanırken katılmadan yaparken ve vekil tuşlarını kullanırken bazı maddeleri yapmak imkansız olduğunda birkaç durum olduğunu söyleyerek devam etti. Her ne kadar üzüldüyse de, açıkladığımda yeterince açıklanmadığım için ayrıntıları açıklayamam. Belki bir dahaki sefere daha fazla ayrıntı koyacağım.

Im henüz proje yapmak ve bu tablolar arasında çoğaltılamaz almak değil, çünkü vekil anahtarları denemek istiyorum çalışıyor ve biz iş sütun değerleri değiştirebilir. Ve bazı iş değeri kombinasyonu teklik ihtiyacı, şöyle bir şey ne zaman kullanabileceğini: çünkü kompozit anahtarı hakkında önceki tartışma şüphe hala

@Table(name="MY_TABLE", uniqueConstraints={ 
    @UniqueConstraint(columnNames={"FIRST_NAME", "LAST_NAME"}) // name + lastName combination must be unique 

Ama im.

Bu konudaki deneyimlerinizi paylaşır mısınız? Teşekkür ederim !

cevap

10

Herhangi bir uygulama hakkındaki ilk kural, gereksinimlerin değişmesidir. Dönemi. Yani, bugün PK için iyi bir aday gibi görünen bir şey, yarın da bir PK olamayabilir.

değeri, şu özelliklere içeriyorsa PK için iyi bir adaydır:

  1. O değişmez bu. Asla değişmeyecek.
  2. Teklik. İki kayıt aynı kimliği paylaşmayacaktır.

Gerçek dünyada, bu özelliklerle sürekli bir şekilde bir şey yapmak neredeyse imkansızdır. Yani, bugün bir şey değişmez ve eşsiz olsa bile, her zaman böyle olacağı anlamına gelmez. Mümkün

Yani, vekil tuşları ile gidin. Doğal anahtarları yalnızca eski veritabanları için kullanın. Ve doğal anahtarların vekil (şaka) :-) 'den daha iyi olduğunu öneren arkadaşlardan uzak durun :-)

Ve tabi ki: teklik kuralını veritabanında bir kısıtlama ile uygulayabilirsiniz (örnekte yaptığınız gibi), iki kuralın aynı değeri paylaşmasını imkansız kılmak, eğer iş kuralıysa. Gelecekte iş mantığı değişiklikler, size bir vekil anahtar ;-)

kullanılan Ama bunun için stackoverflow rastgele herife güvenmiyorum görmekten memnuniyet duyarız zaman.Wikipedia'dan bu iki makaleler okuyun:

http://en.wikipedia.org/wiki/Surrogate_key

http://en.wikipedia.org/wiki/Natural_key

+0

Çok teşekkürler! – bertie

0

hazırda vekil tuşların kullanımını teşvik görünüyor. Kompozit anahtarların kullanımını tercih ediyorum ancak çerçeveyle mücadele etmek istemiyorum ve kompozit anahtarlar Hazırda çalışmak için hantal hale gelebilir. Bu yüzden, her iki dünyanın en iyisini elde etmek için bir vekil anahtar kullanıyorum, ama aynı zamanda, Hibernate'in benim için benzersiz kısıtlamalar yaratması için, benim-birleşik anahtar sütunlarımı @ NirdiId ile etiketleyin. @NaturalId varsayılan mutablilitesi yanlıştır, bu yüzden "bileşik anahtar" alanınızı güncellemeniz gerekiyorsa, @NaturalId (mutability = true) kullanın.

İlgili konular