Kısa versiyon
Varolan bir çok-çok katılmak her çift için sabit sayıda ek özellikler eklemek zorunda. Aşağıdaki şemalara atlamak, avantajları ve dezavantajları açısından Temel Davayı genişleterek bunu başarmanın en iyi yolu Seçenek 1-4'ten hangisidir? Yoksa burada düşünmediğim daha iyi bir alternatif var mı?
Daha uzun versiyon
Şu anda bir ara birleştirme tablosu aracılığıyla, çok-çok ilişkisi iki tablo var. Şimdi varolan nesnelerin çift ait özelliklere ek bağlantılar eklemeniz gerekir. Özellik tablosundaki bir giriş birden çok çift (hatta bir çift için birden çok kez kullanılabilir) olsa da, her çift için bu özelliklerin sabit bir sayısı var. Bunu yapmanın en iyi yolunu belirlemeye çalışıyorum ve durumu nasıl düşüneceğimizi sıralamakta zorlanıyorum. Anlamsal olarak, aşağıdakileri eşit derecede iyi olarak tanımlayabilirim gibi görünüyor:
- Sabit sayıda ek özellik kümesine bağlı bir çift
- Birçok ek özelliğe bağlı bir çift
- Bir özellik kümesine bağlı birçok (iki) nesne
- Birçok özelliğe bağlı birçok nesne
Misal
İki nesne türü, X ve Y, her biri benzersiz kimlikleri ve objx_objy
sütunları olan bir bağlantı tablosu x_id
ve y_id
birlikte bağlantı için birincil anahtarı oluşturur. Her X birçok Y ile ilişkili olabilir veya bunun tersi de geçerlidir. Bu benim mevcut çoktan çoğa ilişkimin kurumu.
Temel Durum
Şimdi ek olarak başka bir tabloda tanımlanmış bir dizi özelliğe ve belirli bir (X, Y) çiftinin P özelliğine sahip olması gereken bir dizi koşula sahibim. Koşulların sayısı sabittir ve tüm çiftler için aynıdır. Temel olarak "C1 durumunda, çift (X1, Y1) P1 özelliğine sahiptir", "C2 durumunda çift (X1, Y1) P2 özelliğine sahiptir" vb. Derler. tablo.
seçenek 1
Benim Mevcut durumda orada tam olarak üç tür durumlar vardır ve bir olasılık sütunları eklemek için, yani daha o artmasını bekliyoruz için hiçbir neden yok c1_p_id
, c2_p_id
ve c3_p_id
hiç featx_featy
bir verilen için belirtilerek, x_id
ve y_id
hangi özellik, p_id
üç durumların her kullanılmak üzere .
Bu benim için harika bir fikir gibi görünmüyor, çünkü bir özelliğe uygulanan tüm özellikleri seçmek için SQL'i karmaşıklaştırıyor ve daha fazla koşula kolayca ölçeklenmiyor. Bununla birlikte, (X, Y) çifti başına belirli sayıda koşulun gerekliliğini zorlar. Aslında, bunu yapan tek seçenek budur.
seçenek 2
Bir koşul tablosu oluşturun cond
ve birleştirme tablosunun birincil anahtarına koşul kimliğini ekleyin.
Bunun bir dezavantajı, her bir çift için koşul sayısını belirtmemesidir. Bir diğeri, sadece ilk ilişkiyi düşündüğümde,
SELECT objx.*, objy.* FROM objx
INNER JOIN objx_objy ON objx_objy.x_id = objx.id
INNER JOIN objy ON objy.id = objx_objy.y_id
Sonra DISTINCT
yinelenen girişleri önlemek için bir madde eklemek zorunda. Bu, her bir çiftin sadece bir kez var olması gerçeğini kaybetmiş görünüyor.
Seçenek 3
Birleştirme tablosunda yeni bir 'çift tanıtıcısı' oluşturun ve birincisi ile özellikler ve koşullar arasında ikinci bir bağlantı tablosu oluşturun.
Bu, her çift için sabit sayıda koşulun uygulanmaması dışında en az dezavantaja sahip gibi görünüyor. Mevcut kimliklerden başka bir şey tanımlamayacak yeni bir kimlik oluşturmak mantıklı mı?
Seçenek 4 (3b)
Temel olarak Seçenek 3 ile aynı, ancak ek kimlik alanı oluşturulmadan. Bu, her iki orijinal kimliğin yeni birleştirme tablosuna yerleştirilmesiyle gerçekleştirilir, böylece bunun yerine x_id
ve y_id
alanları içerir xy_id
.
Bu forma ek bir avantaj, mevcut tabloları değiştirmemesidir (henüz üretimde olmasalar da). Bununla birlikte, temel olarak tüm bir tabloyu birkaç kez çoğaltır (veya yine de bu şekilde hisseder), bu yüzden ideal görünmez.
özet
Benim düşüncem, Seçenek 3 ve 4'ün her ikisiyle de gidebileceğim kadar benzer olduğudur. Muhtemelen şimdiye kadar değilse Seçenek 1, aksi takdirde daha makul görünüyor yapar özellikleri bağlantıları küçük bir sabit gereksinimi için olurdu. Bazı çok sınırlı testlere dayanarak, DISTINCT
sorgularıma bir cümle eklemek bu durumda performansı etkilemiyor gibi görünüyor, ancak yerleştirmenin neden olduğu doğal çoğaltma nedeniyle Seçenek 2'nin durumu ve diğerlerini de temsil ettiğinden emin değilim bağlantı tablosunun birden çok satırında aynı (X, Y) çiftleri.
Bu seçeneklerden biri benim en iyi yolum mu yoksa dikkate almam gereken başka bir yapı var mı?
DISTINCT
maddesi, ben bağlantılar 2. sonunda biri gibi bir sorgunun düşünüyordum x
ve y
içinden xyc
ifade etmez ama c
ben eğer ... So (x_id, y_id, c_id)
kısıtlı UNIQUE
satırlarla (1,1,1)
ve (1,1,2)
sonra SELECT x.id, y.id FROM x JOIN xyc JOIN y
, geri özdeş iki alırsınız satırlar, (1,1)
ve (1,1)
.