Sie bauen ein System auf, das Unternehmen im Auge behält. Diese Unternehmen haben Kontakte. Bei diesen Kontakten handelt es sich häufig um Spezialisten, die nur bestimmte Arten von Fragen beantworten, z. B. Abrechnung / Zahlung, Verkauf, Bestellung und Kundenunterstützung.
Unter Verwendung von domänengesteuertem Design und einer Zwiebelarchitektur habe ich dies mit den folgenden Typen modelliert:
- Unternehmen
- Hat Kontakte
- Kontakt
- Hat Kontakttypen
- ContactType (Aufzählung)
- CompanyRepository (Schnittstelle)
- EFCompanyRepository (in einer externen Assembly definiert, verwendet EntityFramework, implementiert CompanyRepository)
Unser Team ist sich uneinig, wie die Datenbank für diese Anwendung modelliert werden soll.
Seite A: Die Lean DDDers:
- Es ist Aufgabe der Domain, zu definieren, welche ContactTypes für einen Contact gültig sind. Das Hinzufügen einer Tabelle zur Datenbank, um zu überprüfen, ob unbekannte ContactTypes nicht gespeichert werden, ist ein Zeichen für eine undichte Domäne. Es verbreitet die Logik zu weit.
- Das Hinzufügen einer statischen Tabelle zur Datenbank und des entsprechenden Codes ist verschwenderisch. In dieser Anwendung löst die Datenbank ein Problem: Behalten Sie das Ding bei und geben Sie es mir zurück. Das Schreiben einer zusätzlichen Tabelle und des entsprechenden CRUD-Codes ist verschwenderisch.
- Das Ändern der Persistenzstrategie sollte so einfach wie möglich sein. Es ist wahrscheinlicher, dass sich diese Geschäftsregeln ändern. Wenn ich feststelle, dass SQL Server zu viel kostet, möchte ich nicht die gesamte Validierung neu erstellen müssen, die ich in mein Schema eingefügt habe.
Seite B: Die Traditionalisten [das ist wahrscheinlich kein fairer Name. Die DBCentristen?]:
- Es ist eine schlechte Idee, Daten in der Datenbank zu haben, die ohne Lesen von Code keinen Sinn ergeben. Berichte und andere Verbraucher müssen die Werteliste selbst wiederholen.
- Es ist nicht so viel Code, um Ihre DB-Wörterbücher bei Bedarf zu laden. Mach dir keine Sorgen.
- Wenn die Quelle hierfür Code und keine Daten sind, muss ich bei Änderungen Bits anstelle eines einfachen SQL-Skripts bereitstellen.
Keine Seite ist richtig oder falsch, aber eine von ihnen ist auf lange Sicht wahrscheinlich effizienter und zählt die Entwicklungszeit für die anfängliche Entwicklung, Fehler usw. Welche Seite ist das - oder gibt es einen besseren Kompromiss? Was machen andere Teams, die diesen Codestil schreiben?