Frage

Viele Webanwendungen mit einer 3 -stufigen Architektur führen die gesamte Verarbeitung auf dem App -Server durch und verwenden die Datenbank für Persistenz, nur um eine Datenbankunabhängigkeit zu haben. Nachdem eine große Menge für eine Datenbank bezahlt hat, scheint die gesamte Verarbeitung einschließlich Stapel auf dem App -Server und die Nutzung der Leistung der Datenbank nicht ein Verschwendung zu sein. Ich habe Schwierigkeiten, Menschen davon zu überzeugen, dass wir das Beste aus beiden Welten verwenden müssen.

War es hilfreich?

Lösung

Es hängt von Ihrer Bewerbung ab. Sie sollten die Dinge einrichten, damit Ihre Datenbank die Dinge erstellt, für die Datenbanken gut sind. Eine achthöfliche Verbindung über zig Millionen von Datensätzen ist nicht etwas, das Sie in Ihrer Anwendungsebene bearbeiten möchten. Es wird auch nicht aggregierte Operationen auf Millionen von Zeilen durchgeführt, um kleine Informationen mit zusammenfassenden Informationen auszugeben.

Wenn Sie jedoch nur viel Crud machen, verlieren Sie nicht viel, indem Sie diese große teure Datenbank als dumme Repository behandeln. Aber einfache Datenmodelle, die sich für anwendungsorientierte "Verarbeitung" eignen, führen Sie manchmal auf den Weg zu unvorhergesehenen unvorhergesehenen Ineffizienzen. Designknoten. Sie verarbeiten Datensätze in der Anwendungsebene. Sehen Sie die Dinge so nach, dass sich SQL annähert. Schließlich refaktieren Sie diese Dinge schmerzlich auf die Datenbankstufe zurück, in der sie Größenordnungen effizienter ausführen ...

Es kommt also darauf an.

Andere Tipps

Welche "Kraft" der Datenbank verwenden Sie nicht in einer 3-tierenden Erziesektion? Vermutlich nutzen wir SQL in vollem Umfang und alle Datenverwaltungs-, Paging-, Caching-, Indizier-, Abfrageoptimierungs- und Verriegelungsfunktionen.

Ich würde vermuten, dass das Argument darin besteht, dass das, was wir als "Geschäftslogik" bezeichnen könnten, implementiert werden sollte. Im App -Server oder in der Datenbank gespeicherte Prozedur.

Ich sehe zwei Gründe, es auf den App -Server zu setzen:

1). Skalierbarkeit. Es ist vergleichsweise schwierig, mehr Datbase -Motoren hinzuzufügen, wenn die DB zu beschäftigt wird. Das Partitionieren von Daten über mehrere Datenbanken hinweg ist wirklich schwierig. Ziehen Sie also stattdessen die Geschäftslogik an die App Server -Stufe aus. Jetzt können wir viele App -Server -Instanzen haben, die alle Geschäftslogik machen.

2). Wartbarkeit. Im Prinzip kann der gespeicherte Verfahrenscode gut geschrieben, modularisiert und neulich sein. In der Praxis erscheint es viel einfacher, Wartungscode in einer OO -Sprache wie C# oder Java zu schreiben. Aus irgendeinem Grund scheint die Wiederverwendung in gespeicherten Verfahren durch Schnitt und Paste zu erfolgen, und so wird die Geschäftslogik im Laufe der Zeit schwer zu warten. Ich würde das mit Disziplin zugeben, dass dies nicht passieren muss, aber die Disziplin scheint momentan Mangelware zu sein.

Wir müssen sorgfältig achten, um die Datenbankabfragefunktionen in vollem Umfang auszunutzen, beispielsweise zu vermeiden, dass große Datenmengen an die App Server -Stufe übertragen werden.

Nein, sie sollten auch für die Durchsetzung der Geschäftsregeln verwendet werden.

Leider sind die DBMS Big Dogs entweder nicht kompetent genug oder nicht bereit, dies zu unterstützen, diese ideale unmöglich zu machen und ihre Kunden als Geisel an ihren großen Cash -Kühen zu halten.

Ich habe eine Anwendung gesehen (von einem ziemlich klugen Kerl) mit Tischen der Form:

id | one or two other indexed columns | big_chunk_of_serialised_data

Der Zugriff auf das in der Anwendung ist einfach: Es gibt Methoden, die eine (oder ein Satz) von Objekten laden und diese bei Bedarf des Ereignisses des Deserialisierungsmittels erhalten. Und es gibt Methoden, die ein Objekt in die Datenbank serialisieren.

Aber Wie erwartet (aber nur im Nachhinein) gibt es so viele Fälle, in denen wir die DB in gewisser Weise außerhalb dieser Anwendung abfragen möchten! Dies wird in verschiedenen Arten gearbeitet: eine Ad-hoc-Abfrageschnittstelle in der App (die zum Erhalten der Daten mehrere Indirektionschichten hinzufügt); Wiederverwendung einiger Teile des App -Code; handgeschriebener Deserialisierungscode (manchmal in anderen Sprachen); und einfach ohne Felder, die sich im Deserialisierten befinden.

Ich kann mir leicht vorstellen, dass das Gleiche für fast jede App passiert: Es ist gerade praktisch um auf Ihre Daten zugreifen zu können. Folglich denke ich, dass ich dem Speichern serialisierter Daten in einer realen DB ziemlich abgeneigt hätte-mit möglichen Ausnahmen, bei denen die Ersparnis die Zunahme der Komplexität überwiegt (ein Beispiel, das eine Reihe von 32-Bit-INTs speichert).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top