Windows Azure Cloud Storage ermöglicht es Ihnen bereits ab 0,10€ pro GB/Monat die Vorteile der Cloud zu nutzen.
Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Advanced Developers Conference     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: Datenbanken ::  Änderungen mitverfolgen  
Gehen Sie zu Seite 1, 2  Weiter
  Zeige alle Beiträge auf einer Seite
Auf Beitrag antworten
Autor Nachricht
zwutz
Mitglied

Benutzerprofil
Anmeldungsdatum: 22.11.2007
Beiträge: 3320
Beitrag zwutz Mitglied 20:04:02 04.03.2010   Titel:   Änderungen mitverfolgen            Zitieren

Ich überleg gerade, wie man es am elegantesten löst, wenn man sämtliche Änderungen an einem Datensatz zeitlich zurückverfolgen können will und wollte euch fragen, ob ihr wisst, wie sowas in der Praxis gemacht wird?

Also ob differentiell oder inkrementell, ob alles in einer Tabelle (langsam, aber "sicherer") oder Endergebnis und Historie in getrennten Tabellen (schneller, dafür Gefahr der Dateninkonsistenz), oder auch völlig anders

Danke für eventuelle Denkanstöße :)

_________________
Raise your glass if you are wrong
noobLolo
Unregistrierter




Beitrag noobLolo Unregistrierter 20:47:21 04.03.2010   Titel:              Zitieren

meinst du sowas wie undo/redo :confused:
zwutz
Mitglied

Benutzerprofil
Anmeldungsdatum: 22.11.2007
Beiträge: 3320
Beitrag zwutz Mitglied 21:08:07 04.03.2010   Titel:              Zitieren

ich meine eher, einen Datensatz zu jedem beliebigen Zeitpunkt in der Vergangenheit zurückverfolgen zu können. Eine Historie eben

undo/redo könnte man darüber dann auch lösen, ist aber nicht der Grund, warum ich es machen will

_________________
Raise your glass if you are wrong
noobLolo
Unregistrierter




Beitrag noobLolo Unregistrierter 21:15:23 04.03.2010   Titel:              Zitieren

zwutz schrieb:
ich meine eher, einen Datensatz zu jedem beliebigen Zeitpunkt in der Vergangenheit zurückverfolgen zu können. Eine Historie eben

undo/redo könnte man darüber dann auch lösen, ist aber nicht der Grund, warum ich es machen will

hab mal sowas gemacht, dazu hab ich einfach in einer zweiten tabelle alle INSERT, UPDATE und DELETE statements mit den counterparts gespeichert also so in der richtung
Code:
redo   undo
INSERT DELETE
DELETE INSERT
UPDATE UPDATE
Code:
redo undo
INSERT DELETE
DELETE INSERT
UPDATE UPDATE
Code:
redo   undo
INSERT DELETE
DELETE INSERT
UPDATE UPDATE


das problem ist aber um einen bestimmten zustand herzustellen mußte man immer alle querys wieder ausführen.

bin mittlerweile der meinung, das die db soetwas schon mitbringt? das sollte dann schon das schnellste sein :rolleyes:
zwutz
Mitglied

Benutzerprofil
Anmeldungsdatum: 22.11.2007
Beiträge: 3320
Beitrag zwutz Mitglied 21:27:55 04.03.2010   Titel:              Zitieren

ich hatte an sowas gedacht:

inkrementell, alles in einer Tabelle:
Code:
id     aennr      wert1       wert2       wert3     zeit
--------------------------------------------------------
0      0          eins        zwei        drei      0
0      1          vier        NULL        NULL      1
0      2          NULL        fünf        NULL      2
0      3          NULL        NULL        sechs     3
Code:
id aennr wert1 wert2 wert3 zeit
--------------------------------------------------------
0 0 eins zwei drei 0
0 1 vier NULL NULL 1
0 2 NULL fünf NULL 2
0 3 NULL NULL sechs 3
Code:
id     aennr      wert1       wert2       wert3     zeit
--------------------------------------------------------
0      0          eins        zwei        drei      0
0      1          vier        NULL        NULL      1
0      2          NULL        fünf        NULL      2
0      3          NULL        NULL        sechs     3


