{"id":451,"date":"2010-12-27T15:24:56","date_gmt":"2010-12-27T14:24:56","guid":{"rendered":"https:\/\/d-mueller.de\/blog\/?p=451"},"modified":"2010-12-27T15:24:56","modified_gmt":"2010-12-27T14:24:56","slug":"lasst-die-datenbank-ihren-job-machen","status":"publish","type":"post","link":"https:\/\/d-mueller.de\/blog\/lasst-die-datenbank-ihren-job-machen\/","title":{"rendered":"Lasst die Datenbank ihren Job machen!"},"content":{"rendered":"<p>Oft schau ich mir Code an und sehe, dass Leute offenbar zu faul f\u00fcr vern\u00fcnftige SQL-Statements sind. Da wird eine extrem allgemein gehaltene Abfrage auf die Datenbank losgelassen, um dann im Nachklang mit PHP zu filtern \/ zu gruppieren. <b>Warum?<\/b> Die Datenbank ist doch zum rechnen und f\u00fcr genau so Aufgaben gedacht. Zudem ists auch noch viel performanter, die Datenbank einfach ihren Job erledigen zu lassen. Vielleicht programmieren gewisse Leute einfach viel zu gern PHP, als das sie sich von der Datenbank die Arbeit abnehmen lassen w\u00fcrden?<\/p>\n<p><h2>Berechnungen im SELECT<\/h2>\n<pre data-enlighter-language=\"sql\" class=\"EnlighterJSRAW\">\r\nSELECT price FROM product\r\n<\/pre>\n<pre data-enlighter-language=\"php\" class=\"EnlighterJSRAW\">\r\nwhile ($row = $sql-&gt;fetch())\r\n{\r\n    print $row[&#039;price&#039;] * 1.95583;\r\n}\r\n<\/pre>\n<p>Warum nicht einfach:<\/p>\n<pre data-enlighter-language=\"sql\" class=\"EnlighterJSRAW\">\r\nSELECT price*1.95583 AS europreis FROM product\r\n<\/pre>\n<p>Okay, jetzt nicht das beste Beispiel aber prinzipiell l\u00e4uft einem sowas \u00f6fter \u00fcber den Weg.<\/p>\n<h2>Datenbank-Konsistenz<\/h2>\n<p>Ich kann auch nicht verstehen, warum die Leute alle die absolut geilen InnoDB-Features au\u00dfen vor lassen. Foreign Keys zum Beispiel. Da werden dann in Cronjobs abenteuerliche Abfragen auf die Datenbank abgesetzt, um die Konsistenz wieder herzustellen. Ein gut gew\u00e4hltes Fremdschl\u00fcssel-Datenmodell erledigt sowas doch, daf\u00fcr ist es gemacht!<\/p>\n<h2>Transactions<\/h2>\n<p>Auch sehr gern gesehen: Menschen programmieren selbst eine Rollback-Funktionalit\u00e4t, um fehlgeschlagene Abfragen revidieren zu k\u00f6nnen. Da werden dann Arrays mit wiederherzustellenden Werten angelegt, falls eine Abfrage nicht klappt. Daf\u00fcr gibt es doch Transaktionen! Die k\u00f6nnen genau das und zwar wesentlich besser. Au\u00dferdem kann man <a href=\"http:\/\/blogs.sitepoint.com\/2010\/12\/15\/mysql-transactions-php-emulation\/\">Transaktionen garnicht vollst\u00e4ndig emulieren<\/a>.<\/p>\n<h2>Validierung<\/h2>\n<p>Viel zu selten benutzt: <a href=\"http:\/\/dev.mysql.com\/doc\/refman\/5.1\/de\/constraint-enum.html\">Enum und Set<\/a>. Warum nicht die M\u00f6glichkeit nutzen, nur bereits vordefinierte Werte zuzulassen? Das ist immerhin die wasserdichteste Variante, um sicherzustellen, dass nur zugelassene Werte in der Datenbank landen.<\/p>\n<h2>Wertepr\u00fcfung<\/h2>\n<p>Im Artikel <a href=\"https:\/\/d-mueller.de\/blog\/mysql-inputvalidierung-mit-triggern\/\">MySQL Inputvalidierung mit Triggern<\/a> stelle ich einen Weg vor, wie man mittels Triggern erreichen kann, dass nur gewisse Wertebereiche in Tabellen eingef\u00fcgt werden d\u00fcrfen. Daran scheiden sich allerdings die Geister, ob man das zur &#8222;best practice&#8220; ernennen sollte, weil Trigger &#8222;versteckt&#8220; auf der Datenbank agieren und f\u00fcr ordentlich Verwirrung sorgen k\u00f6nnen.<\/p>\n<h2>Datumsberechnungen<\/h2>\n<p>Oft brechen sich Programmierer auch die Wurst mit <i>strtotime, date und mktime<\/i> ab, um Daten zu updaten. MySQL bringt aber hier &#8211; genau wie alle anderen ernstzunehmenden DBMS auch &#8211; <a href=\"http:\/\/dev.mysql.com\/doc\/refman\/5.5\/en\/date-and-time-functions.html\">wunderbare Zeitfunktionen<\/a> mit. Weiterer Vorteil dabei: Man ist nicht mehr darauf angewiesen, dass die Zeit des Datenbankservers und des Webservers sekundengenau gleich eingestellt ist, weil alle Zeitberechnungen nur noch auf Datenbankseite erledigt werden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Oft schau ich mir Code an und sehe, dass Leute offenbar zu faul f\u00fcr vern\u00fcnftige SQL-Statements sind. Da wird eine extrem allgemein gehaltene Abfrage auf die Datenbank losgelassen, um dann im Nachklang mit PHP zu filtern \/ zu gruppieren. Warum? &hellip; <a href=\"https:\/\/d-mueller.de\/blog\/lasst-die-datenbank-ihren-job-machen\/\">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":[4,9,5,10,3],"tags":[],"class_list":["post-451","post","type-post","status-publish","format-standard","hentry","category-php","category-datenbanken","category-software-engineering","category-performance","category-webdev"],"_links":{"self":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/451","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=451"}],"version-history":[{"count":0,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/posts\/451\/revisions"}],"wp:attachment":[{"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/media?parent=451"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/categories?post=451"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/d-mueller.de\/blog\/wp-json\/wp\/v2\/tags?post=451"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}