|
|||||||||||||||||||||||
Aktuell Texte Der Comic Impressum Kalender Suche PHP-Klassen Container-Wizard main.s21 |
|||||||||||||||||||||||
Kategorien
{{login}}
|
MySQL ist rehabilitiert
Heute habe ich mir die MySQL 5.0 heruntergeladen und installiert, und sofort zwei wichtige Kriterien überprüft. JOIN mit USINGFrühere MySQL-Versionen scheiterten daran, eine <tabelle1> JOIN <tabelle2> USING <schlüssel> ordentlich hinzubekommen. Der wesentliche Vorteil von join...using gegenüber join ... ON ist, dass es zum einen wesentlich kürzer ist und zum anderen der Schlüssel selbst nicht mehr ambig ist. Nicht so unter MySQL, das USING lediglich als Alias für ein intern zu JOIN ... ON verwendete, ohne zu berücksichtigen, dass der Schlüssel nicht mehr ambig war. Er musste folglich im SELECT-Bereich der Abfrage explizit mit <tabelle1>.<schlüssel> angesprochen werden - lästig. Das Ergebnis ist sehr gut: es funktioniert. Somit habe ich hier generell den gleichen Komfort wie unter PostgreSQL. Nested JOINSSeitdem ich mit Postgresql arbeite, wird normalisiert, was nur sinnvoll normalisiert werden kann, und dem Nutzer als fehlerunträchtiges Dropdown präsentiert. Ein kleines, einleuchtendes Beispiel sind Titel. Eine Person hat einen akademischen Titel (Prof. Dr.), den man zur Anrede verwendet (Sehr geehrter...). Auf einem Brief schreibt man aber gerne eine längere Variante: "Prof. Dr. rer. nat.". Es gibt auch Titel wie "Diplom-Grafikdesigner" oder "Philologe MA", die keinen Anredentitel haben, aber auch ihren Platz auf Visitenkarten finden. Die dümmstmögliche Variante - und ja, ich habe sie sehen müssen - sind zwei Varchar-Felder pro Person, für den langen und den kurzen Titel. Das ist natürlich gruselig; nicht nur, dass man alle möglichen richtig und falsch geschriebenen Varianten von "Filologe MA" wird finden müssen, sondern es kann so natürlich auch vorkommen, dass zwei widersprüchliche Titel eingetragen sind, etwa "Dr." aber "Prof. Dr. rer. nat.". Naheliegend ist es, eine Liste mit Langtiteln zu führen, die Kurztitel implizieren. Dazu erstellt man zwei Tabellen, eine mit Langtiteln, die per Fremdschlüssel mit einer Kurztiteltabelle verbunden ist. Es wird ein "Prof. Dr. rer. nat" erstellt und ihm der "Prof. Dr." zugewiesen. In einer Auswahlliste erscheinen nur die Langtitel, aus denen der eingebende Benutzer einen auswählen kann. Nehmen wir vier Tabellen an: GeschlechtCREATE TABLE "benchmarking"."l_gender" ( Kurzitel (Anredentitel)CREATE TABLE "benchmarking"."l_title" ( Langtitel (Brieftitel)CREATE TABLE "benchmarking"."l_addresstitle" ( PersonenCREATE TABLE "benchmarking"."d_person" ( Ich erstelle zwei Geschlechter, zwei Kurztitel (Prof. Dr. und Dr.) sowie mehrere Langtitel, denen ich passende Kurztitel bzw. gar nichts zuweise. Wenn ich einige Personen eingetragen habe, kann ich mit den Abfragen beginnen: select dp_name, dp_surname from d_person - für die Personen. Frühere Versionen reagierten hier mit einem schnöden #1054 - Unknown column '<datenbank>.l_title.lat_id' in 'on clause' . Aber erst wenn man solche Abfragen formulieren kann, ist man frei, die Datenbank so zu entwerfen, wie es das Konzept einer relationalen Datenbank vorsieht. FazitMit 5.0 macht MySQL einen gewaltigen Sprung nach vorne, dabei bin ich noch nicht sonderlich auf Views und Stored Procedures eingegangen. Sichten sind vor allem praktisch, um eine grosse Abfrage in mehrere kleine Abfragen zu unterteilen, die nachher zusammengefügt werden oder um einem Frontend SQL-Formulierungsarbeit abzunehmen. Ich verwende Sichten vor allem als vorgefertigte Abfragen, die durch Nutzereingaben parametrisiert werden können. KommentierenBitte beachten: Kommentare sind nicht sofort sichtbar, sondern werden erst nach einer kurzen Prüfung freigegeben, sofern keine rechtliche Beanstandung vorliegt. |