Tabel Pencarian: Apakah mereka bocor dalam model domain?

10

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?

Drew
sumber
Saya lebih suka memiliki tabel pencarian dalam database dan memiliki kode (template T4 dalam .NET) yang menghasilkan enum untuk saya berdasarkan tabel pencarian dalam kode aplikasi saya.
programmer
@JasonHolland Apakah templat T4 benar-benar melakukan kueri? Kalau tidak, saya tidak yakin bagaimana menghasilkan lebih dari enum kosong dengan nama yang diharapkan.
Drew
Untuk tabel dengan nilai statis, berapa banyak kode CRUD yang perlu Anda tulis? Script itu dan dilakukan.
JeffO
2
Argumen CRUD-ist tradisional tentang 'yah, tidak masuk akal untuk melaporkan' adalah tidak pemula. Segera setelah Anda memperkenalkan beberapa tanggung jawab lain yang dimiliki sistem (yaitu, melaporkan), Anda telah menemukan persyaratan bisnis yang perlu ditangani dengan tepat. Basis data ada untuk menyimpan dan memuat aplikasi sendiri, negara yang dilindungi; memungkinkan untuk dilaporkan menciptakan penggandaan antara aplikasi Anda dan orang-orang yang membutuhkan laporan. Jika DDD adalah tentang apa pun itu tentang memisahkan konteks ini.
Matt

Jawaban:

4

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!

Euforia
sumber
2

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.

VoiceOfUnreason
sumber
1

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

Ewan
sumber
bertanya-tanya apakah basis data sendiri memiliki fitur enum seperti ini
herzmeister
Saya kira itu akan tergantung pada DB, Anda dapat melakukan segala macam hal CLR gila dengan MSSQL. Tapi saya tegas dengan sisi 'DB bad, code good' dalam hal-hal seperti itu
Ewan
@herzmeister <3 PostgreSQL postgresql.org/docs/9.4/static/datatype-enum.html , Ewan DB adalah kode setelah Anda menerima prosedur tersimpan. (PLv8 luar biasa).
Sirisian
@Sirisian Anda tahu apakah itu campuran? Saya punya pertanyaan serupa. "Apakah ini berskala?"
Ewan
Apakah maksud Anda apakah itu melakukan produk silang untuk mengubah enum menjadi string? Mungkin tidak. Saya tidak yakin bagaimana ini diterapkan, tetapi lebih cepat daripada menggunakan tabel terpisah. Itu bersisik. Ditemukan ini juga: stackoverflow.com/questions/2318123/... Masih tampak seperti penilaian yang valid 5 tahun kemudian. (Saya cenderung menulis program yang sangat digabungkan ke PostgreSQL jadi saya menggunakan semua fitur, tetapi tidak semua orang bisa melakukannya).
Sirisian
0
  • Selama Anda menggunakan database relasional, Anda harus membuat tabel dinormalisasi sampai batas yang wajar. Normalisasi membantu mencegah penyisipan dan memperbarui anomali.
  • Hubungan satu-aplikasi <-> satu-basis data tidak lagi umum, beberapa aplikasi dapat menggunakan banyak basis data dan satu basis data dapat digunakan oleh banyak aplikasi, sehingga memiliki basis data yang memberlakukan integritas referensial sebanyak mungkin adalah baik.
  • RDBMS adalah teman Anda.
  • Anda bisa menggunakan penyimpanan nilai kunci dan melakukan semuanya dalam kode.
Tulains Córdova
sumber