differentiell, alles in einer Tabelle:
Code:
id     aennr      wert1       wert2       wert3     zeit
--------------------------------------------------------
0      0          eins        zwei        drei      0
0      1          vier        NULL        NULL      1
0      2          vier        fünf        NULL      2
0      3          vier        fünf        sechs     3
Code:
id aennr wert1 wert2 wert3 zeit
--------------------------------------------------------
0 0 eins zwei drei 0
0 1 vier NULL NULL 1
0 2 vier fünf NULL 2
0 3 vier fünf sechs 3
Code:
id     aennr      wert1       wert2       wert3     zeit
--------------------------------------------------------
0      0          eins        zwei        drei      0
0      1          vier        NULL        NULL      1
0      2          vier        fünf        NULL      2
0      3          vier        fünf        sechs     3


als Ergebnis jeweils zum Zeitpunkt 3:
Code:
id       wert1       wert2       wert3
--------------------------------------
0        vier        fünf        sechs
Code:
id wert1 wert2 wert3
--------------------------------------
0 vier fünf sechs
Code:
id       wert1       wert2       wert3
--------------------------------------
0        vier        fünf        sechs


jetzt besteht natürlich noch die Möglichkeit, das Ergebnis separat abzulegen, was vorteilhaft sein dürfte, wenn man oft den neuesten haben will

aber ok, ich denke, da gibts keine Patentlösung. Ich werd mal die Zwei-Tabellenlösung versuchen... mit Transaktionen sollte ich die Gefahr der Inkonsistenz eigentlich in den Griff bekommen

_________________
Raise your glass if you are wrong
Killer-Kobold
Mitglied

Benutzerprofil
Anmeldungsdatum: 16.03.2009
Beiträge: 180
Beitrag Killer-Kobold Mitglied 22:19:48 04.03.2010   Titel:              Zitieren

zwutz schrieb:
aber ok, ich denke, da gibts keine Patentlösung. Ich werd mal die Zwei-Tabellenlösung versuchen... mit Transaktionen sollte ich die Gefahr der Inkonsistenz eigentlich in den Griff bekommen


So macht es auch die SAP in ihrer BS1-Lösung. Es gibt die Originaltabelle mit dem aktuellen Datensatz und eine Historientabelle, in der der komplette alte Datensatz noch mal liegt, respektive eine einstellbare Anzahl dieser. Der einzige Unterschied im Tabellenaufbau ist eine mitlaufende ID (jeweils von 1 bis x für die alten Datensätze), so dass man die chronologische Reihenfolge sieht. Wenn der x+1 Historiensatz geschrieben werden soll, wird der älteste Datensatz gelöscht. Das wird dort aber wirklich nur zum Nachsehen angeboten, nicht zum Wiederherstellen.

Gruß KK
hustbaer
Mitglied

Benutzerprofil
Anmeldungsdatum: 27.10.2006
Beiträge: 12744
Beitrag hustbaer Mitglied 23:13:16 04.03.2010   Titel:              Zitieren

zwutz schrieb:

differentiell, alles in einer Tabelle:
Code:
id     aennr      wert1       wert2       wert3     zeit
--------------------------------------------------------
0      0          eins        zwei        drei      0
0      1          vier        NULL        NULL      1
0      2          vier        fünf        NULL      2
0      3          vier        fünf        sechs     3
Code:
id aennr wert1 wert2 wert3 zeit
--------------------------------------------------------
0 0 eins zwei drei 0
0 1 vier NULL NULL 1
0 2 vier fünf NULL 2
0 3 vier fünf sechs 3
Code:
id     aennr      wert1       wert2       wert3     zeit
--------------------------------------------------------
0      0          eins        zwei        drei      0
0      1          vier        NULL        NULL      1
0      2          vier        fünf        NULL      2
0      3          vier        fünf        sechs     3


