Jak długie są twoje struny?
Jeśli są stosunkowo krótkie (np. angielskie słowa; avg_len=5) i masz wolne miejsce w bazie danych, wypróbuj następujące podejście:
- Dla każdego słowa, które chcesz zapisać w tabeli, zamiast tego weź każdy możliwy przyrostek tego słowa. Innymi słowy, usuwasz pierwszy znak, aż nic nie zostanie. Na przykład słowo
value
daje:value
value
lue
ue
e
- Przechowuj każdy tych przyrostków w bazie danych.
- Możesz teraz wyszukiwać podciągi za pomocą
LIKE 'alu%'
(który znajdzie „alu” jako część „value”).
Przechowując wszystkie przyrostki, usuniesz potrzebę używania wiodącego symbolu wieloznacznego (pozwalając na użycie indeksu do szybkiego wyszukiwania), kosztem miejsca do przechowywania.
Koszt przechowywania
Liczba znaków wymagana do przechowania słowa to word_len*word_len / 2
, tj. kwadratowa długość słowa, w przeliczeniu na słowo. Oto współczynnik wzrostu dla różnych rozmiarów słów:
- Słowo trzyliterowe:
(3*3/2) / 3 = 1.5
- 5-literowe słowo:
(5*5/2) / 5 = 2.5
- 7-literowe słowo:
(7*7/2) / 7 = 3.5
- 12-literowe słowo:
(12*12/2) / 12 = 6
Liczba wierszy wymaganych do przechowywania słowa wzrasta z 1 do word_len
. Uważaj na to obciążenie. Dodatkowe kolumny należy ograniczyć do minimum, aby uniknąć przechowywania dużych ilości nadmiarowych danych. Na przykład numer strony, na której pierwotnie znaleziono słowo, powinien być w porządku (pomyśl unsigned smallint), ale obszerne metadane dotyczące słowa powinny być przechowywane w osobnej tabeli dla poszczególnych słów, a nie dla każdego przyrostka.
Rozważania
Istnieje kompromis polegający na tym, że dzielimy „słowa” (lub fragmenty). Jako przykład ze świata rzeczywistego:co robimy z myślnikami? Czy przechowujemy przymiotnik five-letter
? jako jedno lub dwa słowa?
Kompromis jest następujący:
- Czegokolwiek, co jest podzielone, nie można znaleźć jako pojedynczego elementu. Jeśli przechowujemy
five
iletter
osobno, wyszukującfive-letter
lubfiveletter
nie powiedzie się. - Wszystko, co nie rozbite zajmie więcej miejsca do przechowywania. Pamiętaj, że długość słowa zwiększa się kwadratowo.
Dla wygody możesz usunąć myślnik i zapisać fiveletter
. Słowo można teraz znaleźć, wyszukując five
, letter
i fiveletter
. (Jeśli usuniesz również myślniki z dowolnego zapytania wyszukiwania, użytkownicy nadal będą mogli z powodzeniem znaleźć five-letter
.)
Wreszcie, istnieją sposoby przechowywania tablic sufiksów, które nie wiążą się z dużym obciążeniem, ale nie jestem jeszcze pewien, czy dobrze przekładają się na bazy danych.