Hallo,
ob es sich um wenige oder viel Datensätze handelt ist für eine Datenbankoptimierung erstmal nicht entscheidend. Schliesslich könnte es ja sein, dass ihr die Suche einmal erweitern wollt, da sollte das Datenbankschema dann schon solide sein.
Zum Thema Normalisierung kannst du dich mal hier einlesen, falls es für dich in Frage kommt:
Normalisierung (Datenbank) – Wikipedia
Schreibvarianten abfangen kannst du mit Levenshtein oder Soundex. Die Levenshtein-Distanz:
Levenshtein-Distanz – Wikipedia
errechnet, wieviele Buchstaben-Tausch- oder -Verschiebeoperationen nötig sind, um von Wort A zu Wort B zu gelangen. Von Spass-Buch zu Spaßbuch wären es 3 (oder 4 für Groß-Kleinschreibung, beachtest du aber nicht), also relativ wenig gemessen an der Länge des Wortes. Natürlich kannst du auch automatisch in die Suche eine "ss" -> "ß", "ä" => "ae", .. Konvertierung vornehmen. Die Volltextsuche der Suchmaschine scheidet aus, da es ja Schlagwörter und keine langen Texte sind. Soundex() berechnet für jedes Wort einen Klangwert, so daß Meyer und Meier beispielsweise einen gleichen Soundex-Wert bekommen. Levenshtein ist allerdings noch nicht in MySQL implementiert soweit ich weiß. Daher könnte vielleicht das hier für dich interessant sein:
codejanitor Levenshtein Distance as a MySQL Stored Function
Die Datenbank normalisiert könnte nun so aussehen:
Code:
author
id | name
book
id | title
publisher
id | title
term
id | term | soundex_value
book_has_publisher
book_id | publisher_id
book_has_author
book_id | author_id
book_has_term
book_id | term_id
Eine Soundex-Anfrage könnte dann so lauten:
Code:
SELECT title
FROM term AS t
INNER JOIN book_has_term AS bt
bt.term_id = t.id
INNER JOIN book AS b
ON bt.book_id = b.id
WHERE SOUNDEX('Spass') SOUNDS LIKE t.soundex_value
GROUP BY b.id
Das Ergebnis, eine Liste von Büchern, denen Schlagwörter zugeordnet sind, die wie "Spass" klingen.