Her şeyden önce, ilişkisel bir veritabanının varoluş nedeni (var olma nedeni) varlıklar arasındaki ilişkileri modelleyebilmektir. Birleşmeler, basitçe bu ilişkileri aştığımız mekanizmalardır. Kesinlikle nominal bir maliyetle gelirler, ancak birleştirme olmadan ilişkisel bir veritabanına sahip olmak için gerçekten bir neden yoktur.
Akademik dünyada, çeşitli normal formlar (1., 2., 3., Boyce-Codd, vb.) Gibi şeyleri öğreniriz ve farklı anahtar türleri (birincil, yabancı, alternatif, benzersiz vb.) Ve nasıl bunlar bir veritabanı tasarlamak için birbirine uyar. Ve hem yapıyı hem de verileri (DDL ve DML) değiştirmenin yanı sıra SQL'in temellerini öğreniyoruz.
Kurumsal dünyada, akademik yapıların birçoğu inanmaya yönlendirildiğimizden önemli ölçüde daha az uygulanabilir hale geldi. Mükemmel bir örnek, birincil anahtar kavramıdır. Akademik olarak tablodaki bir satırı benzersiz bir şekilde tanımlayan özniteliktir (veya öznitelikler koleksiyonudur). Bu nedenle birçok problem alanında, uygun akademik birincil anahtar 3 veya 4 özelliğin birleşimidir. Bununla birlikte, modern kurumsal dünyadaki hemen hemen herkes, tablonun birincil anahtarı olarak otomatik oluşturulan, sıralı bir tamsayıyı kullanır. Neden? İki sebep. Birincisi, FK'leri her yere taşırken modeli çok daha temiz hale getirmesidir. İkincisi ve bu sorunun en önemli yanı, birleştirmeler yoluyla veri almanın tek bir tamsayı üzerinde 4 varchar sütununda olduğundan daha hızlı ve daha verimli olmasıdır (daha önce birkaç kişi tarafından bahsedildiği gibi).
Şimdi, gerçek dünya veritabanlarının iki belirli alt türüne biraz daha derine bakalım. İlk tür, işlemsel bir veritabanıdır. Bu, modern siteleri yönlendiren birçok e-ticaret veya içerik yönetimi uygulamasının temelidir. Bir işlem DB'si ile, "işlem hacmi" doğrultusunda büyük ölçüde optimizasyon yaparsınız. Çoğu ticaret veya içerik uygulaması, sorgu performansını (belirli tablolardan) ekleme performansı (diğer tablolarda) ile dengelemek zorundadır, ancak her uygulamanın çözülmesi gereken kendine özgü iş odaklı sorunları olacaktır.
İkinci tür gerçek dünya veritabanı bir raporlama veritabanıdır. Bunlar, neredeyse yalnızca iş verilerini toplamak ve anlamlı iş raporları oluşturmak için kullanılır. Tipik olarak, verilerin üretildiği işlem veritabanlarından farklı bir şekle sahiptirler ve toplu veri yükleme hızı (ETL'ler) ve büyük veya karmaşık veri kümeleriyle sorgu performansı için oldukça optimize edilmiştir.
Her durumda, geliştiricinin veya DBA'nın hem işlevselliği hem de performans eğrilerini dikkatlice dengelemesi gerekir ve denklemin her iki tarafında çok sayıda performans artırıcı hile vardır. Oracle'da, bir sorgunun nasıl ayrıştırıldığını ve yürütüldüğünü spesifik olarak görebilmeniz için "açıklama planı" adı verilen şeyi yapabilirsiniz. DB'nin doğru dizin kullanımını maksimize etmek istiyorsunuz. Gerçekten kötü bir hayır-hayır, sorgunun where cümlesine bir işlev koymaktır. Bunu her yaptığınızda, Oracle'ın söz konusu sütunda herhangi bir dizin kullanmayacağını garanti edersiniz ve muhtemelen açıklama planında tam veya kısmi bir tablo taraması görürsünüz. Bu, yavaş sonuçlanan bir sorgunun nasıl yazılabileceğinin yalnızca bir örneğidir ve birleştirmelerle hiçbir ilgisi yoktur.
Tablo taramalarından bahsederken, bunlar açıkça sorgu hızını tablonun boyutuyla orantılı olarak etkiler. 100 satırlık tam bir tablo taraması bile fark edilmez. Aynı sorguyu 100 milyon satırlık bir tabloda çalıştırın ve geri dönüş için önümüzdeki hafta tekrar gelmeniz gerekecek.
Bir dakikalığına normalizasyondan bahsedelim. Bu, aşırı strese girebilecek büyük ölçüde olumlu bir akademik konudur. Normalizasyondan bahsettiğimizde çoğu zaman, yinelenen verileri kendi tablosuna koyarak ve bir FK'yi taşıyarak ortadan kaldırmayı kastediyoruz. İnsanlar genellikle 2NF ve 3NF tarafından tanımlanan tüm bağımlılık olayını atlarlar. Yine de aşırı bir durumda, muazzam büyüklükte mükemmel bir BCNF veri tabanına sahip olmak kesinlikle mümkündür ve çok normalleştirildiği için ona karşı kod yazmak için tam bir canavar.
Öyleyse nerede dengeliyoruz? Tek bir en iyi cevap yok. Daha iyi yanıtların tümü, yapı bakımı kolaylığı, veri bakımı kolaylığı ve kod oluşturma / bakım kolaylığı arasında bir miktar uzlaşma olma eğilimindedir. Genel olarak, verilerin ne kadar az kopyalanması o kadar iyidir.
Öyleyse neden birleşimler bazen yavaş? Bazen kötü ilişkisel tasarım. Bazen etkisiz indeksleme. Bazen bu bir veri hacmi sorunudur. Bazen korkunç yazılmış bir sorudur.
Bu kadar uzun soluklu bir cevap için özür dilerim, ancak 4 maddelik bir cevabı takırdatmaktansa yorumlarımın etrafında daha etli bir bağlam sağlamaya mecbur hissettim.