Arama Tabloları: Etki alanı modelinde sızıntı var mı?


10

Şirketleri takip eden bir sistem kuruyorsunuz. Bu şirketlerin Rehberleri var. Bu kişiler genellikle Faturalandırma / Ödeme, Satış, Sipariş ve Müşteri Desteği gibi belirli soruları yanıtlayan uzmanlardır.

Etki Alanına Dayalı Tasarım ve Soğan Mimarisini kullanarak, bunu aşağıdaki türlerle modelledim:

  • şirket
    • Kişileri Var
  • İletişim
    • İletişim Türleri Var
  • ContactType (numaralandırma)
  • CompanyRoository (arayüz)
  • EFCompanyRepository (harici bir montajda tanımlanır, EntityFramework kullanır, CompanyRepository uygular)

Ekibimiz bu uygulama için veritabanının nasıl modelleneceği konusunda bölünmüş bir görüşe sahiptir.

A Tarafı: Yalın DDDers:

  • Bir Kişi için hangi Kişi Tiplerinin geçerli olduğunu tanımlamak, Etki Alanının görevidir. Bilinmeyen ContactTypes'in kaydedilmediğini doğrulamak için veritabanına bir tablo eklemek sızdıran bir alanın işaretidir. Mantık çok uzaklara yayılıyor.
  • Veritabanına ve ilgili koda statik bir tablo eklemek israftır. Bu uygulamada veritabanı bir sorunu çözer: şey devam ve bana geri vermek. Fazladan bir tablo ve karşılık gelen CRUD kodu yazmak israftır.
  • Kalıcılık stratejisini değiştirmek mümkün olduğunca kolay olmalıdır. Bu iş kurallarını değiştirme olasılığı daha yüksektir. SQL Server'ın çok pahalı olduğuna karar verirsem, şemamda yaptığım tüm doğrulamayı yeniden oluşturmak istemiyorum.

B Tarafı: Gelenekçiler [bu muhtemelen adil bir isim değildir. DBCentristler?]:

  • Veritabanında kod okumadan anlamlı olmayan verilerin olması kötü bir fikirdir. Raporlar ve diğer tüketiciler değer listesini kendileri tekrar etmek zorundadır.
  • İsteğe bağlı olarak db tipi sözlüklerinizi yüklemek için bu kadar kod değil. Endişelenme.
  • Bunun kaynağı kod değil veri ise, değiştiğinde basit bir SQL betiği yerine bit dağıtmak zorunda kalacağım.

Her iki taraf da doğru ya da yanlış değildir, ancak bunlardan biri uzun vadede muhtemelen daha verimlidir, ilk geliştirme, hatalar, vb. İçin geliştirme süresini sayar. Hangi taraf - ya da daha iyi bir uzlaşma var mı? Bu kod tarzını yazan diğer takımlar ne yapar?


Ben veritabanında arama tabloları ve uygulama kodumdaki arama tabloları dayalı benim için enums üreten kodu (.NET T4 şablonları) var tercih ederim.
programcı

@JasonHolland T4 şablonu aslında bir sorgu gerçekleştiriyor mu? Aksi takdirde, beklenen ada sahip boş bir numaradan daha fazlasını nasıl ürettiğinden emin değilim.
Drew


Statik değerleri olan bir tablo için ne kadar CRUD kodu yazmanız gerekir? Senaryo yaz ve bitir.
JeffO

2
CRUD-ist'in 'iyi, raporlama için mantıklı olmayacağı' iddiası bir başlangıç ​​değil. Sistemin sahip olduğu başka bir sorumluluğu (en kısa sürede bildirmek) getirdiğiniz anda, uygun şekilde ele alınması gereken bir iş gereksinimi buldunuz. Veritabanı, uygulamaların kendi korunan durumlarını depolamak ve yüklemek için oradadır; bildirilmesine izin vermek, uygulamanızla raporlara ihtiyaç duyan kişiler arasında bir bağlantı oluşturur. DDD herhangi bir şeyle ilgiliyse, bu bağlamları ayırmakla ilgilidir.
Matt

Yanıtlar:


4

DDD ve soğan mimarisini benimseyerek, veritabanınızın etki alanı modelinizden ikinci olduğuna karar verdiniz. Başka bir deyişle, veritabanında model dışında işlem yapan başka kimse olmayacaktır. Eğer gelenekçiler bundan hoşlanmazlarsa, öncelikle DDD kullanmaya itiraz etmelilerdi.

