Datenbankwerte als Schlüssel für Arrays

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Datenbankwerte als Schlüssel für Arrays

    Hallo liebe PHP-Gemeinde,

    ich habe folgendes Problem:

    Stellt euch vor, ich habe ein Array1 = array() mit Strings als Schlüssel und Subarrays als Value. Dieses Subarray enthält Integers als Indexwerte und Strings

    als Values. Davon baue ich denn ein zweites Array auf. Die (simple) Struktur sieht so aus:
    PHP-Code:
    $array1 = array("Table_A" => array("Column_A_1","Column_A_2",...,"Column_A_N"),
               
    "Table_B" => array("Column_B_1","Column_B_2",...,"Column_B_N")
            ...
               
    "Table_N" => array("Column_N_1","Column_N_2",...,"Column_N_N"); 
    Jetzt leite ich noch ein zweites Array von diesem ab:

    PHP-Code:
    $array2 = array("TableA" => array("Column_A_1" => "0","Column_A_2" => "0",...,"Column_A_N" => "0"),
            
    "TableB" => array("Column_B_1" => "0","Column_B_2" => "0",...,"Column_B_N" => "0")) 
    Ich habe jetzt zwei Möglichkeiten diese Arrays aufzubauen.

    1) Ich code beide Array selbst (statisch)
    2) Ich lasse exakt so ein Array durch ein Datenbank Script aufbauen.

    Beide Arrays sind aus Sicht des PHP-Developers identisch.

    Es gibt 2 Zugriffsfunktionen auf dieses Array:

    getColumn(<String> tablename) arbeitet auf Array1;
    getEmptyRecord(<String> tablename) arbeitet auf Array2;

    Platziert wird dieser Code im Constructor eines Singleton, er wird also nur einmal ausgeführt, erst dann werden die Zugriffsfunktionen benutzt.

    Verwendet wird obiges im folgend dargestellten Context:

    Ich iteriere über tausende von Datensätzen und rufe bei jedem die Zugriffsfunktion getColumn() und getEmptyRecord() auf.

    Ablauf in Pseudo Code:

    init: Array aufbauen nach Methode 1) oder 2)

    while(!fertig): getColumn(tablename), getEmptyRecord(tablename)


    Jetzt ist es so, dass die Ausführungsgeschwindigkeit sich dramatisch unterscheided, abhängig davon ob beide Arrays nach Methode 1) oder 2) aufgebaut werden.

    Meine Vermutung ist, dass es Probleme gibt, wenn Datenbankergebnisse (Werte) als Keys für Arrays benutzt werden. Vermutlich speichert PHP intern einen

    Datenbankwert nicht als normalen PHP-String sondern als Zeiger auf eine DB Resource. Dies könnte den Zugriff dann drastisch verlangsamen, da der Wert nicht

    gepuffert wird, sondern wahrscheinlich jedesmal neu von PHP angefordert wird.

    Die Konsequenz daraus ist, dass ich nicht performant Datenbankwerte als Schlüssel nehmen kann.

    Meine Frage ist jetzt, kann ich dagegen was tun? Ich würde logischerweise die dynamische Erzeugung der Arrays bevorzugen. Kann ich so einen Datenbankwert in

    einen normalen PHP-String umwandeln? Habe schon einiges probiert:

    - Casten (hilft nix)
    - Kopieren, also $c = $row['field'] (hilft nix, da wahrscheinlich nur der interne Zeiger kopiert wird)
    - anderen Datenbanklayer benutzt (PDO und PEARDB)

    So, ich weiß, die Problembeschreibung kommt etwas länglich daher, aber ich will euch ja genauste Information zu meinem Problem geben.


    Vielen Dank
    Viele Grüße
    Schattenwaran

  • #2
    Zeig doch mal etwas code her, vielleicht liegts auch an Deiner Vorgehensweise, wie Du das array erzeugst...
    Beantworte nie Threads mit mehr als 15 followups...
    Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

    Kommentar


    • #3
      Nein, liegt es definitiv nicht. Die Arrays habe ich so erzeugt:

      Code Fragment (teilweise Pseudo-Code):
      Fehlerbehandlung vernachlässigt usw.

      PHP-Code:

      $tables 
      = array();
      $records = array();

      foreach(
      $pdo->query(SHOW TABLES)->fetchAll() as $table)
      {
          
      $tables[$table] = array();
          foreach(
      $pdo->query(SHOW COLUMNS FROM $table) as $column)
          {
                
      $tables[$table][] = $column;
          }

           
      $records[$table] = array_flip($tables[$table]);


      Wie schon gesagt, dieser Code wird exakt einmal ausgeführt, die beiden Arrays sind dann global in einem Singleton drin.

      Kritisch ist das $records Array, solange ich die Datenbankwerte als Array-Values nehme, ist alles i.Ordnung. Sobald ich aber die Values flippe (oder andersweitig als Schlüssel hernehme) bricht die Zugriffsperformance drastisch ein. Ich weis ja, dass PHP intern die Arrays als HashMap verwaltet. Ein Zugriff müsste demnach mit einem Key extrem schnell erfolgen. Tut es ja auch, wenn ich beide Arrays per Hand code. Wahrscheinlich gibts eine Zwischenstufe intern in PHP, die Werte aus der Datenbank sind wahrscheinlich nicht identisch mit einem gleichnahmigen String.

      Bin für alle Vorschläge/Anregungen dankbar.
      Viele Grüße
      Schattenwaran

      Kommentar


      • #4
        Ich kann mir nicht vorstellen, dass die Arrayzugriffe so langsam sein sollen. Ich würde eher auf einen anderen Fehler tippen!
        Hast du mal ein wenig die Ausführungszeit einzelner Skriptabschnitte gemessen?

        Kommentar


        • #5
          Tja, ich konnte mir das auch nicht vorstellen. Es ist aber definitv so (stundenlange Tests), bis ich es herausgefunden haben. Es sind tatsächlich die Keys, die Datenbankwerte (also via DB-Zugriff) geholt werden.

          Ist ätzend, aber wegen der Performanze muss ich das DB-Schema dann hardcoden.

          Die Zugriffsgeschwindigkeit differiert um Größenordnungen.
          Viele Grüße
          Schattenwaran

          Kommentar

          Lädt...
          X