あなたは会社を追跡するシステムを構築しています。これらの企業には連絡先があります。これらの連絡先は、請求/支払い、販売、注文、カスタマーサポートなど、特定の種類の質問にのみ回答する専門家であることがよくあります。
ドメイン駆動設計とオニオンアーキテクチャを使用して、これを次のタイプでモデル化しました。
- 会社
- 連絡先あり
- 連絡先
- 連絡先タイプがあります
- ContactType(列挙型)
- CompanyRepository(インターフェース)
- EFCompanyRepository(外部アセンブリで定義、EntityFrameworkを使用、CompanyRepositoryを実装)
私たちのチームは、このアプリケーションのデータベースをモデル化する方法について意見が分かれています。
サイドA:リーンDDDers:
- 連絡先に有効なContactTypeを定義するのはドメインの仕事です。不明なContactTypesが保存されていないことを検証するためにデータベースにテーブルを追加することは、リークのあるドメインの兆候です。ロジックが広すぎます。
- 静的テーブルをデータベースと対応するコードに追加することは無駄です。このアプリケーションでは、データベースが1つの問題を解決します。問題を永続化し、それを私に返します。追加のテーブルと対応するCRUDコードを書くのは無駄です。
- 永続化の戦略を変更することは可能な限り簡単でなければなりません。そのビジネスルールを変更する可能性が高くなります。SQL Serverのコストが高すぎると判断した場合、スキーマに入力したすべての検証を再構築する必要はありません。
サイドB:伝統主義者[それはおそらく公平な名前ではありません。DBCentrists?]:
- コードを読み取らなければ意味のないデータをデータベースに置くことは悪い考えです。レポートやその他の消費者は、値のリスト自体を繰り返す必要があります。
- オンデマンドでdbタイプの辞書をロードするためのコードはそれほど多くありません。心配しないでください。
- このソースがデータではなくコードである場合、変更時に単純なSQLスクリプトではなくビットを展開する必要があります。
どちらも正しいか間違っているかではありませんが、そのうちの1つはおそらく長期的にはより効率的であり、初期開発、バグなどの開発時間を数えます。このスタイルのコードを書く他のチームは何をしますか?