wenn dann würde ich es genau so machen, nur würde ich es nicht "differenziell" nennen. ich verstehe glaube ich wie du auf den namen kommst, aber irgendwie finde ich ihn trotzdem nicht passend.
und auf jeden fall alles in einer tabelle.
wenn irgendwas zu langsam wird, kann man ja - je nach datenbank - einen filtered index oder eine indexed view verwenden, die dann nur die jeweils aktuellen datensätze enthält.

wird dadurch nicht wesentlich grösser als die version wo history und current getrennte tables haben, ist schnell abzufragen, und die konsistenz garantiert dir das DBMS.

p.S.: mir fällt gerade auf: ich bin mir gar nicht 100% sicher ob das mit MSSQL (dem einzigen DBMS was ich wirklich gut kenne) mit indexed views und/oder filtered indexes gehen würde...
müsste ich mal ausprobieren...

_________________
"Let there be Licht..." http://lichttools.sourceforge.net/
Sehr cooles ASCII Spiel (leider nicht von mir): ASCII-Scramble - http://www.roskakori.at/ascii/


Zuletzt bearbeitet von hustbaer am 23:14:42 04.03.2010, insgesamt 2-mal bearbeitet
zwutz
Mitglied

Benutzerprofil
Anmeldungsdatum: 22.11.2007
Beiträge: 3320
Beitrag zwutz Mitglied 07:28:14 05.03.2010   Titel:              Zitieren

hustbaer schrieb:
wenn dann würde ich es genau so machen, nur würde ich es nicht "differenziell" nennen. ich verstehe glaube ich wie du auf den namen kommst, aber irgendwie finde ich ihn trotzdem nicht passend.


keine Ahnung, wie man es nenn würde, also hab ich es so genannt, wie man es bei Backups nennen würde :)

Aber danke euch, auf eine View bin ich auch gekommen, so kann ich Geschwindigkeit und Konsistenz denk ich gut unter einem Hut bringen

_________________
Raise your glass if you are wrong
Marc++us
Administrator

Benutzerprofil
Anmeldungsdatum: 05.04.2000
Beiträge: 16966
Beitrag Marc++us Administrator 07:57:38 05.03.2010   Titel:              Zitieren

Wieso nennst Du es nicht "Versionierung"? Von jedem Datum wird doch eine neue Version angelegt. aennr entspricht der Version.

_________________
Viele Grüße
Marc++us
C++.de
witte
Mitglied

Benutzerprofil
Anmeldungsdatum: 08.01.2008
Beiträge: 1295
Beitrag witte Mitglied 12:58:17 05.03.2010   Titel:              Zitieren

Welches DBS verwendest du überhaupt?
Ich hatte mal so ein Projekt bei dem in psychatrischen Einrichtungen auftretende Ereignisse gemeldet werden mussten, die Administratoren sollten diese Meldungen aus Datenschutzgründen anpassen können und das Original sollte jedoch erhalten bleiben weil sich der Staatsanwalt dafür mgl. interessierte. Also ein Original mit n Kopien die in einem Selfjoin auf das Original verwiesen. Ich hatte damals mit einem ORM gelöst: die Klassen haben ICloneable implementiert, die letzte Kopie geladen und mit Clone() neue Objekte erzeugt die dann wieder in den Tabellen eingefügt wurden.
Wenn du die Versionshistorie per Hand bauen willst kannst du mal prüfen wie weit du das mit Trigger/Rules automatisieren kannst damit die Fehleranfälligkeit durch das Implementieren im Client wegfällt.
C/C++ Forum :: Datenbanken ::  Änderungen mitverfolgen  
Gehen Sie zu Seite 1, 2  Weiter
Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.