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?
Antworten:
Durch die Übernahme der DDD- und Zwiebelarchitektur haben Sie entschieden, dass die Datenbank nach Ihrem Domänenmodell an zweiter Stelle steht. Das bedeutet, dass außer dem Modell niemand andere Operationen an der Datenbank ausführt. Wenn Traditionalisten das nicht mögen, hätten sie in erster Linie gegen die Verwendung von DDD protestieren sollen.
Das erste ist klar: Sie benötigen die "Nachschlagetabelle" im Modell. Ihr Modell muss zwischen verschiedenen Arten von Kontakten unterscheiden. Das heißt, es wird eine stark typisierte Liste aller Typen geführt. Es muss auch eine Zuordnung von diesen starken Typen zu Werten erfolgen, die in die Datenbank serialisiert werden. Diese Zuordnung kann sich im Datenbankmodul befinden. Die Liste aller möglichen Typen befindet sich jedoch weiterhin im Modell. Und wenn das Modell eine einzige Quelle der Wahrheit sein soll, kann es sich nicht in der Datenbank befinden. Wenn sich die Liste im Modell ändert, muss sie sich zumindest in der Datenbank ändern. Und kein Aber!
quelle
Domänenobjekte sind keine Domänenobjekte mehr, wenn sie eine Prozessgrenze überschreiten . Selbst wenn es sich bei der Datenbank nur um einen Persistenzspeicher handelt, werden die Anforderungen des Unternehmens zu einem späteren Zeitpunkt zu einer Änderung des Domaim-Modells führen, die nicht mit dem persistierten Verlauf übereinstimmt, und Sie benötigen ohnehin eine Antikorruptionsschicht ....
Das heißt, ich denke, Ihre DBCentrists vermissen das Boot. Die Domain-Modellierer sagen, dass sie einen Persistenzspeicher benötigen. "Berichte und andere Verbraucher" benötigen etwas, das sie abfragen können - etwas mit anständigen Indizes, wie in Kommentaren erwähnt wurde.
Wer hat die Einschränkung eingeführt, dass all diese unterschiedlichen Anliegen von einer Datenbank unterstützt werden müssen ? Was passiert, wenn Sie das zurückschieben?
Suchbegriff: CQRS.
quelle
Ich habe festgestellt, dass es am besten ist, Aufzählungen als Zeichenfolgendarstellung in der Datenbank zu speichern und keine Nachschlagetabelle einzuschließen.
Der Nachteil dabei ist natürlich, dass mehr Speicherplatz benötigt wird und nicht normalisiert wird.
Das Plus ist, dass das Feld seine Bedeutung in der Datenbank beibehält. Sie erhalten beispielsweise keine magischen Zahlen, die dem int-Wert der Aufzählung entsprechen, und Sie müssen die Versionierung einer Nachschlagetabelle nicht verwalten, wenn sich die Aufzählung ändert.
Ich bin mir nicht sicher, ob ich dies als einen Unterschied zwischen DDD und Trad charakterisieren würde. Es ist meiner Ansicht nach eher ein Datenbank-Zentralist gegen Code
quelle
quelle