Effektives Management von Datenänderungen
Ich habe einen Tisch namens Buchungen. Diese Tabelle enthält Daten, die eine Buchung für einen bestimmten Dienst mit vielen Variablen darstellen.
Vor einiger Zeit bin ich auf ein Problem mit meiner aktuellen Datenstruktur gestoßen, bei dem Änderungen an der Buchung, die sich auf Zeiten, Daten oder Preise auswirkten, sich auf andere zugehörige Finanzaufzeichnungen, Buchungslisten für Daten usw. auswirkten.
Meine damalige Lösung bestand darin, eine Modifikationstabelle zu erstellen, in der alle an einer Buchung vorgenommenen Änderungen aufgezeichnet werden. Wann immer das Buchungsmodell gebeten wurde, eine Buchung zurückzugeben, fügte es die vorgenommenen Änderungen hinzu (in der Liste)afterFind()
Cake Callback) und präsentiere die aktuellste Version der Buchung, etwa so (entschuldige die Paint-Zeichnung):
Diese Methode funktioniert einwandfrei, wenn Sie das Buchungsmodell auffordern, die Buchung Nr. 1234 zurückzugeben. Es gibt die aktuellste Darstellung der Buchung einschließlich aller Änderungen (übereinander gelegt) zurück, einschließlich eines Arrays, das alle Änderungen enthältund die ursprünglichen Buchungsdaten als Referenz.
Mein Problem Ich habe kürzlich festgestellt, dass ich in der Lage sein muss, dieses Modell mit benutzerdefinierten Bedingungen abzufragen. Wenn eine dieser Bedingungen in einer der Änderungen realisiert wurde, stimmt das Ergebnis nicht überein, da das Modell eher den ursprünglichen Datensatz durchsucht als die schließlich vorgelegten Rekord. Beispiel, in dem ich das Modell abfrage, um Zeilen zurückzugeben, in denenabc
ist blau (nicht grau):
In diesem Beispiel betrachtet das Modell die ursprünglichen Daten für Zeilen, in denenabc
ist blau und gibt dieses Ergebnis nicht zurück, da der blaue Wert in einer Modifikation enthalten ist, die angehängt istnach Die ursprünglichen Ergebnisse wurden gefunden.
Was ich jetzt gemacht habe ist eine Abfrage in diebeforeFind()
Rückruf des Buchungsmodells, um nach Änderungen zu suchen, die den angegebenen Kriterien entsprechen, und der Buchung beizutreten, um sicherzustellen, dass alle anderen Kriterien noch übereinstimmen. Wenn es das Blau im obigen Beispiel zurückgibt, speichert es das Ergebnis in einem Array als Klasseneigenschaft und fährt mit dem regulären fortfind()
, aberschließt aus Die ID dieser Buchung wurde nicht zurückgesandt (da wir eine aktuellere Version gefunden haben). Dann werden sie zusammengeführt, neu sortiert usw. in derafterFind()
.
Das funktioniert, obwohl es etwas langatmiger ist, auf das ich gehofft hatte.
Nach all dem habe ich festgestellt, dass es in anderen Teilen dieser Anwendung Modelle gibt, die manuell zur Buchungstabelle hinzugefügt werden und nach Buchungen suchen. Jetzt brauche ich also eine Möglichkeit, die Änderungen in all diese manuellen Verknüpfungen direkt in die Tabelle in MySQL zu integrieren, ohne die Originaldaten zu beeinträchtigen, und am besten, ohne zu viel von meinem Code zu ändern.
Meine Gedanken waren, dass ich die manuelle Verknüpfung entfernen und stattdessen eine Modellzuordnung erstellen muss. Wird diebeforeFind()
undafterFind()
des Buchungsmodells immer noch ausgeführt, wenn ich nach dem Kundenmodell frage, das viele Buchungen hat (um die Änderungen auf jede Buchung anzuwenden)?
Meine andere Option bestand darin, mehr Zeilen aus MySQL als nötig zurückzugeben, indem alle Kriterien entfernt wurden, die in den Änderungen enthalten sein könnten, und anschließend die Ergebnisse mit PHP gemäß meinen Suchkriterien zu filtern. Diese Option hat mich ein wenig erschreckt, weil die Ergebnismenge das Potenzial hat, ohne diese Kriterien massiv zu sein ...
Wie kann ich diese Datenstruktur erreichen? Meine wichtigsten Anforderungen sind weiterhin, dass ich nicht den ursprünglichen Buchungsdatensatz ändern, sondern Änderungsdatensätze hinzufügen möchte, aber in der Lage sein muss, Buchungen (einschließlich Änderungen) über das Modell abzufragen.
Ich möchte versuchen, so viel wie möglich von dieser Integration hinter den Kulissen zu behalten, damit ich nicht meine gesamte Anwendung durchgehen muss, um Änderungen vorzunehmenn
Anzahl der Anfragen, die so aussehen:
$get_blue = $this->Booking->find('all', array(
'conditions' => array(
'Booking.abc' => 'blue'
)
));
Ich möchte alle Änderungen, die an Buchungen vorgenommen wurden, implizit einbeziehen können, damit die aktuelle Buchung in der obigen Abfrage zurückgegeben wird.
Das andere Problem ist, wenn das Buchungsmodell manuell mit einer Suchabfrage verknüpft wird:
$get_transactions_on_blue_bookings = $this->Transaction->find('all', array(
'joins' => array(
array(
'table' => 'sql_bookings_table', // non-standard Cake format, I know - it's an example
'alias' => 'Booking',
'type' => 'LEFT',
'conditions' => 'Booking.booking_id = Transaction.booking_id'
)
),
'conditions' => array(
'Booking.abc' => 'blue'
)
));
Wie Sie sehen, enthält die obige Abfrage die Änderung in meinem obigen MSPaint-Beispiel nicht, da die Tabelle in SQL manuell verknüpft wird (die Änderungsintegration befindet sich in derbefore
undafterFind()
Rückruffunktionen des Buchungsmodells).
Jede Hilfe hierzu wäre sehr dankbar.
BearbeitenIch weiß, dass dies schon lange genug ist, aber ich dachte, ich würde hinzufügen, dass der Grund, warum ich diese Änderungen verfolgen und den Originaldatensatz nicht aktualisieren möchte, der istfinanziell Der Aspekt kann nicht geändert werden, da dies Auswirkungen auf die Berichterstellung hat.
Die schnellste und einfachste Lösung, die ich bisher gesehen habe, besteht darin, Änderungen direkt auf die ursprüngliche Buchung anzuwenden, es sei denn, es handelt sich um Finanzinformationen, die immer noch als Änderung erfasst werden (da ich derzeit keine Suche basierend auf diesen Informationen durchführen muss) ).