{"id":501,"date":"2017-07-08T18:05:57","date_gmt":"2017-07-08T16:05:57","guid":{"rendered":"http:\/\/evileu.de\/zum-schwarzen-pinguin\/?p=501"},"modified":"2017-07-08T18:05:57","modified_gmt":"2017-07-08T16:05:57","slug":"da-staunste-baukloetze-vielleicht-serialized-vielleicht-nicht","status":"publish","type":"post","link":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/2017\/07\/08\/da-staunste-baukloetze-vielleicht-serialized-vielleicht-nicht\/","title":{"rendered":"Da staunste Baukl\u00f6tze: vielleicht serialized, vielleicht nicht"},"content":{"rendered":"<h2>Wenns klemmt im Datenkorsett<\/h2>\n<p>Ich habe mich schon an anderer Stelle dar\u00fcber ausgelassen, da\u00df das Datenmodell von WordPress alles andere als relational wohlstrukturiert und insgesamt renovierungsbed\u00fcrftig ist.\u00a0 Wenn\u00a0 man sich ein bi\u00dfchen mit multifunktionalen Plugins wie z.B. woocommerce besch\u00e4ftigt, stellt man immer wieder fest, da\u00df Entit\u00e4ten in die vorhandenen WordPress-Tabellen gequetscht werden, die eigentlich nicht wirklich hineinpassen. Um beim Beispiel woocommerce zu bleiben, weil das ja doch sehr verbreitet und gut dokumentiert ist: da werden die zu verkaufenden Produkte in der Tabelle wp_posts wie Beitr\u00e4ge angelegt, und was man hier an Produkteigenschaften und benutzerdefinierten Feldern nicht mehr untergebracht hat, landet in der wp_options, der wp_postmeta oder in der wp_terms und ihren Verwandten. Damit man hier auch alles unterbringt, obs jetzt logisch pa\u00dft oder nicht, kommt ein tolles Konstrukt zum Einsatz (\u00fcbrigens nicht nur in WordPress, das gibts auch anderswo):<\/p>\n<h2>Serialized Data<\/h2>\n<p>Was ist das? Wenn sie einen Datenbankeintrag finden , der so aussieht:<\/p>\n<p><em>a:1:{s:14:&#8220;pa_code&#8220;;a:6:{s:4:&#8220;name&#8220;;s:14:&#8220;pa_code&#8220;;s:5:&#8220;value&#8220;;s:0:&#8220;&#8220;;s:8:&#8220;position&#8220;;i:0;s:10:&#8220;is_visible&#8220;;i:1;s:12:&#8220;is_variation&#8220;;i:0;s:11:&#8220;is_taxonomy&#8220;;i:1;}}<\/em><\/p>\n<p>Das sind serialisierte Daten. Es handelt sich hier um ein Produktattribut namens &#8222;code&#8220;, das in dieser besonders verklausulierten Form abgelegt wurde. Wer genauer wissen m\u00f6chte, was serialisierte Daten sind, kann <a href=\"http:\/\/php.net\/manual\/de\/language.oop5.serialization.php\">hier im PHP-Manual<\/a> mal nachlesen, und mir ganz ehrlich sagen wenn er auch nur die H\u00e4lfte verstanden hat. Soweit ich es kapiert habe, erlaubt es die Serialisierung, <strong>in einem einzigen Datenbankfeld mehrere Variable<\/strong> unterschiedlicher Datentypen zu speichern.\u00a0 In einem Array, mit Hilfe eines Objekts. Aber, ich gebe wie gesagt ehrlich zu ich hab nicht genau verstanden, wie das wirklich funktioniert. Da schwirrt es in den Manuals nur so von Objekten und Klassen und Methoden, und mir fehlt echt die Geduld (und der Hang zur Verkomplizierung) mich da weiter einzulesen. Ich habs versucht, und bin dabei unter anderem auf einen besonderen Leckerbissen gestossen:<\/p>\n<h2>Eine Funktion namens <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/maybe_serialize\">maybe_serialize()<\/a><\/h2>\n<p>Allen Ernstes. Laut Codex macht die Folgendes: <em>sie serialisiert Daten, falls n\u00f6tig<\/em>. Ich mu\u00df da unbedingt mal w\u00f6rtlich zitieren:<\/p>\n<blockquote><p>Confusingly, strings that contain already serialized values are serialized again, resulting in a nested serialization. Other strings are unmodified.<\/p><\/blockquote>\n<p>Ach nee, &#8222;confusingly&#8220;, also verwirrenderweise? Da brat mir doch einer einen Storch! Und wie kriegt man die Daten da wieder raus? Gute Frage. Es gibt tats\u00e4chlich auch eine Funktion namens <a href=\"https:\/\/codex.wordpress.org\/Function_Reference\/maybe_unserialize\">maybe_unserialize()<\/a>, ist das nicht sch\u00f6n? Irgendwas mu\u00df man damit doch anfangen k\u00f6nnen&#8230; meine Recherchen haben aber noch nicht ergeben, was man sinnvollerweise damit macht.<\/p>\n<h2>Wof\u00fcr soll das alles gut sein?<\/h2>\n<p>Der Knackpunkt ist: hier werden buntgemischte Daten in ein einziges Tabellenfeld geklemmt, statt sie sauber nach Datentypen getrennt in einer passenden Tabelle zu speichern. Damit bringt man mehr Informationen als vorgesehen in einer bereits vorhandenen Tabelle unter, aber das Auslesen und Weiterverarbeiten wird beliebig kompliziert und erstmal sehr verwirrend und umst\u00e4ndlich. Und mal ganz im Ernst: eine Funktion, die &#8222;maybe&#8220; irgendwas macht, die kann ich nicht gebrauchen. Das sind Stilbl\u00fcten der objektorientierten Programmierung, die allem widersprechen, was ich \u00fcber Datenmodellierung und Tabellenstrukturierung je gelernt habe.<\/p>\n<p>Um beim Beispiel woocommerce zu bleiben: das Plugin g\u00f6nnt sich ja ohnehin ein gutes Dutzend eigener Tabellen. Warum legt man dann f\u00fcr die Produktattribute nicht auch eine eigene Tabelle an, in der die n\u00f6tigen Daten in lesbarer und vor allem auch per SQL auswertbarer Form gespeichert werden? Kostet auch nicht mehr, und w\u00e4re unendlich benutzerfreundlicher. Den Mumpitz mit den vielleicht oder auch nicht serialisierten Daten k\u00f6nnte man sich dann echt sparen.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wenns klemmt im Datenkorsett Ich habe mich schon an anderer Stelle dar\u00fcber ausgelassen, da\u00df das Datenmodell von WordPress alles andere als relational wohlstrukturiert und insgesamt renovierungsbed\u00fcrftig ist.\u00a0 Wenn\u00a0 man sich ein bi\u00dfchen mit multifunktionalen Plugins wie z.B. woocommerce besch\u00e4ftigt, stellt man immer wieder fest, da\u00df Entit\u00e4ten in die vorhandenen WordPress-Tabellen gequetscht werden, die eigentlich nicht [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[18,4,8,24,2],"tags":[],"_links":{"self":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/501"}],"collection":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/comments?post=501"}],"version-history":[{"count":4,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/501\/revisions"}],"predecessor-version":[{"id":505,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/posts\/501\/revisions\/505"}],"wp:attachment":[{"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/media?parent=501"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/categories?post=501"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/evileu.de\/zum-schwarzen-pinguin\/wp-json\/wp\/v2\/tags?post=501"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}