Thread Ordnerstruktur in DB abbilden - evt. eigene DB (File) schreiben? (34 answers)
Opened by lousek at 2011-02-24 00:10

payx
 2011-02-25 16:36
#146041 #146041
User since
2006-05-04
564 Artikel
BenutzerIn

user image
Hallo Lousek,
2011-02-25T10:49:00 lousek
Sehe ich dass richtig, dass du bei einer Synchronisation natürlich nur beim betreffenden Ordner das Feld "LASTVERIFIED" auf sysdate (also jetzt) setzt, nicht bei allen Ordnern?

Das erste Statement soll bei allen Datensätzen, die in beiden Tabellen vorhanden – also weder neu noch gelöscht – sind, LASTVERIFIED auf (jetzt) – d.h. den aktuellen Timestamp s.u. – setzen.

2011-02-25T10:49:00 lousek
Wenn ja:
Bei deinem ersten SQL-Statement hast du ja
Code: (dl )
LASTVERIFIED = (SELECT max(LASTVERIFIED) FROM T_LS);

darin. Wenn jetzt ein Ordner am 12.12.2012 um 12:12 synchronisiert wurde, dann wurde ja auch "LASTVERIFIED" auf 12.12.2012 um 12:12 gesetzt. Bei allen anderen Ordner ist "LASTVERIFIED" älter wie bei diesem.
Wenn ich jetzt das SQL-Statement
Code: (dl )
SELECT max(LASTVERIFIED) FROM T_LS;

absetzte, dann bekomme ich doch nur den höchsten Wert resp. das letzte Datum zurück, also eben den 12.12.2012 um 12:12.
Das würde ja heissen, dass er in deinem ersten SQL-Statement nur diejenigen Datensätze updaten würde, wo "LASTVERIFIED" = 12.12.2012 um 12:12 ist, und das wäre ja nur dieser eine Ordner ... oder sehe ich da etwas falsch?

Ein bisschen falsch siehst Du es, denke ich. Das UPDATE-Statement behandelt die Daten nicht seriell. Das heißt, es wird nicht der erste in der Liste upgedated, danach unter den neuen Bedingungen des ersten upgedateten der zweite usw., sondern alle Datensätze werden sozusagen gleichzeitig unter denselben Bedingungen verarbeitet.

2011-02-25T10:49:00 lousek
Könntest du mir das zweite SQL-Statement noch etwas genauer erläutern, ich habe da so meine Verständnis-Probleme :-)

OK, ich versuche es:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
INSERT INTO
T_LS (FULLPATH, DIRNAME, LEVEL, FIRSTDETECTED, LASTVERIFIED)
-- soweit klar: nach T_LS inserten, und zwar das, was das folgende SELECT zurückgibt
SELECT
-- Korrektur: Hier haben vorhin die Tabellennamen gefehlt. Das hätte nicht funktioniert,
-- weil die Spaltennamen in beiden Tabellen vorkommen und also nicht eindeutig sind.
T_LS_TMP.FULLPATH
, T_LS_TMP.DIRNAME
, T_LS_TMP.LEVEL
, T_LS_TMP.FIRSTDETECTED
, T_LS_TMP.LASTVERIFIED
FROM
T_LS_TMP
-- left outer join heißt: selecte von der linken Tabelle (also T_LS_TMP) alle Datensätze
-- und von der rechten alle, die nach den join-Kriterien (Bedingungen wie in einer WHERE-
-- Klausel) übereinstimmen. Das heißt, die linke Tabelle wirkt als Filter auf die rechte
-- aber nicht umgekehrt.
-- Ich bekomme also zunächst alle Datensätze aus T_LS_TMP und dazu Daten aus T_LS von den
-- den join-Kriterien entsprechenden Datensätzen (außer der Bedingung, die die Überein-
-- stimmung prüft habe ich noch eine Bedingung eingebaut, die auf Aktualität prüft, denn
-- wenn ein Verzeichnis in der Vergangenheit schon einmal existiert hat, dann aber gelöscht
-- und jetzt neu wieder angelegt wurde, soll es in T_LS doppelt erscheinen - mit einander
-- nicht überschneidenden Zeitintervallen).
left outer join T_LS on
T_LS_TMP.FULLPATH=T_LS.FULLPATH
and
T_LS.LASTVERIFIED = (SELECT max(LASTVERIFIED) FROM T_LS)
WHERE
-- Da ich aber nur die haben will, die in der Zieltabelle nicht schon enthalten sind, filtere
-- ich jetzt alle diejenigen Datensätze aus, die in der Zieltabelle enthalten sind.
T_LS.FULLPATH IS NULL;

2011-02-25T10:49:00 lousek
Ich versuche mal, die beiden "Möglichkeiten" zusammenzufassen und gegenüberzustellen:

[...]

So, soweit mal zu dem "Vergleich" ... habe ich etwas vergessen?

Kommt mir alles vernünftig vor.

2011-02-25T10:49:00 lousek
Ich denke, falls die Datenbank anstatt auf dem Replikationsserver auf einem leistungsfähigen Datenbankserver liegt, macht deine Variante mehr Sinn, sobald aber die Datenbank auf dem Replikationsserver selbst liegt, würde "mein" Weg mehr Sinn machen ... oder nicht?

Kann sein. – Oder vielleicht in beiden Fällen einfach das, was leo11 vorgeschlagen hat...

2011-02-25T10:49:00 lousek
Warum genau würdest du die Synchronisations-Datumswerte in eine seperate Tabelle auslagern?

Ich würde es so machen, dass immer der ganze Synchronisationsvorgang einen einzigen (z.B. von der Anwendung festgesetzten) Zeitstempel bekommt, der dann bei allen Datensätzen (sowohl bei FIRSTDETECTED als auch bei LASTVERIFIED) identisch gesetzt wird. Und diese Zeitstempel würde ich halt zusätzlich in einer separaten Tabelle loggen, dann kann ich LASTVERIFIED = (SELECT max(LASTVERIFIED) FROM T_SYNCDATES) abfragen (das neue Datum eben erst am Ende eintragen) und später in der Anwendung eine Liste der Snapshots zur Auswahl anbieten usw.

2011-02-25T10:49:00 lousek
Und "nebenbei" ... was wäre dann die best mögliche Lösung, um auch die Files überprüfen zu können? Tabelle mit Fremdschlüssel auf die Ordnertabelle?

Wenn die Files andere Attribute haben als die Verzeichnisse, dann wohl schon. Anderenfalls könnten sie einfach zusammen mit den Verzeichnissen und gleich wie sie (im wesentlichen über den FULLPATH usw.) behandelt werden, dann würdest Du einfach nur das Erscheinen, Vorhandensein und Verschwinden von Objekten im Filesystem dokumentieren - was ja vielleicht auch schon alles ist, was Du willst.

HTH
Grüße
payx

View full thread Ordnerstruktur in DB abbilden - evt. eigene DB (File) schreiben?