select * from bar where text like "foo"
with tags Quählkot -Nachdem ich heute mal wieder etwas an pyChaos HTML-Ausgabe (ja die ist nur rudimentär vorhanden und potthässlich) rumgeschraubt habe, bin ich mal wieder auf ein einfaches Problem gestoßen.
Beim Versuch die referenzierenden Facts auf der jeweiligen Fact-Seite anzuzeigen, habe ich erstmal eine wirklich hässliche Lösung gebaut, die wohl jedem kalte Schauer über den Rücken jagt der schon einmal ernsthaft mit Datenbanken gearbeitet hat.
Für jede generierte Seite, frage ich bei diesem Ansatz alle Facts ab, die die ID des aktuellen Facts im Text enthalten.
Wenn ich z.B. Fact #1 abfrage, erzeugt das also eine Abfrage wie "select fid from fact where text like '%#1%'". Das wäre an sich schon ziemlich schlimm, dadurch dass ich aber noch verschiedene Varianten abfrage, wodurch dieser Text eingeschränkt sein könnte (z.B. um nur Ergebnisse für #1 und nicht #1987 zu finden) muss die Datenbank diese Suche sogar noch mehrmals ausführen.
Wenn ich also 16 Varianten abfrage (SQLite unterstützt ja von Haus aus keine Regexpressions), geht die Datenbank alle Texte 16 mal durch und sucht nach diesem String.
Dadurch dass ich auch ein % am Anfang der Abfrage habe wird die Sache noch schlimmer: selbst ein Index über dieses Feld kann mir nun nicht mehr helfen, wie soll man auch einen binären Baum durchsuchen, wenn man nicht weiß wo man anfangen soll?
Das Ergebniss dieser dämlichsten aller Grundideen sieht man dann, wenn pyChao beim Start erstmal alle Seiten generiert. Wartezeiten von einer Minute für ein paar Tausend Dateien sind keine Seltenheit.
Die sinnvollere Lösung wäre natürlich einfach: Ich brauche eine weitere Tabelle, in der ich die Relationen zwischen den Facts abspeicher. Dann wird es plötzlich möglich diese Abfrage über einen einzigen Durchgang eines Indizierten Feldes mit = statt like zu holen.
SELECT fid from fact_refs_fact where reference = '1';
Dies erzeugt dann zwar beim Schreiben eines Facts minimal mehr Aufwand, sollte das Abfrageverhalten jedoch um einige Potenzen beschleunigen.
Was mir an dieser Stelle auch mal wieder aufgefallen ist: Ich kann mich nicht erinnern dass ich derartiges jemals während meiner Berufsausbildung oder meines Stuiums gehört zu haben.
Natürlich geht es hier nicht gerade um ein Thema dass so hochwissenschaftlich ist dass man es sich niemals selbst erarbeite könnte, doch imho sollte es DRINGEND in einem Fach namens Datenbanksysteme angeschnitten werden. An der FH-Zwickau scheint man dies jedoch nicht für nötig zu halten, weder an eine Vorlesung in der mal erwähnt wurde dass Datenbanken intern ihre Indices so organisieren, noch an irgendeine andere Vorlesung mit Theoretischen Hintregründen zu diesem Thema kann ich mich erinnern.
Wahrscheinlich war unser Lehrplan einfach bereits mit Vorlesungen in denen wir lernen mussten erstmal mit COBOL klarzukommen (der Hauptinhalt der Vorlesung Datenbanksysteme, in Erweiterungen zu diesem Fach wurde dann die grundsätzliche Verwendung von Oracle und ähnlichem besprochen statt irgendwas zu vertiefen) vollgestopft, dass uns keine Zeit mehr blieb überhaupt irgendwas sinnvolles damit zu tun.
Aber ich habe ja auch schon mehrmals festgestellt dass ein Abschluss von der FH Zwickau in diesem Fachbereich absolut nichtssagend betreffs der Fähigkeiten eines Studenten ist.
Importierte/Alte Kommentare:
#1207: 13.Mar.2009 05:03 von fwolf
Glaub mir: Das ist nicht nur bei der FH Zwicksau so ;)
cu, w0lf.
#1208: 13.Mar.2009 05:03 von fwolf
ups .. wie ist denn da das 's' mit reingerutscht?
cu, w0lf.
#1209: 13.Mar.2009 05:03 von Dr. Azrael Tod
Ich habs für Absicht gehalten^^