Best Practices: Programmiermuster für Datenbank-Apps

11

Ich habe bisher viele Datenbank-Web-Apps (MySQL) geschrieben, aber ich denke immer, dass meine Struktur etwas ungeschickt ist. Ich möchte das von mir verwendete Programmier- / Entwurfsmuster verbessern und hoffe auf einige Ratschläge hier. Insbesondere kann ich keine Struktur finden, die einen OOP-Ansatz ergänzt, der die Implementierung der Datenbank (Schema) kapselt. ich

Ich denke, meine Frage lässt sich am besten anhand eines Beispiels erklären. Es gibt zwei Ansätze, die ich jetzt verwende: Ich habe ein Rechnungsobjekt / eine Rechnungsklasse:

Zunächst müssen statische Elementfunktionen verwendet werden

class Invoice
{
   int id;
   string ref;
   int customer_id;
   date created;
   date due;

   static id create();
   static bool update(id, field1, field2, ...);
   static bool delete(id);
   static bool get(id);
};

Der zweite Ansatz besteht darin, alles in ein Datenbankobjekt einzufügen:

class Database extends ProprietaryDBConnecter, Singleton
{
   id createInvoice();
   bool updateInvoice(id, field1, field2, ...);
   bool deleteInvoice(id);
   bool getInvoice(id);

   id createCustomer();
   bool updateCustomer(id, field1, field2, ...);
   bool deleteCustomer(id);
   bool getCustomer(id);

   // etc...
}

Ich finde, dass die (SQL) -Mitgliedsfunktionen in beiden Richtungen sehr untrennbar mit der "Ansicht" verbunden sind, da die "Ansicht" bestimmt, was die Klassen haben müssen, und daher die Dokument- / Ansichtsarchitektur zu brechen scheint.

Es scheint auch ineffizient zu sein, zum Beispiel sollte eine SELECT-Anweisung nur auswählen, was benötigt wird, aber das Vorhandensein von Mitgliedsvariablen in der Rechnung scheint "garantierte Daten" zu implizieren.

Ich weiß nicht, ob ich die Frage klar erklärt habe: Was sind einige andere beste Ansätze für dieses Architektur- / Entwurfsmuster / was-es-bekannt-ist?

Danke für Ratschläge

Jake
quelle

Antworten:

14

Nun, ich nehme an, Sie könnten ein ORM verwenden.

Tatsächlich sollte das Datenbankdesign NICHT den OOP-Prinzipien folgen, sondern den Prinzipien des Datenbankdesigns wie der Normalisierung. Und es sollte in der Datenbank entworfen werden, nicht in der Anwendung. Die Datenintegritätsregeln sollten auf Datenbankebene und nicht von der Anwendung durchgesetzt werden.

Ich würde vorschlagen, dass Sie einige Bücher zum Datenbankdesign lesen und dann über die Leistungsoptimierung der Datenbank Ihrer Wahl lesen.

HLGEM
quelle
5
+1 für nicht alles muss OOP sein (auch wenn einige ORMs ganz nett sind!)
Javier
1
O / RMs sind nett, aber ihre Verwendung bedeutet nicht, dass Sie sich nicht an ein gutes Datenbankdesign anpassen können.
BlackICE
1
@ David, ich stimme zu, dass dies in den Händen von jemandem wahr ist, der weiß, was er tut. Und ich habe vorgeschlagen, dass er sich ein ORM ansieht, aber wenn Sie das Datenbankdesign nicht zuerst kennen, ist ein ORM ein gefährliches Werkzeug.
HLGEM
Dies ist ein guter Punkt, um Datenintegritätsregeln auf Datenbankebene durchzusetzen. Manchmal ist es jedoch sinnvoll, einige Regeln (z. B. "Projekt muss immer mehr als 5 Teammitglieder enthalten") in die Anwendung aufzunehmen, wenn sich die Regeln ändern können und nur die Anwendung Daten ändert.
Jon Onstott
Die Anwendung ist fast nie das einzige, was Daten ändert. Geschäftsregeln, die nicht in die Datenbank aufgenommen wurden, können sehr leicht verletzt werden, wenn jemand schnell Änderungen an einem großen Datenblock vornehmen muss, um einige Datenkorrekturen zu unterstützen.
HLGEM
10

Ich kann keine Struktur finden, die einen OOP-Ansatz ergänzt, der die Implementierung der Datenbank kapselt

Scheint, als würden Sie die objektrelationale Impedanzfehlanpassung beschreiben .

Es gibt eine Reihe von Dingen, die dieses OODBMS lösen sollen, ORM-Tools, eine Vielzahl von Datenzugriffstools.

Ich denke, die Tatsache, dass es so viele Lösungen gibt, lässt mich glauben, dass One True Solution ™ nicht existiert.

So können Sie jede Richtung wählen, die Sie mögen, sicher in dem Wissen, dass einige Leute es hassen und andere es lieben werden.

Conrad Frix
quelle
Sieht so aus, als wäre es strenger.
Jake
2

Wenn Sie keinen ORM-Wrapper verwenden möchten, verwenden Sie eine Datenbank, die Speicher im OOP-Stil wie MongoDB unterstützt .

MongoDB (von „hu Mongo wir“) ist ein plattformübergreifende dokumentenorientierte Datenbank - System. MongoDB wird als " NoSQL " -Datenbank klassifiziert und verzichtet auf die traditionelle tabellenbasierte relationale Datenbankstruktur zugunsten von JSON- ähnlichen Dokumenten mit dynamischen Schemata (MongoDB nennt das Format BSON ), wodurch die Integration von Daten in bestimmte Arten von Anwendungen einfacher und schneller wird. ..

Josh K.
quelle