Persistente abgeleitete Attribute


Ein kleines Beispiel für das abgeleitete Attribute, die in der Datenbank gespeichert sind.
Persistente abgeleitete Attribute in Fettschrift
Fett abgeleitete Attribute werden immer im Arbeitsspeicher ausgewertet, dies macht es unmöglich, Durchführen einer Suche InPS (persistenten Speicher) gegen bestimmte Daten. Jeder Suche Ausdruck bezieht sich auf einen abgeleiteten Attribut bewirkt, dass Fett alle Objekte aus der Datenbank in den Speicher zuerst für eine Auswertung im Arbeitsspeicher geladen, dies kann sehr langsam sein und Ressourcen verbraucht.
Auf die Fragen, wie man abgeleitete Attribute zu erreichen, die auch die DB für SQL-Bewertung beibehalten werden Selbsthilfegruppen wurden vergangene Diskussionen veröffentlicht. Heute hatte ich die gleiche Anforderung, und das ist die Lösung, die, der ich kam mit.
Das erste, was zu tun ist, um zu vermeiden, markieren das Attribut, wie im Modell abgeleitet. Stattdessen machen Sie dem Attribut eine permanente Attribut zB
FullName: Zeichenfolge (128)
Der nächste Schritt besteht darin sicherzustellen, dass der Wert der FullName ist immer auf dem neuesten Stand, so müssen wir ReceiveEventFromOwned in jeder abgeleiteten Klasse überschreiben, erstellen wir.


Verfahren TPerson.ReceiveEventFromOwned ((Urheber: TObject; OriginalEvent: TBoldEvent);
beginnen
geerbt;
if (OriginalEvent = BeCompleteModify) und (Urheber = M_Name) dann
FullName: = M_FirstName.AsString + '' + M_LastName.AsString;
Ende;


Dadurch wird sichergestellt, dass das Attribut immer up to date ist, aber die Schwäche, die wir jetzt beschäftigen wird, ist, dass man FullName manuell ändern kann. Um dieses Problem zu lösen, wir FullName schreibgeschützt machen müssen, etwa so


Funktion TPerson.ReceiveQueryFromOwned (Begründer: TObject; OriginalEvent: TBoldEvent; const Args: Array von Const; Abonnenten: TBoldSubscriber): Boolean;
beginnen
Ergebnis: = geerbt ReceiveQueryFromOwned (Urheber, OriginalEvent, Args, Abonnenten);
Wenn nicht Führen oder BoldObjectIsDeleted dann Ausfahrt;
if (Urheber = M_FullName) und (OriginalEvent = BqMayModify) dann
beginnen
Ergebnis: = False;
Unerwarteter Fehler
SetBoldLastFailureReason (TBoldFailureReason.Create ('FullName ist unveränderlich', Self));
end;
end;


FullName kann nun nicht mehr geändert werden, leider ist der Fehlers, die wir eingeführt haben, dass wir nicht mehr den Wert der FullName in unserem Ableitung-Code festlegen können.
Um dieses Problem endgültig zu lösen brauchen wir eine Möglichkeit Benutzercode/Normal-Änderungen und 'intern' zu identifizieren. Dazu implementieren ich immer ein gemeinsames Muster für meine Basisobjekt wie folgt
1) Erstellen einer Delphi-Attribut - InternalChangeCount: Integer
2) fügen Sie eine geschützte Methode BeginInternalChange
3) fügen Sie eine geschützte Methode EndInternalChange
4) fügen Sie eine geschützte Methode IsInternalChange: Boolean


Hinweis: TRootObject ist das Stammobjekt meines Modells
Verfahren TRootObject.BeginInternalChange;
beginnen

Inc(fInternalChangeCount);
end;
Verfahren TRootObject.EndInternalChange;
beginnen
Wenn fInternalChangeCount = 0 dann
erhöhen Exception.Create ('EndInternalChange ohne BeginInternalChange');
Dec(fInternalChangeCount);
end;
Funktion TRootObject.IsInternalChange: Boolean;
beginnen
Ergebnis: = (InternalChangeCount > 0);
end;


Schließlich müssen wir nur den ursprünglichen Quellcode aktualisieren so dass
1) einstellen des abgeleiteten Codes erfolgt innerhalb einer 'innere Wandel'
2) FullName Änderungen sind zulässig, wenn die Änderung eine interne ist.


