Hazırda bekletilen bir sınıf hiyerarşisi için tablo düzenini düşünüyorum ve kesinlikle alt sınıf tekniği için tablo genel anlamda en uygun olanı vurur. Ancak, mantık yoluyla düşünmek, özellikle alt sınıflar ölçeğinin sayısıyla ilgili bazı kaygılarım var. Hibernate'in tablo başına alt sınıf miras stratejisinin verimliliği
en aşağıdaki sınıfları var diyelim, çok kısa (ve klasik) örnek vermek gerekirse:public abstract class Animal {
int pkey;
String name;
}
public class Dog extends Animal {
long numSlippersChewed; // int is not large enough...
}
public class Cat extends Animal {
short miceCaught; // ... but here int is far bigger than required :-)
}
(ı eliding ediyorum Alıcılar ve ayarlayıcılar vb eşleştirmeleri Hazırda, sadece onların farz ediyorum temel açık durum).
Bu varlıklar için veritabanı tabloları mantıklı, güzel denormalizasyon ve benzeri. Bununla birlikte, bireysel bir hayvanı çıkarmak için Hibernate hangi sorguyu yapıyor? Bunun gerçekleşebilir en az iki olgu düşünebilirsiniz:
- böyle bir
Human
sınıfın birpet
alanı olarak bire-bir (veya bire çok) eşleştirmesini sahip diğer bazı varlık. Bu, payı saklayacaktır, bu yüzden Hazırda Bekletme, bir Human nesnesini getirdiğinde, ilgiliAnimal
nesnesini de getirmelidir. Hayvanın pkeyini verildiğinde, hangi sorgu (/ ies),Cat
veyaDog
tablolarında yer alabildiği göz önüne alındığında, gerçek Hayvan verilerini ayıklamak ve unshashall için kullanımı hazırda tutar mı?from Animal where name='Rex'
gibi HQL gibi - HQL (isimlerin benzersiz olduğunu varsayalım). Bu, üst sınıf tablosunda bir satırı tanımlamanıza olanak tanıyan, ancak daha fazla ayrıntı için incelemek üzere hangi alt sınıfı tabloyu bildiğinizi bilmediğinize benzer. HQL, bir sorguyu
from
soyut bir sınıf oluşturmanıza izin veriyor mu? (Alt sınıflara özgü şeyleri kullanmak güzel olsa da, örneğin,from Cat where miceCaught > 5
).
Bunun SQL'de yapılabileceğini iki şekilde düşünebilirim ve ne güzel görünüyorlar. Biri, verilen pkey için her bir alt sınıf tablosunda bir exists
sorgusunu çalıştırmak ve daha sonra bir isabet döndüren tablodan yüklemek. Alternatif olarak Hazırda Bekletme, tüm tablolarda bir araya gelen bazı korkunç sendika sorgularını gerçekleştirebilir - temel olarak, sonuç kümesinin, bağımsız değişkenler için null
döndüren alt sınıf tablolarından tek tek seçildiği olası alt sınıfların niteliklerini içereceği şekilde, tablo başına hiyerarşi şemasını simüle edebilir. Bu ikinci durumda muhtemelen bir sentetik diskriminatör kolonu eklemesi gerekecek, böylece Hazırda Bekletme hangi alt sınıf tablosunun gerçekten satırı döndürdüğünü ve böylelikle hangi Java sınıfının ayrıştırıldığını bilecektir.
şeyler somut tiplerinin alt türlerini sahip çok olursa hairier olsun: Belirli bir hayvan pkey Şimdi
public class Greyhound extends Dog {
float lifetimeRacingWinnings;
}
, yani
Dog
ve
Greyhound
tablolarda geçerli satırlar olabilir benim Bir pkeye karşılık gelen sınıfı manuel olarak kontrol etmenin ilk yaklaşımı daha da zorlaşır.
Çok endişelenmemin nedeni, bu yaklaşımı en fazla 4-5 seviyeli yuvalama zinciri ile yaklaşık 70 sınıfa sahip bir sınıf hiyerarşisinde kullanmak isteyeceğim olmasıdır. korkunç performansına sahip olması muhtemel. Hibernate'in bu nispeten daha iyi performans göstermesini sağlamak için manşetinin herhangi bir numarası var mı? Ya da pkey tarafından uzun bir zaman alacak olan bu sınıflardan birine referans yükleniyor?
Belki de http://stackoverflow.com/questions/2700680/table-per-subclass-inheritance-relationship-how-to-query-against-the-parent-clas adresini görmek istersiniz –
Merak ediyorum. Bazı diğer JPA Nesne tabanlı depolama sistemleri aynı soruna (yani ObjectDB) sahiptir. Başka bir deyişle, standart bir ilişkisel veritabanı, özellikle büyük bir nesne grafiğinize sahip olduğunuzdan, en iyi teknoloji olmayabilir. –