Anda sedang membangun sistem yang melacak Perusahaan. Perusahaan-perusahaan itu memiliki Kontak. Kontak tersebut seringkali merupakan spesialis yang hanya menjawab jenis pertanyaan tertentu, seperti Penagihan / Pembayaran, Penjualan, Pemesanan, dan Dukungan Pelanggan.
Menggunakan Desain Berbasis Domain dan Arsitektur Bawang, saya telah memodelkan ini dengan tipe berikut:
- Perusahaan
- Memiliki Kontak
- Kontak
- Memiliki Jenis Kontak
- Jenis Kontak (enum)
- CompanyRepository (antarmuka)
- EFCompanyRepository (didefinisikan dalam rakitan eksternal, menggunakan EntityFramework, mengimplementasikan CompanyRepository)
Tim kami memiliki pendapat berbeda tentang cara memodelkan basis data untuk aplikasi ini.
Sisi A: The DDDers Lean:
- Tugas Domain adalah menentukan ContactTypes mana yang valid untuk Kontak. Menambahkan tabel ke database untuk memvalidasi bahwa ContactTypes yang tidak diketahui tidak disimpan adalah tanda domain bocor. Ini menyebarkan logika terlalu jauh.
- Menambahkan tabel statis ke database dan kode yang sesuai boros. Dalam aplikasi ini database memecahkan satu masalah: tetap ada dan berikan kembali kepada saya. Menulis tabel tambahan dan kode CRUD yang sesuai adalah pemborosan.
- Mengubah strategi untuk kegigihan semudah mungkin. Lebih mungkin untuk mengubah aturan bisnis itu. Jika saya memutuskan bahwa biaya SQL Server terlalu banyak saya tidak ingin harus membangun kembali semua validasi yang saya masukkan ke dalam skema saya.
Sisi B: Kaum Tradisionalis [itu mungkin bukan nama yang adil. The DBCentrists?]:
- Itu ide yang buruk untuk memiliki data dalam database yang tidak masuk akal tanpa membaca kode. Laporan dan konsumen lain harus mengulang daftar nilai itu sendiri.
- Bukan kode yang banyak untuk memuat kamus jenis db Anda sesuai permintaan. Jangan khawatir tentang itu.
- Jika sumber ini adalah kode dan bukan data saya harus menggunakan bit, bukan skrip SQL sederhana ketika itu berubah.
Tidak ada pihak yang benar atau salah, tetapi salah satu dari mereka mungkin lebih efisien dalam jangka panjang, menghitung waktu pengembangan untuk pengembangan awal, bug, dll. Sisi mana itu - atau apakah ada kompromi yang lebih baik? Apa yang dilakukan oleh tim lain yang menulis gaya kode ini?
Jawaban:
Dengan mengadopsi arsitektur DDD dan bawang, Anda telah memutuskan bahwa database adalah yang kedua dari model domain Anda. Itu berarti, tidak akan ada orang lain yang melakukan operasi pada database selain model. Jika tradisionalis tidak suka itu, mereka seharusnya keberatan untuk menggunakan DDD.
Hal pertama jelas: Anda membutuhkan "tabel pencarian" dalam model. Model Anda perlu membedakan antara berbagai jenis kontak. Itu berarti, ia menyimpan daftar semua jenis yang diketik dengan sangat kuat. Perlu juga pemetaan dari tipe-tipe kuat ke nilai-nilai yang serial ke database. Pemetaan ini bisa berada di dalam modul basis data. Tetapi daftar semua tipe yang mungkin masih ada dalam model. Dan jika model itu adalah sumber kebenaran tunggal, maka itu tidak bisa berada di dalam basis data. Atau setidaknya, ketika daftar berubah dalam model, perlu diubah dalam database. Dan tidak ada tapian!
sumber
Objek domain berhenti menjadi objek domain ketika mereka melewati batas proses . Bahkan jika database hanyalah sebuah toko yang bertahan lama, pada suatu saat di masa depan tuntutan bisnis akan menyebabkan perubahan pada model domaim yang tidak sesuai dengan sejarah yang masih ada, dan Anda akan memerlukan lapisan anti korupsi. ....
Yang mengatakan, saya pikir DBCentrists Anda kehilangan kapalnya. Pemodel domain mengatakan bahwa mereka membutuhkan toko kegigihan. "Laporan dan konsumen lain" membutuhkan sesuatu yang dapat mereka tanyakan - sesuatu dengan indeks yang layak, seperti telah dicatat dalam komentar.
Siapa yang memperkenalkan batasan bahwa semua masalah yang berbeda ini perlu didukung oleh satu database? Apa yang terjadi jika Anda menekan itu.
Cari kata kunci: CQRS.
sumber
Saya telah menemukan yang terbaik untuk menyimpan enums sebagai representasi string mereka dalam database dan tidak termasuk tabel pencarian.
Jelas kerugiannya adalah ini menggunakan lebih banyak ruang disk dan tidak dinormalisasi.
Sisi positifnya adalah bahwa bidang mempertahankan maknanya di db, Anda tidak berakhir dengan angka ajaib yang sesuai dengan nilai int enum misalnya dan Anda tidak perlu mengelola versi tabel pencarian ketika enum berubah.
Tidak yakin saya akan mencirikan ini sebagai perbedaan DDD vs Trad. Lebih banyak basis data-sentralis vs kode yang terbaik menurut saya
sumber
sumber