Verfahren TPerson.ReceiveEventFromOwned (Begründer: TObject; OriginalEvent: TBoldEvent);
beginnen
geerbt;
if OriginalEvent = BeCompleteModify dann
beginnen
if (Urheber = M_FirstName) or (Urheber = M_LastName) dann
versuchen Sie
BeginInternalChange;
FullName: = M_FirstName.AsString + '' + M_LastName.AsString;
schließlich
EndInternalChange;
end;
end;
end;
Funktion TPerson.ReceiveQueryFromOwned (Begründer: TObject; OriginalEvent: TBoldEvent; const Args: Array von Const; Abonnenten: TBoldSubscriber): Boolean;
beginnen
Ergebnis: = geerbt ReceiveQueryFromOwned (Urheber, OriginalEvent, Args, Abonnenten);
Wenn nicht Führen oder BoldObjectIsDeleted dann Ausfahrt;
if (Urheber = M_FullName) und (OriginalEvent = BqMayModify) dann
beginnen
if IsInternalChange dann
Ergebnis: = True
sonst
Ergebnis: = False;
Unerwarteter Fehler
Wenn nicht Ergebnis dann
SetBoldLastFailureReason (TBoldFailureReason.Create ('FullName ist unveränderlich', Self));
end;
end;


In der Anwendung erstellte bin ist die Objektstruktur tatsächlich wie folgt:
RootObject (ModelRoot)
RoledObject (hat ein FullName)
Person (FullName = Vorname + '' + Nachname)
Abteilung (FullName = Name)
Unternehmen (FullName = Name)
Fazit:
Diese Technik erfordert nur ein kleines Stück des Codes für jeden Nachfolgerklasse (RecevieEventFromOwned), gleichzeitig die Fähigkeit zur Durchführung von Recherchen auf dem DB-Server gegen einen abgeleiteten Attribut. Ich glaube, dass die Vorteile deutlich die kleine Menge von Arbeit erforderlich überwiegen, um diese Ziele zu erreichen.









Persistente abgeleitete Attribute


Persistente abgeleitete Attribute : Mehreren tausend Tipps, um Ihr Leben einfacher machen.


Ein kleines Beispiel für das abgeleitete Attribute, die in der Datenbank gespeichert sind.
Persistente abgeleitete Attribute in Fettschrift
Fett abgeleitete Attribute werden immer im Arbeitsspeicher ausgewertet, dies macht es unmöglich, Durchführen einer Suche InPS (persistenten Speicher) gegen bestimmte Daten. Jeder Suche Ausdruck bezieht sich auf einen abgeleiteten Attribut bewirkt, dass Fett alle Objekte aus der Datenbank in den Speicher zuerst für eine Auswertung im Arbeitsspeicher geladen, dies kann sehr langsam sein und Ressourcen verbraucht.
Auf die Fragen, wie man abgeleitete Attribute zu erreichen, die auch die DB für SQL-Bewertung beibehalten werden Selbsthilfegruppen wurden vergangene Diskussionen veröffentlicht. Heute hatte ich die gleiche Anforderung, und das ist die Lösung, die, der ich kam mit.
Das erste, was zu tun ist, um zu vermeiden, markieren das Attribut, wie im Modell abgeleitet. Stattdessen machen Sie dem Attribut eine permanente Attribut zB
FullName: Zeichenfolge (128)
Der nächste Schritt besteht darin sicherzustellen, dass der Wert der FullName ist immer auf dem neuesten Stand, so müssen wir ReceiveEventFromOwned in jeder abgeleiteten Klasse überschreiben, erstellen wir.


