Zur Navigation

Normalisierung von Datenbanktabellen [7]

am Beispiel von Datenbanktabellen für ein Wörterbuch

61 Ranma (Gast)

Erstmal ohne weitere Schleife habe ich eine Transaktion in meiner Stored Procedure ausprobiert. Theoretisch hätte sie dadurch schneller werden sollen. Besonders falls die bisherige Langsamkeit an I/O-Zugriffen gelegen hätte. Als Transaktion lief das Ganze jedoch nochmal viel langsamer ab! Ich mußte die Ausführung sogar abbrechen, weil sie vielleicht nie fertig geworden wäre.

Auf dem MySQL-Client-Programm für die Kommandozeile läuft die Stored Procedure ähnlich langsam wie über Adminer. Eine weitere Alternative zu Adminer und phpMyAdmin ist SQLBuddy, aber das ist nicht in der Lage Stored Procedures zu verwalten oder auch nur auszuführen. Die Entwicklung von SQLBuddy wurde schon vor einiger Zeit eingestellt.

Es kann eigentlich nur noch sein, daß meine CPU zu schwach ist. Normalerweise ist sie das am meisten überdimensionierte Teil an einem Computer. Also auf meiner Hardware wird das tatsächlich nichts mehr. Da bleibt nur noch ein Hoster, für den ich erstmal ein Programm brauche, das ich online stellen kann.

Einigermaßen schnell und sinnvoll sollte zu dem Zweck die Abfrage der schon vorhandenen Datensätze in den Tabellen für das Wörterbuch sein. Dafür müßte nur die Query Resultate liefern statt einfach nichts, nichtmal eine Fehlermeldung. Das Abfrageformular wird wieder angezeigt. Oha, ich muß erstmal die Verzweigung überprüfen.... (Wieder mal beim schreiben hier bemerkt...)
Ranma

30.12.2015 07:08

62 Ranma (Gast)

Ja, irgendetwas ist an der Verzweigung faul. Die eigentliche Query, also
SELECT W2.Sprache, W2.Wort, W2.Art, W2.Info
FROM Worte AS W1
INNER JOIN Kombis AS K
ON W1.id = K.ein_wort
INNER JOIN Worte AS W2
ON K.anderes_wort = W2.id
WHERE K.Kombi = 'trans'
AND W1.Wort = ?
UNION ALL SELECT W2.Sprache, W2.Wort, W2.Art, W2.Info
FROM Worte AS W1
INNER JOIN Kombis AS K
ON W1.id = K.anderes_wort
INNER JOIN Worte AS W2
ON K.ein_wort = W2.id
WHERE K.Kombi = 'trans'
AND W1.Wort = ?
funktioniert ganz gut.

Die Einschränkung auf bestimmte Sprachen habe ich vorerst aus dem WHERE-Teil herausgenommen. Erstmal soll es nur funktionieren, Modifikationen der Suchparameter kommen später dazu. Die Tabelle Kombis enthält bisher nur wenige Datensätze. Nicht zuletzt deshalb geht die Suche sehr schnell. Wahrscheinlich auch wegen dem beschränkten WHERE-Teil.

Für längere und langsamere Versionen der Query wäre es gut, wenn nur der Teil, der tatsächlich in beiden Subqueries anders ist, vereint werden könnte und der Rest nur einmal durchlaufen werden muß. Besteht diese Möglichkeit?

Vielleicht wäre es sinnvoll, nochmal drei Tabellen mit der gleichen Struktur anzulegen, um sie durch Benutzer oder Crawler befüllen zu lassen. Das soll vermeiden, daß diese zusätzlichen Datenquellen der Stored Procedure zur Umsortierung ins Gehege kommen. Wenn die Umsortierung fertig ist, müßten die Tabellen, die gleiche Aufgaben erfüllen, dann natürlich miteinander vereint werden. Aber dafür müßten sämtliche Schlüssel neue Werte bekommen, sonst wäre das Ergebnis nur ein großes Durcheinander.

Die Panne bei der Verzweigung hat mit der Absicherung des Formulars zu tun. Das ist ein eigenes Thema.
Ranma

31.12.2015 06:14

63 Ranma (Gast)

Vielleicht wäre es sinnvoll, nochmal drei Tabellen mit der gleichen Struktur anzulegen, um sie durch Benutzer oder Crawler befüllen zu lassen. Das soll vermeiden, daß diese zusätzlichen Datenquellen der Stored Procedure zur Umsortierung ins Gehege kommen.

Dafür müßte ich die abfragende Query auch noch erweitern. Dann muß man als Benutzer nicht warten bis die ganzen Prozeduren fertig sind, sondern kann wenigstens ein paar Ergebnisse erhalten.
Ranma

04.01.2016 01:53

Beitrag schreiben (als Gast)

Die Antwort wird nach der Überprüfung durch einen Moderator freigeschaltet.





[BBCode-Hilfe]