{"id":155,"date":"2010-11-01T08:00:51","date_gmt":"2010-11-01T07:00:51","guid":{"rendered":"https:\/\/d-mueller.de\/blog\/?p=155"},"modified":"2010-11-03T03:43:01","modified_gmt":"2010-11-03T02:43:01","slug":"ueber-orm","status":"publish","type":"post","link":"https:\/\/d-mueller.de\/blog\/ueber-orm\/","title":{"rendered":"\u00dcber ORM"},"content":{"rendered":"<p><a href=\"http:\/\/de.wikipedia.org\/wiki\/Objektrelationale_Abbildung\">ORM<\/a> ist an sich eine feine Sache. Durch die zus\u00e4tzliche Abstraktionsschicht ist man so gut wie vollkommen <b>datenbankunabh\u00e4ngig<\/b>. Weiterhin hat man einen sauberen OOP Ansatz duchgehend im Projekt ohne h\u00e4ssliche SQL Statements dazwischengemischt zu haben. Es f\u00fchlt sich sehr &#8222;smooth&#8220; an und steigert &#8211; richtig gemacht &#8211; auch durchaus die Verst\u00e4ndlichkeit des Codes.<\/p>\n<p>Trotzdem bin ich nicht in allen Belangen gro\u00dfer Freund von ORM. Neulich hatte ich mit einer Tabelle zu tun, in der mehrere Millionen Tupel enthalten waren. Ein falsch platzierter Index oder der kleinste Fehler bei der Formulierung der Query f\u00fchrt dazu, dass man mehrere Minuten auf das Ergebnis der Abfrage warten darf. Noch schlimmer k\u00f6nnte auch gleich Filesort verwendet werden.Das f\u00fchrt bei einer derartigen Tabellengr\u00f6\u00dfe direkt mal dazu, dass die Platte komplett vollgeschrieben wird. Was hat diese Anekdote jetzt mit ORM zu tun? Bei <b>&#8222;kritischen&#8220; SQL-Statements<\/b> wird ein ORM nie so zielgerichtete Queries formulieren k\u00f6nnen, dass die Performance mit einer handgeschriebenen mithalten<br \/>\nk\u00f6nnte. Alles, was mehr ins Detail geht kann mit einem ORM sehr schnell haklig werden oder wird zumindest unverh\u00e4ltnism\u00e4\u00dfig komplizierter.<\/p>\n<p>Zum ORM-Pluspunkt &#8222;Unabh\u00e4ngigkeit von der Datenbankengine&#8220; l\u00e4sst sich erwidern, dass man mit <b>PDO<\/b> ohnehin mit dem \u00fcberwiegenden Teil der Datenbanken kommunizieren kann, ohne schmerzliche \u00c4nderungen bei einem DB-Wechsel vornehmen zu m\u00fcssen. Bleibt noch der zus\u00e4tzliche Installationsaufwand und Performanceverlust durch den &#8222;OOP-Overhead&#8220; bei der Verwendung von ORM h\u00e4ngen.<\/p>\n<p>Letztendlich darf ich dann noch eine neue Abfrage-Sprache lernen (etwa <a href=\"http:\/\/www.doctrine-project.org\/documentation\/manual\/1_2\/en\/dql-doctrine-query-language\">DQL<\/a>). Das kann man sicher alles verkraften und in Kauf nehmen, ich sag auch auf keinen Fall das von ORM generell abzuraten ist. Ich favorisiere daher eine <b>selbstgeschriebene ORM-L\u00f6sung<\/b> die man an den ben\u00f6tigten Stellen bequem anpassen und zum Einsatz bringen kann. Das erh\u00f6ht die Flexibilit\u00e4t merklich (individuelles Eingehen auf die vorliegende Situation), steigert die Perfomance (keinen nicht ben\u00f6tigten Ballast) und durch ein Aufsetzen auf PDO ist man letztendlich doch noch flexibel genug. <\/p>\n<p>Einen Ansatz dazu werde ich evtl. mal in naher Zukunft diskutieren.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>ORM ist an sich eine feine Sache. Durch die zus\u00e4tzliche Abstraktionsschicht ist man so gut wie vollkommen datenbankunabh\u00e4ngig. Weiterhin hat man einen sauberen OOP Ansatz duchgehend im Projekt ohne h\u00e4ssliche SQL Statements dazwischengemischt zu haben. Es f\u00fchlt sich sehr &#8222;smooth&#8220; &hellip; <a href=\"https:\/\/d-mueller.de\/blog\/ueber-orm\/\">Weiterlesen <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[9,5,10,3],"tags":[],"class_list":["post-155","post","type-post","status-publish","format-standard","hentry","category-datenbanken","category-software-engineering","category-performance","category-webdev"],"_links":{"self":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/155","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/comments?post=155"}],"version-history":[{"count":0,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/155\/revisions"}],"wp:attachment":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/media?parent=155"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/categories?post=155"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/tags?post=155"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}