Vergleich Textdatei mit Datenbank

Andreas Mauf

Mitglied
Servus,
folgende Problemstellung:

Daten einer Textdatei sind mit den Daten aus einer Datenbank zu vergleichen. Es ist zu prüfen ob der Datensatz aus der Textdatei bereits in der Datenbank vorhanden ist und wenn ja welche Werte sich geändert haben. Je nachdem sollen weitere Vorgänge durchgeführt werden.

Ich sehe da spontan zwei Möglichkeiten:

a)
Einlesen aller relevanter Daten der entsprechenden Datenbanktabelle in ein Array. Durchlaufen der Textdatei Zeile für Zeile; jeweils prüfen ob ID bereits im Array und ggf. weitere Spalten prüfen.
Vorteil: Nur eine Datenbankanfrage für alle Vergleiche.
Nachteil: Anzahl der zu vergleichenden Datensätze begrenzt durch Größe des Arbeitsspeichers (für das Array mit den Daten aus der Datenbank).

b)
Durchlaufen der Textdatei Zeile für Zeile. Je Zeile mittels eigener Datenbankabfrage prüfen ob ein Datensatz mit gleicher ID bereits vorhanden.
Vorteil: Schonung des Arbeitsspeichers.
Nachteil: Viele Anfragen an den Datenbankserver in kurzer Zeit.

Was haltet ihr davon? Weitere Vorschläge oder Ergänzungen?
 
Ich halte beide Möglichkeiten nicht für gut.

Besser: Daten in eine temporäre Tabelle importieren und dann per SQL vergleichen, ob es doppelte Datensätze gibt. Das erfordert nur zwei Datenbank-Interaktionen - und auch eine Datei von mehreren MB wird von einem brauchbaren DB-System normalerweise rasch eingelesen.
 
hm... ich halt die Variante b) für die beste, da man dafür nicht extra wie bei Jürgens Methode oder Variante a) eine 3. Datenquelle braucht.
 
Vielleicht noch eine Ergänzung...
Die Datenbank soll mit den Daten aus der Textdatei sinnvoll ergänzt bzw. aktualisiert werden. Die Datensätze der Textdatei werden vorher teilweise noch modifiziert. Dann wird u.a. der Datensatz in die Datenbank hinzugefügt , der alte Datensatz gesichert und gegen den neuen ausgetauscht oder der vorhanden Datensatz bestätigt (Aktualisierung der Datumsspalte).

zu Jürgen)
Die Datei direkt mit der Datenbank einzulesen (z.B. in MySQL: LOAD DATA INFILE) und das modifizieren der Werte im Nachhinein scheint mir dafür nicht geeignet. Müsste man also ggf. INSERT INTO temp_table nehmen. Dann müsste ich aber erstmal alles in diese Tabelle einfügen um erst dann mit SQL vergleichen zu können.

Wenn ich 500.000 Datensätze durchgehe, dann komme ich mit 500MB RAM, dass ich dem Skript maximal erlaube, nicht hin. Nun kann ich doch aber auch nicht 500.000 SQL-Abfragen (plus ggf. Aktualisierungsabfragen) in einer Schleife durchgehen lassen...?!
 
Ich kenne die Details von mySql - Bulk - Operationen nicht, da ich mySql im Alltag nicht verwende.

Nur:

1. Man kann ja Tabellen erstellen und sie hinterher wieder löschen.
2. Wenn ich mich selbst zitiere ( google 'sql mengen' oder Zeilen als Zeilen-Mengen verarbeiten ): Sql ist eine mengenbasierte Sprache. Also ist es - unter dem Aspekt der 'Gesamtperformance' - immer besser, dem internen Optimierer die Arbeit zu überlassen. Und um Himmels willen nicht 500.000 Datensätze per Hand durchgehen - weder in einer gespeicherten Prozedur innerhalb des DB-Servers und schon dreimal nicht aus einer umgebenden Wirtssprache (Perl, PHP, VB) heraus.
 
Zurück
Oben