Ich sehe es eher so, dass die Hälfte der zu übersetzenden Wörter fehlen. Das mit dem spiegelbildlich ist m.E. deswegen auch nicht ganz korrekt, weil manche Wörter in einigen Sprachen in anderen Sprachen gar nicht als Wort übersetzt werden (sondern als Suffix, Betonung etc.).
Ja, ich weiß. Über den Punkt sind wir eigentlich schon hinaus. Die nicht als Wort übersetzten bereiten mir auch etwas Kopfzerbrechen. Sie stehen oft als eingeklammerte Erklärung an der Stelle eines übersetzten Wortes. Darum kann ich nicht einfach alles, was eingeklammert ist, in die Tabelle für die Zusatzangaben verschieben. Aber das ist nur ein Problem für die Atomisierung der Angaben in den Tabellen für die Wörter und die Zusatzangaben. Das hat eigentlich nichts mit der Paarung der Schlüssel für die Übersetzungen zu tun, die sich ja in einer weiteren Tabelle befinden. Die Hälfte der zu übersetzenden Wörter fehlt dann, wenn die Tabelle in nur einer Richtung durchsucht wird. Wird sie in beide Richtungen durchsucht, dann fehlt genau keines. Darum wiederum soll meine Query in beiden Richtungen suchen.
Ich fände es so auch logischer - und das "etwas Zeit" würde ich hier nicht unterschätzen
Ich habe ein bißchen zur Optimierung gelesen. Vor allem JOIN und UNION scheinen Queries langsam zu machen. Nur meine vorherigen Versuche mit JOIN ohne Schlüssel oder einer Konstruktion aus Subqueries wären noch langsamer. Inzwischen dürfte sich die Query kaum noch schneller machen lassen. Schneller als ein UPDATE oder ein INSERT sollte auch eine komplexe SELECT-Query sowieso sein? Sie müßte jetzt halt nur noch Ergebnisse liefern. Was sie irgendwie nicht macht...
Eigentlich habe ich zur Optimierung etwas gelesen, um herauszufinden, ob sich die Stored Procedure, die meine Tabellen in normalisierte Tabellen umsortiert, schneller machen läßt. Die einzige Möglichkeit dazu wäre vielleicht jeweils hundert Einträge in einer Transaktion zusammenzufassen. Aber ein Cursor kann in SQL immer nur stur einen Datensatz nach dem anderen abarbeiten. Das heißt, der Umbau würde kompliziert. Wahrscheinlich muß ich eine Schleife um die vorhandene Schleife legen, zwei Variablen für einen LIMIT-Teil definieren und diese in der äußeren Schleife erhöhen. Die innere Schleife würde natürlich die beiden Cursor bei jedem Durchlauf neu ansetzen müssen. Das könnte auch schiefgehen und das Skript noch langsamer machen.
Ich würde nicht so vorgehen, weil es in deinem Modell kein sinnvolles Kriterium gibt, wann ein Wort in die Spalte ein_wort und wann ein Wort in die Spalte andere_wort einsortiert wird. In meinem Modell könnte man die Spalten vielleicht besser `suchwort` und `uebersetzung` nennen.
Zur Veröffentlichung benenne ich alles um. Vielleicht heißen die Spalten so. Vielleicht heißen sie Quetzal und Coatl. Ich bezweifle, daß sich das auf die Funktionsweise eines Programmes oder auch nur einer Query auswirkt. Die sollten eigentlich bezeichnungsinvariant sein. In meinem Modell gibt es deswegen kein sinnvolles Kriterium, welches Wort in welche Spalte kommt, weil es dafür objektiv kein sinnvolles Kriterium gibt. Bei einem zweisprachigem Wörterbuch hätte man natürlich schnell eines gefunden. Mein Wörterbuch, also die Tabelle Worte, enthält aber schon Wörter aus dem Deutschen, Englischen, Japanischen, Chinesischen (getrennt nach traditionell und vereinfacht), Türkischen, Niederländischen, Slowenischen, Russischen, Ungarischen, Afrikaans, Portugiesischen, Italienischen, Französischen und der obskuren Minderheitensprache Khasi. Die kann man nicht sinnvoll genau einer von zwei Spalten zuordnen. Es ist auch keine Beschränkung auf die genannten Sprachen vorgesehen. Die meisten Wörter stammen zwar aus Tabellen mit jeweils einer deutschen Übersetzung, aber manche sind nur mit japanischer Übersetzung vorhanden.
Will ich das alles mit deinem Modell erhalten, dann hängt dein Modell tatsächlich nur nochmal sämtliche Datensätze der Tabelle in spiegelbildlicher Form an die Tabelle an. Jede Aktualisierung müßte zweimal vorgenommen werden. Korrekturen sollen für häufige Aktualisierungen sorgen.
Ein FOREIGN KEY Constraint wird erst benötigt, wenn man z.B. verhindern möchte, dass nur Teile von verknüpften Datensätzen gelöscht werden.
Er verhindert also die Löschanomalie. Man kann die Normalisierung auch so erklären, daß damit die vier Anomalien (einfügen, löschen, ändern und aktualisieren) verhindert werden. Bei einer Anomalie geschehen die vorgenommenen Aktionen nur in einer Tabelle, obwohl sie auch andere Datensätze betreffen und daher dort Anpassungen vorgenommen werden müssen. Das heißt, die Normalisierung funktioniert erst mit dem FOREIGN KEY Constraint. Sonst war die gesamte für die Normalisierung getane Arbeit umsonst. Eine SELECT-Query fragt nur ab, was vorhanden ist, führt also nicht zu Anomalien. Das wollte ich auch nicht behauptet haben, sondern nur, daß die Normalisierung noch nicht abgeschlossen ist, solange der FOREIGN KEY Constraint noch fehlt. Trotzdem füge ich den noch nicht hinzu, weil ich befürchte, daß dadurch die Stored Procedure für die Normalisierung noch langsamer wird.
Ranma