Ankündigung

Einklappen
Keine Ankündigung bisher.

navigation erstellen - mysql - datenbankstruktur ändern

Einklappen

Neue Werbung 2019

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

  • #16
    Die "funktionierende Variante" ist aber nicht so fein.

    Es ist doch quatsch, erstmal 25.000 Datensätze in ein Array zu lesen und dann für jedes Element
    eine Vergleich mit den 0-24.999 anderen Datensätzen durchzuführen!
    (übrigens gäbe es hierfür array_unique())

    Lese die Datei Schritt für Schritt ein (fgetcsv()) und kopiere dabei jeden Pfad, der noch nicht
    aufgetaucht ist in ein Array ( if (!in_array(...)) ...; ). Damit hast du alle Pfade in einem Array.

    Aber davor gibt es womöglich noch ein anderes Problem. Ist dieser CSV-Import eine einmalige
    Geschichte oder dient er der Synchronisation mit einer lokalen Datenbank?

    Wenn letzteres der Fallist, dann würde ich mich hüten, die Daten alle so in eine CSV-Tabelle zu
    verwursten. Ich hatte eine sehr ähnliche Anforderung vor ein paar Jahren mal für einen
    Dachverband von Reiseanbietern und der Programmierer der lokalen Access-Geschichten war
    nicht dazu zu bewegen, seine Daten mal gescheit zu strukturieren und so hatte ich dann eben auch
    alles zusammengepackt in einer csv-Datei. Das musste ich dann alles auseinanderklamüsern und
    dann lauter Vergleiche anstellen und Listen/Formulare ausgeben, um den Verwalter des Systems
    jeweils mit Abfragen löchern zu können, ob nicht mehr vorkommende Reiseveranstalter, Länder
    oder angebotene Aktivitäten gelöscht werden sollen oder ob die Benutzerkonten bzw. die Option für
    die Reiseanbieter, dieses Land oder Angebot ihrem Profil zuzuordnen noch bestehen erhalten
    bleiben sollen etc.

    Kurz vor oder nach Abnahme rief mich dann der Admin der Access-Datenbank an, er habe sich
    überlegt, dass es ja viel geschickter sei, die Daten in verschiedene Tabelle zu legen, ob er das
    noch ändern könnte. Ich wäre beinahe durchs Telefon gekrochen, um ihm den Hals umzudrehen!

    Und da hatte ich noch nichtmal das Problem uneindeutiger Datensätze.

    Wenn du nun aber so rangehen willst/musst, dann musst du ja bei jedem
    kleinen Update den kompletten Datenbestand neu hochladen. Andernfalls
    hast du ja keine Möglichkeit, Kategorien zu verschieben, da du diese ja
    ausschließlich anhand des Pfades identifizierst. Dabei kommt es natürlich
    zu unschönen Effekten für die Besucher, da die IDs der Kategorien ja neu
    vergeben werden und so dann plötzlich Limks (Bookmarks) auf falschen
    Seiten oder 404ern landern.

    Mein Rat: Schau nochmal, ob du die zu importierende Datenquelle anders verfügbar machen
    kannst. Wenn die aus einer Datenbank des Kunden kommen, dann werden die ja hoffentlich
    normalisiert vorliegen und dann pack dir einfach die CSV-Daten aller Tabellen in eine Datei
    und du hast den ganzen Streß nicht.

    Basti

    Kommentar


    • #17
      Du hast recht, das Problem Speicher ist vorhanden. Da es hier vermutlich aber um ne einmalige Sache geht, hab ich das mal ignoriert.
      Andere Methoden sind bedeutend aufwendiger zu schreiben und für einen Anfänger harter Tobak.
      Habe so etwas vor kurzem selber mal schreiben müssen, allerdings mit 600 000 Einträgen, da war die Array MEthode natürlich nicht nutzbar.
      Deine ID Probleme tauchen aber auch nur bei automatisierter Veränderung auf, dann aber hilft auch nicht der komplette Pfad weiter, da du in der neuen CSV einfach dann den alten weg den neuen hin hast, ein Bezug aber auch nicht zu finden ist. Da ist es dann scheiss egal, welche Methode du nutzt, scheitern tun alle.
      Wenn ich da was übersehe, kannst du mir das gerne sagen.

      Würde mich übrigens auch freuen, wenn du mal einen besseren Vorschlag machst. Will ja auch noch was lernen.

      Gruß Chris

      EDIT: Mir ist da was aufgefallen:

      Lese die Datei Schritt für Schritt ein (fgetcsv()) und kopiere dabei jeden Pfad, der noch nicht
      aufgetaucht ist in ein Array ( if (!in_array(...)) ...; ). Damit hast du alle Pfade in einem Array.

      Was ist daran so viel besser als bei mir??

      OK du erstellst nicht erst das ganze Array, aber hast genau wie ich 25000*25000/2 Vergleiche.

      Kommentar


      • #18
        Sollte Deine Zahl der Vergleiche nicht eher so lauten:

        25000 * <Anzahl der unterschiedlichen Pfade> / 2

        ???

        Wobei u.U. gilt:

        <Anzahl der unterschiedlichen Pfade> << 25000
        **********************************
        Nein, ich bin nicht die Signatur.
        Ich putze hier nur.
        **********************************

        Kommentar


        • #19
          Zitat von CC84
          Du hast recht, das Problem Speicher ist vorhanden. Da es
          hier vermutlich aber um ne einmalige Sache geht, hab ich das mal
          ignoriert.
          Andere Methoden sind bedeutend aufwendiger zu schreiben und für einen
          Anfänger harter Tobak.
          Nein nein, das ist eher viel einfacher:
          PHP-Code:
          <?php
          $rCSV 
          fopen("data.csv""r");
          $aCats = array(); 
          while (
          false !== ($aRecord fgetcsv($sCSV))) {
              
          // hier die Produktdaten in die Datenbank kopieren

              // dann die Kategorien (laegen in $aRecord[4])
              
          if (!in_array($aRecord[4], $aCats)) $aCats[] = $aRecord[4];
          }
          fclose($handle);
          ?>
          Das ist alles. Damit hast du alle Pfade einmalig in einem Array.

          Deine ID Probleme tauchen aber auch nur bei automatisierter
          Veränderung auf, dann aber hilft auch nicht der komplette Pfad weiter, da
          du in der neuen CSV einfach dann den alten weg den neuen hin hast, ein
          Bezug aber auch nicht zu finden ist. Da ist es dann scheibenkleister egal,
          welche Methode du nutzt, scheitern tun alle.
          Wenn ich da was übersehe, kannst du mir das gerne sagen.

          Würde mich übrigens auch freuen, wenn du mal einen besseren Vorschlag
          machst. Will ja auch noch was lernen.
          Natürlich ist dieses Problem unabhängig von der Methode, die Daten
          auszulesen, da dieses Datum ja nicht vorhanden ist. Ich dachte, ich hätte
          das so geschrieben.

          Mein Vorschlag ist eben, zuerstmal die Datenquelle umzustrukturieren.
          Wenn die lokal derart übel gespeichert sind, dann sollten sie
          umorganisiert werden. Falls der dafür Zuständige nicht dazu bewegt
          werden kann (wie das bei mir damals der Fall war) oder der Kunde davon
          nicht überzeugt werden kann, dann gehts halt nicht.

          Wenn die Daten aber lokal gescheit vorliegen, dann muss ja nur die
          Export-Schnittstelle ein wenig umgeschrieben werden - vereinfacht
          werden sogar, denn es ist ja aufwändiger, Die Daten derart
          zusammenzubringen, als einfach jede Tabelle für sich
          untereinandergesetzt zu speichern.

          In dem Fall musst du die Daten auf dem Server nurnoch anhand eines
          eindeutigen Trenners aufsplitten und du hast die Daten für jede Tabelle.
          Jetzt legst du jeweils eine temp. Tabelle an, packst de Daten rein und
          verschiebstdie Tabelle über die jeweils veraltete Version.

          Um den Abgleich komfortabler, meint scheller zu machen kannst du auch
          nur die tatsächlichen Änderungen protokollieren und das Protokoll
          hochladen, um die Datenbanken zu synchronisieren. Ist aber natürlich ein
          wenig aufwändiger und fehleranfälliger.

          Was die Vergleiche angeht:
          Bei mir wird jeder Datensatz von de 25.000 mit den bisher eingelesenen
          Kategorien veglichen.

          Es wird wohl wenige Dutzend Kategorien geben, sagen wir mal 50, dann
          sind das unter 1.250.000 Vergleiche.

          Bei dir sind es 0 + 1 + 2 + 3 + ... + 24.997 + 24.998 + 24.999.
          Das sind 312.487.500:

          PHP-Code:
          <?php
          $sum 
          0;
          for (
          $i=1$i<25000$i++)
              
          $sum += $i;
          echo 
          $sum;
          ?>
          Aber das macht wohl eh wenig Sinn, das so aufzurechnen, denn in
          meinem Fall hast du 25.000 Aufrufe via in_array(), das in C nach dem
          Vorkommen einer Zeichenkette in einem sehr kleinen Array sucht und im
          anderen Fall hast die Iteration über das Array in PHP und direkte
          Zeichenkettenvergleiche.

          Da würde (mich zumindest) nur Testen weiterbringen, wobei ich mir das
          sparen würde, da ich keine 50 Kategorien über 25.000 Arrayfelder
          verteilen würde, um dann erst die doppelten rauszulöschen. Das kann
          einfach nicht schneller sein!

          Basti

          PS @"Der_Gerhard":

          Ich dachte, "CC84" meint sowas hier:
          PHP-Code:
          $iID 0;
          foreach (
          $aCats as $sCat) {
              echo 
          "<a href=\"...?cat=$iID\">$sCat</a>\n";
              
          $iID++;

          Hat sich ja aber erledigt.

          Kommentar


          • #20
            Edit:

            Vergiss alles bis auf guten morgen....

            Hab nen Denkfehler gehabt.

            Kommentar


            • #21
              Guten Morgen, alles ist wieder aus dem Gedächtnis gelöscht

              Danke dir für deine Mühe und allen für die zahlreichen Antworten.

              Da es hier angesprochen wurde: Das wird keine einmalige Sache sein und die Daten werden in regelmäßigen Abständen in die DB exportiert...

              Noch eine Frage habe ich.

              Wie hätte die Struktur besser aufgebaut werden müssen?
              Gruß
              David

              Kommentar


              • #22
                Eine Tabelle mit den Produkten, eine mit dem Kategorien-Baum und entweder, bei einer 1:n-Beziehung eine Spalte in der Produkte-Tabelle, in der das Produkt einer Kategorie zugeordnet wird (Fremdschlüssel). Oder, falls ein Produkt in mehreren Kategorien eingeordnet werden können soll (n:m) eine dritte Tabelle, in der die Zuordnung gespeichert wird.

                http://www.itse-guide.de/artikel/25
                http://de.wikipedia.org/wiki/Entity-Relationship-Modell
                http://de.wikipedia.org/wiki/Normali...28Datenbank%29

                Basti

                Kommentar


                • #23
                  Eine Tabelle mit den Produkten, eine mit dem Kategorien-Baum und entweder, bei einer 1:n-Beziehung eine Spalte in der Produkte-Tabelle, in der das Produkt einer Kategorie zugeordnet wird (Fremdschlüssel). Oder, falls ein Produkt in mehreren Kategorien eingeordnet werden können soll (n:m) eine dritte Tabelle, in der die Zuordnung gespeichert wird.
                  Der Betreiber möchte von mir einen Vorschlag hören, wie er das alles umstrukturieren soll. Gibt es zu diesem Text etwas zu ergänzen?

                  Hier nochmal die Datei, falls diese Benötigt wird.
                  http://www.dm-fc.com/tmp.csv
                  Gruß
                  David

                  Kommentar


                  • #24
                    Zitat von Bonaparte
                    Der Betreiber möchte von mir einen Vorschlag hören, wie er das alles umstrukturieren soll. Gibt es zu diesem Text etwas zu ergänzen?
                    Wenn er da nachfragen muss, wie man sowas abbildet, dann beschreib ihm das lieber etwas detaillierter.

                    Basti

                    Kommentar

                    Lädt...
                    X