Öncelikle, bunun ihmal edilmiş bir soru / alan gibi göründüğünü söylemek istiyorum, bu yüzden bu sorunun iyileştirilmesi gerekiyorsa, bunu başkalarına fayda sağlayabilecek harika bir soru yapmama yardımcı olun! Sadece denemek için fikirler değil, bu sorunu çözen çözümler uygulayan insanlardan tavsiye ve yardım arıyorum.
Tecrübelerime göre, bir uygulamanın iki tarafı vardır - büyük ölçüde etki alanı kullanan ve kullanıcıların etki alanı modeli (uygulamanın "motoru") ve kullanıcıların raporlama tarafı ile zengin etkileşimde bulunduğu "görev" tarafı Görev tarafında olanlara dayanarak veri almak.
Görev tarafında, zengin bir etki alanı modeline sahip bir uygulamanın etki alanı modelinde iş mantığına sahip olması ve veritabanı çoğunlukla kalıcılık için kullanılması gerektiği açıktır. Kaygıların ayrılması, her kitap hakkında yazılmıştır, ne yapacağımızı biliyoruz, harika.
Peki ya raporlama tarafı? Veri ambarları kabul edilebilir mi, yoksa veritabanında iş mantığını ve verinin kendisini içerdikleri için kötü tasarım mı? Veriyi veri tabanından veri ambarı verilerine toplamak için verilere iş mantığı ve kuralları uygulamış olmalısınız ve bu mantık ve kurallar etki alanı modelinizden gelmedi, veri toplama işlemlerinizden geldi. Yanlış mı?
İş mantığının kapsamlı olduğu büyük finansal ve proje yönetimi uygulamaları üzerinde çalışıyorum. Bu verileri raporlarken, rapor / gösterge tablosu için gereken bilgileri almak için sıkça bir sürü topluluğa katılırım ve toplanmaların içinde çok fazla iş mantığı vardır. Performans uğruna, çok toplanmış tablolarla ve saklı yordamlarla yapıyorum.
Örnek olarak, aktif projelerin bir listesini göstermek için bir rapor / gösterge panosunun gerekli olduğunu varsayalım (10.000 proje düşünün). Her projenin, onunla birlikte gösterilen bir dizi metriye ihtiyacı olacaktır, örneğin:
- toplam bütçe
- bugüne kadarki çaba
- pişirme oranı
- mevcut yanma oranında bütçe tükenme tarihi
- vb.
Bunların her biri çok fazla iş mantığı içerir. Ve ben sadece sayıların çarpılması ya da basit bir mantıktan bahsetmiyorum. Bütçeyi alabilmek için, her çalışanın zamanı (bazı projelerde, diğerinin çarpanı var), harcamaları ve uygun işaretlemeleri vb. İçeren 500 farklı oranlı bir ücret listesi uygulamak zorundasınız. mantık geniş. Bu verileri müşteri için makul bir sürede elde etmek için çok fazla toplama ve sorgulama ayarlama gerekiyordu.
Bu önce etki alanı üzerinden mi yürütülmeli? Peki ya performans? Düzgün SQL sorgularıyla bile, bu verileri müşterinin makul bir süre içinde görüntülemesi için yeterince hızlı bir şekilde alıyorum. Tüm bu etki alanı nesnelerini yeniden sulandırıyorsam ve verilerini uygulama katmanında karıştırıp eşleştiriyorsa veya veriyi uygulama katmanında birleştirmeyi deniyorsam, bu verileri müşteriye yeterince hızlı almaya çalışacağımı hayal edemiyorum.
Bu gibi durumlarda SQL veri toplamada iyidir ve neden kullanmıyorsunuz? Ancak, etki alanı modelinizin dışında bir iş mantığınız var. İşletme mantığında yapılacak herhangi bir değişiklik, etki alanı modelinizde ve raporlama toplama şemalarınızda değiştirilmelidir.
Etki alanı odaklı tasarım ve iyi uygulamalarla ilgili olarak herhangi bir uygulamanın raporlama / gösterge tablosunu nasıl tasarlayacağımı gerçekten yitiriyorum.
MVC etiketini ekledim çünkü MVC tasarım tadı du jour ve mevcut tasarımımda kullanıyorum, ancak raporlama verilerinin bu tür uygulamalara nasıl uyduğunu bulamıyorum.
Bu alanda herhangi bir yardım arıyorum - kitaplar, tasarım desenleri, google anahtar kelimeler, makaleler, her şey. Bu konuda herhangi bir bilgi bulamıyorum.
EDİT VE DİĞER BİR ÖRNEK
Bugün rastladığım bir başka mükemmel örnek. Müşteri, Müşteri Satış Ekibi için bir rapor istiyor. Basit bir metrik gibi görünen şeyi istiyorlar:
Her bir Satış elemanı için, bugüne kadarki yıllık satışları nedir?
Ama bu karmaşık. Her satış elemanı birden fazla satış fırsatına katıldı. Bazıları kazandılar, bazıları kazanmadı. Her bir satış fırsatında, her biri rolleri ve katılımları için satışlar için bir kredi yüzdesi tahsis edilmiş birden fazla satış elemanı vardır. Şimdi bunun için etki alanından geçtiğinizi hayal edin ... bu verileri her bir Satış görevlisinin veritabanından almak için yapmanız gereken nesne rehidrasyonunun miktarı:
Hepsini al
SalesPeople
->
Her biri içinSalesOpportunities
- -
Her biri için satış yüzdesini almak ve Satış tutarlarını hesaplamak ve
sonra tümSalesOpportunity
Satış tutarlarını eklemek.
Ve bu BİR metrik. Veya hızlı ve verimli bir şekilde yapabilen ve hızlı olmasını sağlayacak bir SQL sorgusu yazabilirsiniz.
EDIT 2 - CQRS Deseni
CQRS Örüntüsünü okudum ve merak uyandırırken, Martin Fowler bile test edilmediğini söylüyor. Peki, bu sorun geçmişte nasıl çözüldü? Bu, bir noktada veya başka bir yerde herkes tarafından karşı karşıya kalmış olmalı. Başarılı bir geçmişe sahip olan yerleşik veya iyi giyilmiş bir yaklaşım nedir?
Düzenleme 3 - Raporlama Sistemleri / Araçları
Bu bağlamda göz önünde bulundurulması gereken başka bir şey de raporlama araçlarıdır. Raporlama Servisleri / Kristal Raporlar, Analiz Servisleri ve Cognoscenti, vb. Hepsi SQL / veritabanından veri bekliyor. Verilerinizin daha sonra bunlar için işinizden geleceğinden şüpheliyim. Ve onlar ve onlar gibi diğerleri, birçok büyük sistemde raporlamanın hayati bir parçasıdır. Bunlara ait veriler, bu sistemler için veri kaynağında ve muhtemelen raporların kendisinde iş mantığının olduğu yerlerde, doğru şekilde nasıl işlenir?