İlk şey açık: modeldeki "arama tablosu" na ihtiyacınız var. Modelinizin farklı kişi türleri arasında ayrım yapması gerekir. Bu, her türden güçlü bir liste tutarı anlamına gelir. Ayrıca, bu güçlü türlerden veritabanına serileştirilmiş değerlere eşleme yapılması gerekir. Bu eşleme veritabanı modülünün içinde olabilir. Ancak tüm olası türlerin listesi hala modelde olacaktır. Ve eğer model tek bir gerçek kaynağı olacaksa, o zaman veritabanının içinde olamaz. Ya da en azından liste modelde değiştiğinde, veritabanında değişmesi gerekir. Ve kıç yok!


2

Etki alanı nesneleri, bir işlem sınırını aştıklarında etki alanı nesneleri olmayı durdurur . Veritabanı sadece bir kalıcılık deposu olsa bile, gelecekte bir noktada işletmenin talepleri, kalıcı tarihle tutarsız olan etki alanı modelinde bir değişikliğe neden olacak ve yine de bir yolsuzlukla mücadele katmanına ihtiyacınız olacak ....

Bununla birlikte, DBCentristlerinizin tekneyi kaçırdığını düşünüyorum. Alan modelcileri bir kalıcılık deposuna ihtiyaç duyduklarını söylüyorlar. "Raporlar ve diğer tüketiciler", yorumlarında belirtildiği gibi sorgulayabilecekleri bir şeye ihtiyaç duyarlar.

Tüm bu farklı kaygıların tek bir veritabanı tarafından desteklenmesi gerektiği kısıtlamasını kim getirdi ? Bunu geri itersen ne olur?

Arama anahtar sözcükleri: CQRS.


1

Ben enum veritabanında dize temsili olarak depolamak ve bir arama tablosu dahil en iyi bulduk.

Açıkçası bunun dezavantajı, daha fazla disk alanı kullanması ve normalleştirilmemesidir.

Artı tarafı, alanın db'deki anlamını koruduğu, örneğin numaralandırmanın int değerine uygun sihirli sayılarla karşılaşmamanız ve numaralandırma değiştiğinde bir arama tablosunun sürümlendirmesini yönetmeniz gerekmez.

Bunu DDD vs Trad farkı olarak karakterize ediyorum emin değilim. Bence daha çok veritabanı-merkezci vs kod bence en iyisi


veritabanları kendilerini bu günlerde böyle bir numaralandırma özelliği olup olmadığını merak
herzmeister

Sanırım DB bağlıdır, MSSQL ile çılgın CLR şeyler her türlü yapabilirsiniz. Ama bu tür şeyler söz konusu olduğunda 'DB kötü, kod iyi' tarafı ile sıkı bir şekilde
Ewan

@herzmeister <3 PostgreSQL postgresql.org/docs/9.4/static/datatype-enum.html , Ewan Saklı yordamları benimsediğinizde DB koddur. (PLv8 harika).
Sirisian

@Sirisian, bir şeyi karıştırdığını biliyor musun? Benzer bir sorum var. "ölçekleniyor mu?"
Ewan

Yani numaralandırmayı bir dizeye dönüştürmek için çapraz ürün yapıyor mu? Muhtemelen değil. Nasıl uygulandığından emin değilim, ancak ayrı bir tablo kullanmaktan daha hızlı. Ölçekler. Bunu da buldum : stackoverflow.com/questions/2318123/… 5 yıl sonra hala geçerli bir değerlendirme gibi görünüyor. (Tüm özellikleri kullandığım için PostgreSQL ile yüksek oranda bağlantılı programlar yazma eğilimindeyim, ancak herkes bunu yapamaz).
Sirisian

0
  • İlişkisel bir veritabanı kullandığınız sürece tabloları makul ölçüde normalleştirmelisiniz. Normalleştirme, ekleme ve güncelleme anormalliklerini önlemeye yardımcı olur.
  • Tek uygulama <-> tek veritabanı ilişkisi artık yaygın değildir, birden fazla uygulama birden çok veritabanı kullanabilir ve tek bir veritabanı birden fazla uygulama tarafından kullanılabilir, bu nedenle veritabanının referans bütünlüğünü mümkün olduğunca zorlaması iyidir.
  • RDBMS senin arkadaşın.
  • Bunun yerine bir anahtar / değer depolama alanına gidebilir ve koddaki her şeyi yapabilirsiniz.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.