hi,
Das hoffe ich doch, dafür haben wir ja Design-Pattern ;) Ich habe leider nur die deutsche Fassung von Entwurfsmuster hier parat, kennst du zufällig den deutschen Namen des Musters oder hast einen Link zum Thema parat? Ich habe einen groben Eindruck vom EAV-Pattern, aber würde mir gerne mal die Diskussion dazu anschauen.
Wahrscheinlich eher ein Thema für lange Winterabende. Die EAV-Sache ist eigentlich ganz einfach und es gibt auch CPAN-Module, die sich dem Thema widmen. Im Prinzip ist der Datenspeicher eine nicht normalisierte Tabelle mit drei Spalten: entity, attribute, value.
Der primary key umfasst ent + att und ist, sofern die Daten in einer DB vorliegen, auch der Schlüssel für performante Abfragen. In einer DB hat es das EAV-Pattern in sich: Obwohl die Daten quasi serialisiert vorliegen, sind mit SQL gezielte Abfragen machbar per Selfjoin und sowas ist auch performant.
Anstatt also für jedes Attribut ein Datenfeld anzulegen, werden att = val paarweise untereinander in die Tabelle geschrieben und die Abfrage
SELECT ent,att,val FROM urlmap WHERE ent = '/foo.html';
liefert praktischerweise ein Objekt mit Attributen wie title, descr, body, usw, und (in meinem FW) im class-Attribute den Namen der Klasse, welche für's Ausliefern der Response zuständig ist. Mit Perl gibt es weitere schöne Sachen, womit die Datenhaltung abstrahiert und der Code vereinfacht werden kann, z.B. mit ~~~perl tie():
tie my $customer, 'Customer';
$customer->{name} = 'Haselhuhn';
tied(%{$customer})->write; # Änderungen speichern
wobei das ganze SQL-Geraffel wie von Zauberhand von der Klasse 'Customer' erledigt wird.
EAV für Datenhaltung in Dateien: Genauso auch drei Felder mit variabler Länge, wo Daten als pure Binary enthalten. Zur Veranschaulichung, betrachte das mal bildlich als CSV:
addr;name;Haselhuhn
addr;vname;Horst
addr;city;Henneberg
Wobei bei einer Low-Level-Serialisierung einfach nur alles hinterreinander wech geschrieben wird (ohne Feld-Trenner-Zeichen, ohne Record-Trenner-Zeichen), natürlich mit fixen Längenangaben, damit die Daten wiederhergestellt werden können.
Auch ein Overload geht mit Low-Level:
addr;city;Henneberg
addr;city;Nein, der wohnt jetzt woanders
da wird ein Attribut einfach nur überschrieben und im nächsten Zyklus (serialize + deserialize) isses ganz raus.
> BTW: RAM ist imho. ein schlecht gewählter Bezeichner für eine Variable.
Für die Demo extra so gewählt: Random Access (Memory)
Mit Linearer Adressierung wird ein Vorgang beschrieben, mit dem versucht wird, Random Access auf Dateiebene, also in der Sequenz selbst abzubilden, was ich persönlich für ziemlichen Unfug halte. Kein geringerer als Niklas Wirth schrieb sinngemäß dasselbe bereits in den 80ern.
Dazu auch [Mein Artikel in der $foo](http://rolfrost.de/foo.html)
(aus meiner heutigen Sicht überarbeitungsbedürftig, aber gedruckt ist gedruckt ;)
> Ich muss jetzt wie ein Zwangs-Neurotiker auf dich wirken, aber bemühe dich mal um Konsistenz in deinem Quellcode, mal ein einfaches Anführungszeichen und mal ein doppeltes für String-Begrenzer, ohne offensichtlichen Grund… ich weiß auch nicht, irgendwie stört mich das.
>
> Das sind Kleinigkeiten, aber sie können viel ausmachen ;)
Das liegt an der Hand, die gerade frei ist, mal nach links oben" oder rechts unten' .... natürlich auch nur, wenn es der Kontext erlaubt ;)
In Perl greife ich gerne auf q() oder qq() zurück, insbesondere, wenn die Texte mehrzeilig sind, die korrespondierenden Klammern sind vom Editor schnell gefunden.
Viele Grüße,
Horst
Ähm, Basteln, vieles ist Hobby. Zwischen Kommerz und Bastelei gibt es jedoch immer wieder Übergänge, wie die Geschichte der Rundfunktechnik zeigt:
Unbestritten waren Amateure die Wegbereiter für den kommerziellen Einsatz der Funktechnik, die im Langwellenbereich ihren Anfang nahm. Amateure durften sich in immer kürzeren Wellenbereichen tummeln, lange Zeit herrschte die Auffassung vor, dass kurze Wellen für den kommerziellen Funkverkehr völlig ungeeignet sind.
Eines Tages vollbrachten Amateure das Unfassbare: Sie überbrückten den Atlantik! Marconi fiel aus allen Wolken, denn die Amateure funkten mit kurzen Wellen... Natürlich wären Erfinder keine Erfinder, wenn sie nicht auch nach dem schauen, was die Anderen so machen.
[mehr zum Thema Funktechnik](http://rolfrost.de/uhf_konverter.html)