kostenloser Webspace werbefrei: lima-city


MySQL Data Normalization

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    stoerchu

    Kostenloser Webspace von stoerchu

    stoerchu hat kostenlosen Webspace.

    Hallo Community

    Ich habe ein "Problem" mit einer MySQL Datenbank, die ich aus einem grossen CSV File erfolgreich importiert habe.

    Die Tabelle ist sehr gross und verfügt über mehrere Tausend Rows und 85 Columns. Eine Bearbeitung von Hand ist also eigentlich nicht durchführbar.

    Mein Gedanke ist jetz, die Tabelle in verschiedene Untertabellen aufzuteilen, damit die Handhabung einfacher wird. Ich möchte also beispielsweise aus einer Column alle verschiedenen Werte auslesen und diese dann in eine andere Tabelle einfügen und dort jeweils auf die ID der Haupttabelle verweisen. Dies hat auch bisher gut geklappt, auch wenn ich die Abfragen jeweils mit PHP gemacht habe und dann quasi in einer Schleife sämtliche Einträge durchgegangen bin auf meinem Lokalen Datenbankserver. Dies hat dann auch mal 20 Minuten in Anspruch genommen.

    Nun habe ich aber das Problem, dass in manchen Columns jeweils ganze Arrays gespeichert sind. Ich möchte die nun alle auslesen und alle verschiedenen Werte im Array analysieren und dann diese Werte in einer Tabelle speichern. Weiter möchte ich eigentlich nur noch die Verweise in einer Dritten Tabelle speichern, damit die Werte auch zugeordnet werden können.

    1. Tabelle (Ursprungsdaten)
    ID | Column1 | Column2
    --------------------------------
    1  | A, B, C    | E, F
    2  | B, C        | F
    3  | C, A, D    | F, E
    
    2. Tabelle (Werte der Column 1)
    ID | Value
    1  | A
    2  | B
    3  | C
    4  | D
    
    3. Tabelle (Bezüge zwischen Tabelle 1 & 2)
    ID | id_tabelle_1 | id_tabelle_2
    1   | 1                  | 1
    2   | 1                  | 2
    3   | 1                  | 3
    4   | 2                  | 2
    usw.


    Meine Frage ist jetzt: gibt es irgend ein brauchbares Script, welches mir diesen Prozess vereinfachen würde? Es muss auch nicht unbedingt mit PHP laufen., sondern einfach auf einem Mac OS.
    Ich bin mir sicher, dass bereits viele Leute vor mir dieses Problem hatten und irgendwie lösen mussten...

    ... und nein, ich kann die Daten nicht bereits normalisiert abrufen, sondern muss arbeiten, mit dem, was ich habe... (die Datenbank ist nicht von mir...)

    Danke für eure Antworten.

    Beitrag zuletzt geändert: 14.1.2016 16:18:52 von stoerchu
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Von "Sehr groß" haben wir wohl unterschiedliche definitionen. ;)
    Mit richtig gesetzten Keys kann man gut was erreichen.
    Wie ist denn das Array aufgebaut? Feste Einträge, verschachtelt, ...?
    Grundsätzlich finde ich eine Tabelle zum Tabellen verknüpfen nicht zielführend. Du kannst in Tabelle 2 ja auch einfach eine Spalte für die ID in Tabelle 2 nehmen. Siehe zb: Foreign Keys
  4. Autor dieses Themas

    stoerchu

    Kostenloser Webspace von stoerchu

    stoerchu hat kostenlosen Webspace.

    Danke für deine Antwort.

    Naja dies ist die grösste Datensammlung, mit der ich bisher gearbeitet habe :-P

    Die Arrays sind nicht immer gleich aufgebaut, sind aber immer 1-dimensional.

    (Ich beziehe mich auf die Definitionen in meinem ersten Post)
    Das Problem ist, dass Daten aus der 2. Tabelle in verschiedenen Rows aus der 1. Tabelle vorkommen können. In der Tabelle 2. sollen die Werte (also die Column "value") unique sein, als nur jeweils einmal vorkommen. Daher brauch eich meines Erachtens eine dritte Tabelle um die Zuordnungen zu bewerkstelligen.

    um Missverständnisse zu vermeinen: in der 1. Tabelle sind die Arrays als strings abgespeichert, mit einem Komma als Trennzeichen.

    Bisher habe ich jeweils eine Column berabeitet. Dazu jeweils eine Row abgerufen, den String der entsprechenden Column mit Explode in ein Array umgewandelt, alle Werte mit der Tabelle 2 abgeglichen, ob da neue Werte vorkommen und wenn ja diese neuen Werte hinzugefügt. Anschliessend habe ich die Tabelle 3 mit den entsprechenden Verbindungen der Tabelle 1 & 2 geupdatet.
    Dieser Prozess funktioniert eigentlich auch sehr gut, allerdings müssen sehr viele Datenabfragen durchgeführt werden und das ganze ist langsam und braucht sehr viel Konzentration meinerseits, dass ich jeweils die richtigen Änderungen im Code vornehme.

    Ich bin nun auf der Suche, nach einem Script/ Programm, welches vielleicht schneller und komfortabler arbeitet.
    Ich kann mir nicht vorstellen, dass ich der Einzige, bin, der jemals mit so einem "Problem" kämpfen musste. Vielleicht bin ich auch einfach zu perfektionistisch veranlagt und sollte die Zeit besser investieren, um das Script selber zu schreiben...
  5. Du kannst es lokal laufen lassen und es wird nur einmal gemacht, also spielt die Laufzeit keine Rolle.

    Warum schreibst du nicht einfach ein PHP-Script?

    Aus
    Tabelle_original:
    ID|Arrays|...
    1|A,B,C,D|...
    ...
    ...

    Wird
    Tabelle_Arrays:
    ID|ID_Haupt|Wert
    1|A
    2|B
    3|C
    4|D

    Tabelle_Zuordnung:
    ID|ID_Array|ID_Haupt
    1|1|1
    2|2|1
    3|3|1
    4|4|1

    Tabelle_Haupt:
    ID|Werte die nicht normalisiert werden|...
    1|...


    PHP-Ablauf:
    -Tabelle_original Spalte auslesen
    -In Tabelle_Haupt eine neue Zeile einfügen (entweder ID übernehmen, oder neue ID in zwischenspeichern) mit allen Daten, die nicht normalisiert werden sollen
    -Bei Arrays eine Schlaufe über jedes Item (notfalls eine Array generieren durch Funktionen wie explode)
    --Wenn es den Wert nicht in Tabelle_Arrays gibt, dort hinzufügen
    --In Tabelle_Zuordnung die Verknüpfung von Tabelle_Haupt und Tabelle_Array machen

    Mit dieser Möglichkeit lebe ich bisher sehr gut, wenn ich Arrays normiert speichern muss.
    Da die Zuordnungstabelle nie angezeigt werden muss, ist die Übersichtlichkeit, die dort wegen reinen Zahlen nicht existiert, irrelevant.
    Zum Verändern von etwas empfehle ich dann eine Funktion zu schreiben, welche immer von der Tabelle mit Arrays zu der normalisierten Form umwandelt, sonst vergisst du mal eine der Tabellen in einer DELETE Funktion und hast jede Menge Datenmüll.
  6. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!