2017-12-05 4 views
0

Betrachten wir die klassische Order-Bestellposten Beispiel:Ist es eine schlechte Übung, während einer "Update-Transaktion" eine Auswahl zu treffen, um Zeilen zu identifizieren, die aktualisiert werden müssen?

Wir haben unsere relationales Datenbankschema ...

CREATE TABLE order (
    id   integer PRIMARY KEY, 
    added  date NOT NULL 
); 

CREATE TABLE orderlines (
    id   integer  PRIMARY KEY, 
    order_id integer  NOT NULL REFERENCES order, 
    item_name varchar  NOT NULL 
); 

Und unsere entsprechenden Klassenstruktur ...

class Order { 
    int id; 
    Date added; 
    vector<OrderLine> orderlines; 
} 

class OrderLine { 
    int id; 
    string item_name; 
} 

Es gibt vier objekt- relationale Operationen, die wir durchführen können:

  • Persisting ein neues Order-Objekt in der Datenbank.
  • Löschen eines Bestellobjekts aus der Datenbank.
  • Laden eines Bestellobjekts aus der Datenbank.
  • Bestehende Änderungen an einem bereits vorhandenen Order-Objekt.

Ich halte die ersten drei für trivial. Meine Frage bezieht sich auf die vierte Operation: das Speichern von Objekten wird zurück in die Datenbank geändert.

Nehmen wir an, wir haben unser Order-Objekt aus der Datenbank geladen. Anfangs gibt es fünf Auftragszeilen. Jetzt entfernt der Benutzer unserer Anwendung eine Bestellzeile und fügt drei neue Bestellzeilen hinzu.

Um die Änderungen in der Datenbank zu speichern, müssen wir wissen, was geändert wurde. Der einfachste Weg, dies zu tun, besteht darin, die Datenbank nach ihrem aktuellen Zustand zu fragen (vorausgesetzt, Parallelitätsprobleme werden behandelt). Meine Frage ist einfach: Ist es eine schlechte Übung, eine Auswahl in der Bestellzeilen-Tabelle durchzuführen, um den aktuellen Status des Bestellobjekts und den aktuellen Status der Datenbank zu vergleichen?

Oder allgemeiner gesagt, ist es eine schlechte Praxis, die Datenbank während einer Update-Transaktion abzufragen, um festzustellen, was aktualisiert werden muss?

Antwort

0

Der ganze Sinn der Verwendung von Transaktionen besteht darin, dass Sie mehrere Abfragen an die Datenbank ausführen können und entweder alles übernehmen oder alles atomar verwerfen können. Andernfalls würden Sie keine Transaktion benötigen, wenn es immer nur eine Abfrage war - Sie können die Datenbank direkt mit einem einzigen Kontext abfragen und dann den Kontext schließen.

Also nein, es ist keine schlechte Praxis. Wenn es notwendig ist, sind die Werkzeuge für Sie da (ADO .NET, Entity Framework oder Ihre eigenen benutzerdefinierten ORM, etc.)

+0

Vielen Dank. Der spezifische Kontext meiner Frage bezieht sich auf den Aufbau meines eigenen ORM- "Frameworks". Meine Anwendung ist eine Geschäftsanwendung, bei der die Bestell- und Bestellpositionen durch Hauptbuch und Transaktionen ersetzt werden können ... rund 1 Million Bücher mit jeweils etwa 50000 Transaktionen. Ich kann mir vorstellen, dass dies ein Leistungsproblem sein könnte, wenn ich die von mir beschriebene Methode verwende. – andrewib

Verwandte Themen