2009-08-13 43 views
6

Şu anda makale ve Etiketler adı verilen iki tablo içeren bir veritabanım var. Makalelerin birden fazla kategoride olmasına izin vermek için çok fazla ilişkiye sahibim. Performans açısından böyle bir tasarıma sahip olmak bir hata mıdır? veya bu iki tablo arasındaki ilişkiyi kaldırmalı ve üçüncü bir tabloyu köprü olarak eklemeliyim (articlesTags)?Veritabanı tasarımında çoktan çoğa ilişkisi

+8

ArticlesTags tablosu kullanmadan çoktan çoğa ilişki nasıl oluşturdunuz? – flayto

+2

Çoktan çoğa ilişkiniz varsa, temsil etmek için üçüncü tablonuz gerekir - mantıklı bir alternatif yoktur. En yakın yaklaşımınız her tabloda bir SET yapısı olabilir - DBMS'niz bunu destekliyorsa. Ancak, tipik olarak, bu tür tiplerde çok fazla masa başı kontrolü yoktur - ayrı tablo gereklidir. –

cevap

15

Çoktan çoğa ilişkisine sahip olmanın doğal olarak yanlış bir tarafı yok, yalnızca Junction Table (articlesTags ile ilgili olduğunu düşündüğünüz gibi) bu ilişkiyi kolaylaştırmak için oluşturmanız gerekir.

+3

Ayrıca Kavşak tablosu olarak da bilinir. – APC

+0

Bunun için mantıklı bir soyutlama istiyorum. Bu kendi kendine oluşturulmuş ve kendi kendini yöneten birleşim tablosu malarkey çok uzun bir süredir devam ediyor. – Brandon

+0

@APC veya birleşim tablosu (en az JPA) –

1

Verilerin gerektirdiği buysa, çoktan çoğa ilişkisine sahip olmakla ilgili bir sorun yok, ancak bunu temsil edecek bir 3 tablo isteyeceksiniz.

+2

"Üçüncü bir masaya ihtiyacınız olacak" derdim. – Dave

2

: bunu uygulamak gerekir zaman gerekecek bir articles_to_tags tablo olacaktır Birçok ilişkilere. Genellikle gereklidir.

Ve evet, üçüncü bir tablo kullanmadan çok fazla ilişki oluşturmak mümkün değildir.

6

Kavramsal veritabanı tasarımı (N: N ilişkisi) ile fiziksel gerçekleşme arasındaki farkı görüyorsunuz. N: N ilişkinizi nasıl modellediğinize bakılmaksızın, çalışmasını sağlamak için yukarıda belirtilen Bağlantı Tablosuna ihtiyacınız olacaktır. Genel bir ifade olarak gerçek dünyaya yakın bir gerçek dünya ilişkisini modellemekte yanlış bir şey yoktur. Berraklık kraldır.

Herhangi bir sistemdeki herhangi bir performans sorusu söz konusu olduğunda, yanıt genellikle "bağlı" durumuna düşer.

Performans sorununuz WRITES ile ilişkiliyse, yüksek bir NORMALIZED yapısı en iyisidir ve bu Bağlantı tablosunu isteyeceksiniz. Sonunda çok daha az veri yazacaksınız ve bu da işleri büyük ölçüde hızlandırabileceksiniz (buna rağmen eklentileri oluşturmadan önce arama yapmak zorunda kalarak bu avantajı yakabilirsiniz). Kişiselleştirilmiş normal tablolardan okumak da çok hızlı olabilir.

Sorununuz analitik READS ile ilgili ise, DENORMALISED bir yapı en iyisidir. Tablolar büyükse ve indeksler yayılırsa, birleşimler çok yoğun olabilir. Çok fazla zaman kazanmak için çok fazla alan kurban edersiniz. Genel olarak, durumunuzun ayrıntılarına bakmak ve bir çözüm üzerinde karar vermeden önce her yaklaşımın artılarını ve eksilerini tartmak istersiniz. Şahsen, ilk aşamalarda Clarity'ye odaklanmayı ve daha sonra bir problemi keşfettiğimde performansın yeniden düzenlenmesini her zaman daha iyi buldum.

İlgili konular