Hallo pl,
Wir haben hier einen abstrakten Datentyp, also
Key => Value
(...) Der gewünschten Operation entspricht die PHP Funktion array_merge()…
Äh - nein und nein. array_merge überschreibt bei mehrfachem Auftauchen eines Key, aber hier soll nicht überschrieben werden sondern angehängt.
Ich lese die Aufgabenstellung so, dass es da einige Namen gibt, und wenn zu einem Namen ein Wert eingegeben wird, wird der gespeichert. Werden in nachfolgenden Formular-POSTs nochmal Werte zum Namen angegeben, werden diese Werte auch gespeichert. Zu jedem Namen N können also $$k_N$$ Werte gespeichert sein, und MH möchte das so machen, dass die DB nicht mehr Zeilen enthält, als der Wert des größten $$k_N$$. Namen, die weniger Werte enthalten, haben Leerwerte in den entsprechenden Rows.
Der abstrakte Datentyp ist also ein Dictionary, Key-Typ ist String und Wertetyp ist List<String>. Das von MH angedachte Mapping auf SQL ist suboptimal, weil es einen ganzen Haufen Anomalien gibt:
- ein neuer Name verlangt eine DB-Modifikation (neue Spalte).
- ein neuer Wert verlangt einen Table-Scan, um freien Platz zu finden
- Ermitteln aller Werte zu einem Namen verlangt einen kompletten Table-Scan
- Updates verlangen im Prinzip einen Table-Lock, weil sonst Race-Conditions bei der Freiplatzsuche entstehen können
- Wenn Werte gelöscht werden, entstehen Lücken. Sollen die einfach stehen bleiben und später recycled werden? Kann man machen, aber wenn viel gelöscht wird, ist die Table nur noch sehr mager gefüllt. D.h. Löschen verlangt Reorganisation in den Datensätzen, das ist Handarbeit an der Datenhaltung. Und die vermeidet man, wenn ein anderes DB-Modell diese Handarbeit wegautomatisiert.
Ein für relationale DBs brauchbareres DB-Layout habe ich bereits benannt.
Deinen PERL Teil habe ich überflogen, aber nicht genauer studiert. Erstens kann ich kein Perl, zweitens ging es um PHP, drittens habe ich abgeschaltet als ich dein EAV-Konzept wiedererkannt habe. Hier werden keine Entities mit Attribut-Value Paaren gespeichert, sondern Namen mit Wertelisten. Insofern bin ich der Meinung, dass man deinen vorgeschlagenen Ansatz möglicherweise mit dem Holzhammer passend zum Problem machen kann. Aber ich programmiere lieber zärtlicher. Daher: so toll EAV in anderen Einsatzgebieten sein mag - hier eher nicht.
Rolf
Soßen sind braun