Einzelnen Beitrag anzeigen
Alt 29.07.2009, 19:55  
Chriz
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.069
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

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.
__________________
"Nuschel ich?" - "Was?"

Geändert von Chriz (29.07.2009 um 20:02 Uhr).
Chriz ist offline