Verfahren TPerson.ReceiveEventFromOwned ((Urheber: TObject; OriginalEvent: TBoldEvent);
beginnen
geerbt;
if (OriginalEvent = BeCompleteModify) und (Urheber = M_Name) dann
FullName: = M_FirstName.AsString + '' + M_LastName.AsString;
Ende;


Dadurch wird sichergestellt, dass das Attribut immer up to date ist, aber die Schwäche, die wir jetzt beschäftigen wird, ist, dass man FullName manuell ändern kann. Um dieses Problem zu lösen, wir FullName schreibgeschützt machen müssen, etwa so


Funktion TPerson.ReceiveQueryFromOwned (Begründer: TObject; OriginalEvent: TBoldEvent; const Args: Array von Const; Abonnenten: TBoldSubscriber): Boolean;
beginnen
Ergebnis: = geerbt ReceiveQueryFromOwned (Urheber, OriginalEvent, Args, Abonnenten);
Wenn nicht Führen oder BoldObjectIsDeleted dann Ausfahrt;
if (Urheber = M_FullName) und (OriginalEvent = BqMayModify) dann
beginnen
Ergebnis: = False;
Unerwarteter Fehler
SetBoldLastFailureReason (TBoldFailureReason.Create ('FullName ist unveränderlich', Self));
end;
end;


FullName kann nun nicht mehr geändert werden, leider ist der Fehlers, die wir eingeführt haben, dass wir nicht mehr den Wert der FullName in unserem Ableitung-Code festlegen können.
Um dieses Problem endgültig zu lösen brauchen wir eine Möglichkeit Benutzercode/Normal-Änderungen und 'intern' zu identifizieren. Dazu implementieren ich immer ein gemeinsames Muster für meine Basisobjekt wie folgt
1) Erstellen einer Delphi-Attribut - InternalChangeCount: Integer
2) fügen Sie eine geschützte Methode BeginInternalChange
3) fügen Sie eine geschützte Methode EndInternalChange
4) fügen Sie eine geschützte Methode IsInternalChange: Boolean


Hinweis: TRootObject ist das Stammobjekt meines Modells
Verfahren TRootObject.BeginInternalChange;
beginnen

Inc(fInternalChangeCount);
end;
Verfahren TRootObject.EndInternalChange;
beginnen
Wenn fInternalChangeCount = 0 dann
erhöhen Exception.Create ('EndInternalChange ohne BeginInternalChange');
Dec(fInternalChangeCount);
end;
Funktion TRootObject.IsInternalChange: Boolean;
beginnen
Ergebnis: = (InternalChangeCount > 0);
end;


Schließlich müssen wir nur den ursprünglichen Quellcode aktualisieren so dass
1) einstellen des abgeleiteten Codes erfolgt innerhalb einer 'innere Wandel'
2) FullName Änderungen sind zulässig, wenn die Änderung eine interne ist.


Verfahren TPerson.ReceiveEventFromOwned (Begründer: TObject; OriginalEvent: TBoldEvent);
beginnen
geerbt;
if OriginalEvent = BeCompleteModify dann
beginnen
if (Urheber = M_FirstName) or (Urheber = M_LastName) dann
versuchen Sie
BeginInternalChange;
FullName: = M_FirstName.AsString + '' + M_LastName.AsString;
schließlich
EndInternalChange;
end;
end;
end;
Funktion TPerson.ReceiveQueryFromOwned (Begründer: TObject; OriginalEvent: TBoldEvent; const Args: Array von Const; Abonnenten: TBoldSubscriber): Boolean;
beginnen
Ergebnis: = geerbt ReceiveQueryFromOwned (Urheber, OriginalEvent, Args, Abonnenten);
Wenn nicht Führen oder BoldObjectIsDeleted dann Ausfahrt;
if (Urheber = M_FullName) und (OriginalEvent = BqMayModify) dann
beginnen
if IsInternalChange dann
Ergebnis: = True
sonst
Ergebnis: = False;
Unerwarteter Fehler
Wenn nicht Ergebnis dann
SetBoldLastFailureReason (TBoldFailureReason.Create ('FullName ist unveränderlich', Self));
end;
end;


In der Anwendung erstellte bin ist die Objektstruktur tatsächlich wie folgt:
RootObject (ModelRoot)
RoledObject (hat ein FullName)
Person (FullName = Vorname + '' + Nachname)
Abteilung (FullName = Name)
Unternehmen (FullName = Name)
Fazit:
Diese Technik erfordert nur ein kleines Stück des Codes für jeden Nachfolgerklasse (RecevieEventFromOwned), gleichzeitig die Fähigkeit zur Durchführung von Recherchen auf dem DB-Server gegen einen abgeleiteten Attribut. Ich glaube, dass die Vorteile deutlich die kleine Menge von Arbeit erforderlich überwiegen, um diese Ziele zu erreichen.


Persistente abgeleitete Attribute

Persistente abgeleitete Attribute : Mehreren tausend Tipps, um Ihr Leben einfacher machen.
Persistente abgeleitete Attribute
Wiezutun
Freunden empfehlen
  • gplus
  • pinterest

Kommentar

Einen Kommentar hinterlassen

Wertung