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

lousek
 2011-02-25 00:45
#146017 #146017
User since
2011-01-19
28 Artikel
BenutzerIn

user image
Hallo zusammen

Zuerst vielen Dank für die Antworten :-)

Naja, der primäre Zweck der Datenbank ist wirklich um der vorherige Stand des Dateisystems (resp. der Stand in der DB) und der jetztige Stand vergleichen zu können also was wurde erstellt und was wurde gelöscht ...

@payx:
An das mit dem "FIRSTDETECT"-Feld habe ich auch schon gedacht.
Ich denke, ich werde es mal mit dem Pfad-Modell inkl. "FIRSTDETECTED", "LASTVERIFIED", "LEVEL" und "ID" probieren. Wenn man mit einer maximalen Pfadlänge von 255 Bytes rechnet, gibt dies somit sicher gut und gerne 300 Bytes für jeden Datensatz. Gibt bei 1 Million Ordner 300MB ... ich denke, dies ist wirklich noch erträglich :-)

Aber dann bleibt ein weiters Problem:
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.
Jetzt könnte man entweder eine Abfrage machen (SELECT ... WHERE path = ...), und überprüfen, ob das Ergebnis >0 ist (vorhanden in der DB) und ansosten einfügen. Dies ist aber sehr ineffizient, da bei 1 Million Ordner die DB 1 Million mal gefragt wird, ob ein Eintrag in 1 Million Einträge vorkommt ... also 1 Billion Vergleiche.

Daher kamm die Idee mit dem Hash-Tree:
Man fragt die Datenbank ein einziges Mal ab (SELECT * FROM dir;)
Danach generiert man aus den Pfaden den Hash-Tree; ich hatte es für das "Parent-Modell" wie folgt gemacht:
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#!/usr/bin/perl -w

use strict;
use DBI;

## DB data
my $db = "xxx";
my $user = "xxx";
my $pass = "xxx";
my $host = "localhost";

# Connect to DB
my $dbh = DBI->connect("DBI:mysql:$db:$host", $user, $pass);

my %hash;

buildDBHash(0, \%hash);

# Build a hash like $hash{part}{of}{the}{hash} = 0 using the Database
# Syntax: buildDBHash(parentID, hashref)
# Return Value: Hash-Tree
sub buildDBHash {
# Set variables
my $parentID;
my $id;
my $folders;
my $hash;

# Load arguments into variables
if (defined($_[0])) {
$parentID = $_[0]; # Load parentID into variable
}
if (defined($_[1])) {
$hash = $_[1]; # Load parentID into variable
}


# Set query
my $query = "SELECT id,parentID,name FROM dir WHERE parentID=$parentID;";

# Run query
my $sth = $dbh->prepare($query);
$sth->execute();

# Use the query results ...
while (my @result = $sth->fetchrow_array) {
my $id = $result[0];
my $parentID = $result[1];
my $name = $result[2];

print $name."\n";

# Add this result to the Hash
$hash{$name} = $id;

# Create a reference to the hash
my $ref = \%hash;
# Go one step further
$ref = $ref->{$name};

# Call the buildDBHash-function for the child-entries
buildDBHash($id, $ref);



}


}


Danach kann man eben mit "if (defined($hash{teile}{des}{pfades})) ..." recht effizient überprüfen, ob ein Pfad in der Datenbank ist. Wäre dieser Weg nicht effizienter, wie wenn man tausende von SQL-Statements absetzt und verarbeiten muss?

Gruss & vielen Dank
Lousek

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