Können Domainmodelle in der Datenbank eine nachhaltige Lösung sein?

13

Ich habe gerade einen neuen Job als Datenbankentwickler für ein mittelständisches Unternehmen begonnen, das auf Microsoft-Technologie basiert. Ich habe schon früh gemerkt, wie sehr die Praktiken in Bezug auf bewährte Praktiken, Entwurfsmuster, Tests und Projektmanagement von den in der Schule gelehrten Praktiken abweichen.

Was mich am meisten stört, ist, wie unser Hauptdatenbankentwickler (im Folgenden "John" genannt) das Modellschema in der Datenbank hält! Wir tun dies, indem wir 3 "magische" Tische haben; eines für Datenbankschemata, eines für Tabellen und eines für Spalten.

Das Einfügen eines Datensatzes in die " Tables " -Tabelle erzeugt (über einen Datenbank-Trigger) die aktuelle, entsprechende Tabelle. Durch das Einfügen einer Zeile in die " Zeilen " -Tabelle wird die referenzierte Tabelle mit dieser Zeile aktualisiert. Diese werden wiederum von seinem hausgemachten C # -Programm gelesen, um C # -Modelle zu generieren, die von den Frontend-Entwicklern für Controller und nach außen verwendet werden.

Abgesehen davon erfolgt der größte Teil der Entwicklung gemäß dem ASP.NET MVC- Framework.

Ich sehe ein paar Mängel bei diesem Ansatz:

  • Wir brauchen ihn, um den ORM aufrechtzuerhalten, und er hat selten die Zeit dazu (Arbeitsplatzsicherheit ist gut!)
  • Die Auslöser für die Tabellen "Tables" und "Rows" sind fehlerhaft. Sie unterstützen keine Tabellenaktualisierungen, Check-Constraints oder "erweiterte" Funktionen. Obwohl wir sie sicherlich verbessern könnten, bin ich mir noch nicht sicher, ob dies der richtige Weg ist.
  • Das Behalten der Programmlogik in der Datenbank fühlt sich seltsam und einschränkend an (obwohl es möglich ist, seine Modelle durch C # zu erweitern).
  • Sein C # -Modellgenerator muss manuell von einer von drei Personen (unter denen ich eine bin) ausgeführt werden und ist noch nicht ausgereift genug, um in einen automatisierten Erstellungsprozess einbezogen zu werden.

Einige Leute haben vorgeschlagen, ein echtes und getestetes Produkt wie Entity Framework einzuführen, aber er lehnt es ab, da die Geschäftslogik nur für kleine Anwendungen und Bootstrap-Projekte für Startups geeignet ist.

Dieser Beitrag führt zu etwas, das wie eine Diskussion mit einer Meinung aussieht, aber das ist nicht meine Absicht. Ich möchte nur etwas Klarheit über unseren architektonischen Ansatz.

Kann die Speicherung der Domain-Modelle in der Datenbank eine nachhaltige Lösung für ein wachsendes Unternehmen sein?

krystah
quelle
Domänenmodelle sind sehr eng mit dem domänengetriebenen Design verknüpft. Der springende Punkt des domänengetriebenen Designs ist es, frei von dem datengetriebenen Design zu sein, bei dem Daten (dh die Datenbank) der Kern der Anwendung sind. Der Ansatz und die Domänenmodelle passen nicht wirklich zusammen. Wenn Sie nach den Regeln des domänengetriebenen Designs entwickeln, ist es Ihnen egal, woher die Daten stammen. Sie verwenden sie einfach und führen eine Logik für sie in Ihrer Geschäftsschicht durch.
Andy
Mir ist ein wenig unklar, was Sie unter "Behalten der Programmlogik in der Datenbank" verstehen. Können Sie das klarstellen?
Robert Harvey
Die Geschäftslogik im Code ist genau der richtige Weg. Die Datenbank sollte ein dummer Datenspeicher sein, sonst nichts.
Andy
@Andy Ich denke, das hängt davon ab. Vielleicht ist ihr DBA das Zentrum des Teams und er behält die gesamte Geschäftslogik in der Datenbank, die dann durch dumme gespeicherte Prozessaufrufe abgefragt wird, Daten in POCOs usw. extrahiert. Dies ist ein fragwürdiger Ansatz, aber ich kenne Teams, die den größten Teil der Geschäftslogik behalten wenn nicht alles in DB.
Vladislav Rastrusny
@VladislavRastrusny Was auch immer der Grund sein mag, die Geschäftslogik in der Datenbank zu belassen, ist ein extrem schlechtes Design.
Andy

Antworten:

16

Sie beschreiben eine innere Plattform.

Das Problem mit inneren Plattformen besteht darin, dass Sie alle Mechanismen einer Plattform oder Technologie (in diesem Fall eine relationale Datenbank) neu erfinden, die über Jahrzehnte von Evolution und Anstrengung hinweg verfeinert und perfektioniert wurden, aber nur unzureichend neu erfinden. Sie umgehen alle Optimierungen, die für diejenigen verfügbar sind, die sich für ein konventionelleres Design entscheiden, und tauschen anfängliche Einfachheit und Eleganz gegen zukünftige Komplexität und Härte aus.

Das heißt, wenn das Endprodukt dieses Prozesses echte Tabellen und echte Klassen sind, die echte Geschäftsdomänenobjekte modellieren , sehe ich abgesehen von der Unreife der Tools keinen großen Schaden in diesem Ansatz. Stack Exchange verwendet tatsächlich ihren eigenen, selbst entwickelten ORM, und das scheint für sie geklappt zu haben. Ich weiß also, dass solche "Häuschen" -Ansätze funktionieren können.

Beachten Sie, dass die meisten ORMs, die den "table-first" -Ansatz verwenden, einfach die Tabellenstruktur in der Datenbank betrachten, um die Klassen zu erstellen. Die Tabellen "table" und "row", die Ihr Freund erstellt hat, sind lediglich Metadaten, die bereits in den Systemtabellen der meisten modernen relationalen Datenbanksysteme vorhanden sind.

Weiterführende Literatur
Das "Vision" -Projekt, eine warnende Geschichte über den Effekt der inneren Plattform
(Sie können die Präambel überspringen und unter der Überschrift "Introducing Vision" mit dem Lesen beginnen)

Robert Harvey
quelle
2
Interessant zu lesen, ich könnte definitiv Anologien zeichnen. Ich bin noch neu und werde vorerst Zuschauer bleiben, aber ich werde es definitiv unter der Linse behalten. Vielen Dank für eine gute Antwort!
krystah