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 09:20
#146021 #146021
User since
2006-05-04
564 Artikel
BenutzerIn

user image
Hallo Lousek,
2011-02-24T23:45:40 lousek
Beim starten des Scripts muss ja überprüft werden, ob der Ordner xyz bereits in der Datenbank eingetragen ist, und wenn ja, soll "FIRSTDETECTED" auf "jetzt" geupdatet werden.

Ich dachte eher an das Feld LASTVERIFIED, das bei jeder Synchronisation aktualisiert werden soll.

Wenn Dein beschriebenes Verfahren auch bei größeren Datenmengen funktioniert, ist es gut. Sonst würde ich noch folgende Alternative sehen, die umgekehrt zu Deinem Verfahren funktioniert und den Abgleich der Datenbank überlässt:

Das Synchronisationsscript liest das gesamte Dateisystem aus und schreibt es in eine zweite Datenbanktabelle (T_LS_TMP) mit gleicher Struktur wie die eigentliche Tabelle (die vielleicht T_LS heißt), wobei FIRSTDETECTED und LASTVERIFIED beide auf (jetzt) gesetzt werden.

Nun folgen drei SQL-Statements:

Code: (dl )
1
2
3
4
5
6
7
8
UPDATE
T_LS
SET
LASTVERIFIED = sysdate
WHERE
FULLPATH in (SELECT FULLPATH FROM T_LS_TMP)
and
LASTVERIFIED = (SELECT max(LASTVERIFIED) FROM T_LS);


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
INSERT INTO
T_LS (FULLPATH, DIRNAME, LEVEL, FIRSTDETECTED, LASTVERIFIED)
SELECT
FULLPATH
, DIRNAME
, LEVEL
, FIRSTDETECTED
, LASTVERIFIED
FROM
T_LS_TMP
left outer join T_LS on
T_LS_TMP.FULLPATH=T_LS.FULLPATH
and
T_LS.LASTVERIFIED = (SELECT max(LASTVERIFIED) FROM T_LS)
WHERE
T_LS.FULLPATH IS NULL;


Und wenn das alles geklappt hat

Code: (dl )
DELETE FROM T_LS_TMP;

Das SQL ist ungetestet und nur beispielhaft gemeint, Du wirst es noch an Dein RDBMS anpassen müssen. Auch die Vergabe der ID, so sie verwendet werden soll, habe ich erstmal ausgeblendet.

Bei Deinem wie bei diesem Verfahren muss einmal der gesamte Datenbestand zwischen Anwendung und DB transferiert werden. Ob eine der beiden Richtungen wesentlich schneller ist als die andere, kann ich nicht voraussagen (andere aber vielleicht schon, sonst bleibt nur probieren). Darüber, ob man ganz im Allgemeinen derartige Aufgaben in der Anwendung oder in der Datenbank erledigen soll, kann man trefflich stundenlang streiten. Ich gehöre eher zu denen, die eine Datenbank schon gern mal schuften lassen.

HTH
Grüße
payx

Edit: An das erste SQL angefügt: and LASTVERIFIED = (SELECT max(LASTVERIFIED) FROM T_LS);. Sonst würden gelöschte und wieder neu angelegte Verzeichnisse doppelt erscheinen. (Besser wäre es übrigens, die Synchronisationsdatumswerte in einer eigenen Tabelle zu verwalten.)
Last edited: 2011-02-25 10:14:47 +0100 (CET)

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