DB-Tabelle mit Excelfile in PHP vergleichen

Ich würde gerne mal ein paar Meinungen von euch hören:

Datenbanktabelle:
ID Key Wert1 Wert2 Wert3 … Datum

Excelfile (höchstens 100 Zeilen):
Key Wert1 Wert2 Wert3 … Datum

Problem:
Die Werte in dem Excelfile in der Spalte1 auf >0 überprüfen, bei TRUE ab in die Datenbank mit der entsprechenden Zeile.

Mein Lösungsweg:

  1. Key’s aus der Datenbank in ein Array speichern (while-Schleife).
  2. Die Zeilen aus dem Excelsheet in ein Array speichern. Aber nur, wenn Werte >0 sind. (for-Schleife)
  3. Anschließend mit array_intersect die Key’s auf Übereinstimmung überprüfen.
  4. Bei gefundener Übereinstimmung den alten Datenbankeintrag löschen und einen neuen vornehmen. (foreach-Schleife)
    Wenn keine Übereinstimmung gefunden wurde, einfach nur einen neuen Eintrag in die DB vornehmen.

Würdet ihr das auch so machen, oder denke ich wieder zu kompliziert?
Was sagt die Performance dazu? Sind ja immerhin drei Schleifen.

Servus,

Was sagt die Performance dazu? Sind ja immerhin drei
Schleifen.

die Performance darf dann zu Wort kommen, wenn Alternativen existieren. Ist hier nicht der Fall. Leg los.

Ich persönlich würde am Ende der letzten Schleife nach 10 Durchläufen eine usleep(1000); einbauen. aber das ist von der Hardware abhängig.

widecrypt

Hallo widecrypt

wenn Alternativen
existieren. Ist hier nicht der Fall.

Das sehe ich etwas anders. Wozu soll z.B. das erste Herausschreiben der Datenbankwerte in ein Array gut sein? Die DB kann doch direkt abgefragt werden und das Einfügen bzw. Update, von Steeno auch etwas umständlich mit

alten Datenbankeintrag löschen und einen neuen vornehmen

vorgeschlagen, kann doch ebenfalls in einem Rutsch erfolgen:

INSERT ... ON DUPLICATE KEY UPDATE

http://dev.mysql.com/doc/refman/5.1/de/insert-on-dup…
bzw., wenn es nicht auf 100%-igen SQL-Standard ankommt, mit

REPLACE

http://dev.mysql.com/doc/refman/5.1/de/replace.html
Das geht natürlich nur, wenn die Keys tatsächlich Primärschlüssel sind, was sich mir aus den Angaben leider nicht so ganz erschliesst.
Ob das nun tatsächlich schneller geht, müsste man sehen. Wäre aber einen Versuch wert.

Viele Grüße
Marvin

Hallo, erstmal danke für die Antworten.
Ja das lässt sich bisl kompliziert erklären.

Also:

INSERT ... ON DUPLICATE KEY UPDATE

wird glaube ich nicht gehen, weil das Feld ID aus der Datenbank den Primary Key besitzt, nicht Key.

Mit dem Feld Key aus der DB, bzw. aus dem Excelfile meine ich einfach nur eine Zahlenkombination zwischen 0 - 100. Mit ihm lässt sich die Verbindung zwischen DB und der Zeile aus dem Excelfile herstellen.

Und immer wenn in der Spalte Wert1 im Excelsheet der Wert >0 ist, soll dieser ja in die Datenbank übernommen werden. Jeder Key von 0 - 100 kann genau einmal pro Tag auftreten. Aber ich muss ja vorher wissen, ob es schon einen Eintrag mit dem Key am gleichen Tag existiert um den alten Eintrag dann zu überschreiben bzw. zu löschen, andernfalls nur einen neuen Eintrag vorzunehmen.

Und deshalb meine Array-Variante.
Gibt es sonst noch einfachere Varianten?

Servus,

@Marvin: Du bist bestimmt fit in der Materie aber ich bemerke immer wieder die fehlende Felderfahrung. Aber mach weiter und reife. Aber bedenke, dass alles was du heute in einem Buch liest, morgen schon alt ist. Gerade in der ITK.

Und deshalb meine Array-Variante.
Gibt es sonst noch einfachere Varianten?

Ja, bestimmt. Aber ohne jetzt eine Exkursion in Feinheiten von php Versionen und Hardwareexoten zu veranstalten, sag ich dir mit 25 Jahren Erfahrung: Du hast den qualitativ besten Weg gewählt. Brings zum Laufen. Und dann machst es Mal mit Marvis „direkter“ Lösung. Dann verstehst was ich meine.

widecrypt

Hallo Steeno,

wird glaube ich nicht gehen, weil das Feld ID aus der
Datenbank den Primary Key besitzt, nicht Key.

Na gut, das habe ich fast befürchtet.

Und deshalb meine Array-Variante.
Gibt es sonst noch einfachere Varianten?

Aber die Datenbank in ein Array zu laden, halte ich immer noch für überflüssig. Das Vorhandensein bzw. nicht Vorhandensein von Werten kann man doch ganz gut mit einem einfachen SELECT feststellen. Scheint mir schneller zu gehen. Aber den praktischen Beweis müsste ich noch erbringen :wink:

Viele Grüße
Marvin

Hallo widecrypt,

@Marvin: Du bist bestimmt fit in der Materie aber ich bemerke
immer wieder die fehlende Felderfahrung. Aber mach weiter und
reife.

Das hast Du schön gesagt.

Aber bedenke, dass alles was du heute in einem Buch
liest, morgen schon alt ist. Gerade in der ITK.

Da will ich dir nicht widersprechen, auch wenn ich nachschlagen musste, was ITK heisst (Informations- und Telekommunikationstechnologie?) Aber der Zusammenhang mit meiner Antwort ist mir unklar. Brauchst Du aber nicht zu erklären, ist zu sehr offTopic.

Und dann machst es Mal mit Marvis
„direkter“ Lösung. Dann verstehst was ich meine.

Ok, zumindest ich werde mal einen Test machen und vergleichen. Interessiert mich jetzt wirklich, ob das Herausschaufeln in ein Array und dann wieder reinpacken in die DB schneller geht. Allerdings später, so sehr brennts mir auch nicht auf den Nägeln.

Viele Grüße
Marvin