Hallo zusammen,
ich brauchte lange nicht mehr euren Rat, aber jetzt wäre es super wenn Ihr ein paar Anregungen für mich hättet.
Ich arbeite an einem Script, welches Daten aus einer MYSQL DB ausliest und in eine andere MYSQL DB einträgt.
Klassischer Import von Daten beim wechsel einer Software quasi.
Das Script läuft später nur auf der Console und erwartet als Parameter wohin und von wo.
Die zu Importierende DB ist in einem mittelmäßigen zustand. Nicht wirklich Normalisiert dazu MyIsam viele Tabellen haben kein Primary Key.
Im ersten Step habe ich einfach mal angefangen um mal zu schauen wo ich auf welche Probleme stoße.
Db Importiert und mit PDO die ersten Datensätze ausgelesen und dann Iteriert und Doctrine Model Objekte erzeugt und abgespeichert.
Mit PDO greife ich auf die zu Importierende DB zu. Da ich Doctrine 1 in dem Projekt nutze habe ich Doctrine genutzt um Datensätze in der eigene DB zu hinterlegen.
Das klappt natürlich auch, aber es ist sehr sehr unübersichtlich.
Der Umfang der Tabellen ist schon Ordentlich. Die zu Importierende DB kommt auf ca. 100 Tabellen sehr schlecht Normalisiert.
Die eigene DB kommt auf ca. 350 Tabellen, die für diesen Import eine Rolle spielen könnten. Genaue Zahl kann ich so noch nicht abschätzen.
Wenn ich das Prozedural runter bete kommt man natürlich auf viele kleine bis große Probleme.
Unter anderem:
Wie stelle ich Beziehungen in der Ziel DB her?
Vereinfachtes Beispiel: 3 Tabellen ( person, invoice, reminder )
Ich kann hier ja nicht invoice importieren und gleich person mit anlegen.
Müsste also den umgekehrten Weg gehen. person erfassen und die dazugehörigen invoices und reminder.
Das führt aber unweigerlich zu einem Problem, weil invoices auch noch aus anderen Daten bestehen die auch erst importiert werden müssen.
Wie lagere ich Entscheidungen aus?
Manche Informationen existieren einfach nicht in der zu Importierenden DB. z.b. die Anrede einer Person.
In der eigenen DB ist diese Angabe aber pflicht. ich muss also eine Entscheidung treffen und ich werde viele Entscheidungen treffen müssen.
Ich möchte diese Entscheidungen so auslagern im Code, das man später vielleicht einen Wizzard für bauen könnte.
Dazu kommt das Problem mit dem Schema der Datenbanken. Einfach beispiel: Telefonnummer als Varchar 50. Die zu Importierende DB hat hier Varchar 100.
Oder Datum als string gespeichert und das Jahr vergessen usw. Man könnte drüber nachdenken, dass Schema anzupassen was ich aber möglichst vermeiden möchte, da ich das Problem sonst nur verschiebe.
Wie strukturiere ich das am besten Objekt Orientiert?
Prozedural ist natürlich murks, was mir klar war bevor ich angefangen hatte. Aber ich konnte einfach nicht genau überblicken auf was für Hindernisse ich hier stoße. Daher probieren und mal schauen.
Jetzt überlege ich wie ich das aufbauen sollte und welche Patterns mir da helfen könnten.
Um z.b. das Beziehungsproblem zu lösen, könnte man ein Objekt für jeden Datensatz erstellen, welches die Beziehung zwischen der DBs für den Zeitraum des Imports sicherstellt.
Ob das notwendig ist und wie das im Detail aussieht würde ich gerne mal zu Diskussion stellen.
Die zu Importierenden DBs können durchaus mehrere 100MB groß sein. Das kann ich weites gehend ignorieren. Eventuell sollte man auf dem RAM verbrauch etwas achten beim erstellen von Objekten.
Ideen, Anregungen?
ich brauchte lange nicht mehr euren Rat, aber jetzt wäre es super wenn Ihr ein paar Anregungen für mich hättet.
Ich arbeite an einem Script, welches Daten aus einer MYSQL DB ausliest und in eine andere MYSQL DB einträgt.
Klassischer Import von Daten beim wechsel einer Software quasi.
Das Script läuft später nur auf der Console und erwartet als Parameter wohin und von wo.
Die zu Importierende DB ist in einem mittelmäßigen zustand. Nicht wirklich Normalisiert dazu MyIsam viele Tabellen haben kein Primary Key.
Im ersten Step habe ich einfach mal angefangen um mal zu schauen wo ich auf welche Probleme stoße.
Db Importiert und mit PDO die ersten Datensätze ausgelesen und dann Iteriert und Doctrine Model Objekte erzeugt und abgespeichert.
Mit PDO greife ich auf die zu Importierende DB zu. Da ich Doctrine 1 in dem Projekt nutze habe ich Doctrine genutzt um Datensätze in der eigene DB zu hinterlegen.
Das klappt natürlich auch, aber es ist sehr sehr unübersichtlich.
Der Umfang der Tabellen ist schon Ordentlich. Die zu Importierende DB kommt auf ca. 100 Tabellen sehr schlecht Normalisiert.
Die eigene DB kommt auf ca. 350 Tabellen, die für diesen Import eine Rolle spielen könnten. Genaue Zahl kann ich so noch nicht abschätzen.
Wenn ich das Prozedural runter bete kommt man natürlich auf viele kleine bis große Probleme.
Unter anderem:
Wie stelle ich Beziehungen in der Ziel DB her?
Vereinfachtes Beispiel: 3 Tabellen ( person, invoice, reminder )
Ich kann hier ja nicht invoice importieren und gleich person mit anlegen.
Müsste also den umgekehrten Weg gehen. person erfassen und die dazugehörigen invoices und reminder.
Das führt aber unweigerlich zu einem Problem, weil invoices auch noch aus anderen Daten bestehen die auch erst importiert werden müssen.
Wie lagere ich Entscheidungen aus?
Manche Informationen existieren einfach nicht in der zu Importierenden DB. z.b. die Anrede einer Person.
In der eigenen DB ist diese Angabe aber pflicht. ich muss also eine Entscheidung treffen und ich werde viele Entscheidungen treffen müssen.
Ich möchte diese Entscheidungen so auslagern im Code, das man später vielleicht einen Wizzard für bauen könnte.
Dazu kommt das Problem mit dem Schema der Datenbanken. Einfach beispiel: Telefonnummer als Varchar 50. Die zu Importierende DB hat hier Varchar 100.
Oder Datum als string gespeichert und das Jahr vergessen usw. Man könnte drüber nachdenken, dass Schema anzupassen was ich aber möglichst vermeiden möchte, da ich das Problem sonst nur verschiebe.
Wie strukturiere ich das am besten Objekt Orientiert?
Prozedural ist natürlich murks, was mir klar war bevor ich angefangen hatte. Aber ich konnte einfach nicht genau überblicken auf was für Hindernisse ich hier stoße. Daher probieren und mal schauen.
Jetzt überlege ich wie ich das aufbauen sollte und welche Patterns mir da helfen könnten.
Um z.b. das Beziehungsproblem zu lösen, könnte man ein Objekt für jeden Datensatz erstellen, welches die Beziehung zwischen der DBs für den Zeitraum des Imports sicherstellt.
Ob das notwendig ist und wie das im Detail aussieht würde ich gerne mal zu Diskussion stellen.
Die zu Importierenden DBs können durchaus mehrere 100MB groß sein. Das kann ich weites gehend ignorieren. Eventuell sollte man auf dem RAM verbrauch etwas achten beim erstellen von Objekten.
Ideen, Anregungen?
Kommentar