ChrisB: Vorschlag: UNIQUE-Index nicht über text, sondern hash(text)?

Beitrag lesen

Hi,

Ich möchte gerne in einer MySQL Tabelle einen Unique Index über 3 Spalten setzen.
Dabei kommt aber diese Meldung

1071 Specified key was too long; max key length is 1000 byte

Dann benötigst Du wieder den guten alten "Matchcode"

Dafür hat man von den betroffenen Spalten immer nur die ersten paar (relevanten) Zeichen in den Index einbezogen. Das kann MySQL auch.

Die Frage ist nur, wie hilfreich das ist, wenn es um einen UNIQUE-Index geht.

Wenn du von “The quick brown fox jumps over the lazy dog” nur die ersten zehn Zeichen berücksichtigst, ist das für einen zum Suchen gedachten Index sicher ausreichend.

Davon, den Eintrag “The quick brown fox jumps over the lazy dog” ein zweites mal einzutragen, hält es mich aber nicht ab - und das ist aber das, was man mit einem UNIQUE-Index wohl erreichen möchte.

Deshalb würde ich in einem solchen Fall, wo man die UNIQUE-Eigenschaft über längere Texte braucht, vorschlagen, den MD5-Wert dieses langen Textes in einer zusätzlichen Spalte abzulegen - und *darauf* den UNIQUE-Index zu setzen. Die sehr geringe Kollisionsgefahr sollte m.E. ausreichen, um das zweimalige Eintragen eines Textes zu verhindern - ohne sich schädlich auszuwirken, in dem zwei Texte für gleich gehalten werden, die es nicht sind. (Wenn man diesbezüglich Bedenken hat, kann man auch noch einen „besseren“ Hash-Algorithmus als MD5 wählen.)

Dieser Mechanismus ist natürlich wirkungslos, wenn „irgendwer“ Einträge per SQL-Statement machen darf - und den Hashwert beim Eintragen einfach nicht oder irgendwas dafür angibt. Aber innerhalb einer geschlossenen Applikation sollte der Ansatz m.E. durchaus brauchbar sein.

Und wenn man ganz auf Nummer sicher gehen will - dann kann man in dem Fall, wo der Hashwert eine Verletzung des Unique Index ergibt, ja auch noch explizit prüfen, ob die Texte wirklich 1:1 mit einem vorhandenen Eintrag identisch sind - wenn das nicht der Fall ist, dann muss man den Eintrag halt noch mal machen, und dabei irgendetwas anderes statt des MD5-Hashes eintragen (der ja sonst keinerlei Bedeutung hat). Das wäre zumindest immer noch performanter, als diese Prüfung bei jedem neuen Eintrag auf Verdacht vorzunehmen.

MfG ChrisB

--
RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?