2009-08-20 16 views
30

:Hazırda beklemede olan çok yönlü bir ilişki var - neden birleştirme tablosu daha iyi? Bu belgede (tek yönlü bölümüne gidin) 'de

http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping-association-collections

bir birleştirme tablosuyla tek yönlü bir bire çok ilişki çok sadece bir dış anahtar kolon kullanılarak tercih olduğunu söyler sahip olunan varlık. Sorum şu, neden daha çok tercih ediliyor?

+0

http://stackoverflow.com/questions/2092611/why-is-it-recommended-to-avoid-unidirectional-one-to-many-association-on-a-forei –

cevap

36

Sahip olduğu varlık türünün başka bir ana varlık türü tarafından sahip olunabileceği durumu düşünün. Sahip olunan tablodaki yabancı anahtar referanslarını her iki ana tabloya koyar mısınız? Üç ana tipiniz varsa ne olur? Sadece büyük tasarımlara göre ölçeklendirilmez.

Birleştirme tablosu, birleştirmeyi ayırır, böylece sahip olunan tablonun, üst tablo (lar) hakkında hiçbir bilgisi yoktur, bu da tasarımın zarif bir şekilde ölçeklenmesine izin verir.

+1

Farkı görün bakın http://stackoverflow.com/q/18333198/418439 –

11

Çocuk öğesinin yalnızca bir üst türü varsa, birleştirme tablosuna gerek yoktur. Bunu JPA ile yaptım (hazırda bekletme ile).

Avantajlar: Daha az bir tablo. Belki daha iyi performans. Hayır "bu tablo ne için?" sorular yazın.

Dezavantaj: OO açısından bakıldığında, çocuk ve ebeveyn arasında ek bir bağımlılık vardır. Pratikte bu büyük bir anlaşma değildir, çünkü ilişki çocukta özeldir.

 
e.g. 
parent: 
@OneToMany(mappedBy = "parent", cascade = CascadeType.ALL) 
@MapKey(name = "name") 
private Map children; 

child: 
@ManyToOne(optional = false) 
private Parent parent; 
+0

adresindeki iç SQL işlemlerinin birleştirme tablosunda ve yabancı anahtarda çağrılması, –

+0

Rafine dezavantajı konusunda daha fazla ayrıntı verebilir. – Conor

+0

Sadece, JPA 2.0 ile çocuğun üst öğeye başvurmasının artık gerekli olmadığını unutmayın. Sadece ebeveyn üzerindeki @JoinColumn ek açıklamasını kullanın. –

İlgili konular