Колко дълги са вашите струни?
Ако те са сравнително кратки (напр. английски думи; avg_len=5) и имате свободно място за съхранение на база данни, опитайте този подход:
- За всяка дума, която искате да съхраните в таблицата, вместо това вземете всеки възможен суфикс на тази дума. С други думи, продължавате да премахвате първия знак, докато не остане нищо. Например думата
value
дава:value
alue
lue
ue
e
- Съхранявайте всеки от тези суфикси в базата данни.
- Вече можете да търсите поднизове с помощта на
LIKE 'alu%'
(което ще намери 'alu' като част от 'value').
Съхранявайки всички суфикси, вие премахнахте необходимостта от водещ заместващ знак (позволяващ използването на индекс за бързо търсене) за сметка на място за съхранение.
Разходи за съхранение
Броят на знаците, необходими за съхраняване на дума, става word_len*word_len / 2
, т.е. квадратично по дължината на думата, на база дума. Ето коефициента на увеличение за различни размери на думите:
- 3-буквена дума:
(3*3/2) / 3 = 1.5
- 5-буквена дума:
(5*5/2) / 5 = 2.5
- 7-буквена дума:
(7*7/2) / 7 = 3.5
- 12-буквена дума:
(12*12/2) / 12 = 6
Броят на редовете, необходими за съхраняване на дума, се увеличава от 1 до word_len
. Имайте предвид това режийно. Допълнителните колони трябва да бъдат сведени до минимум, за да се избегне съхраняването на големи количества излишни данни. Например номер на страница, на която първоначално е намерена думата, трябва да е добре (помислете за unsigned smallint), но обширните метаданни за думата трябва да се съхраняват в отделна таблица за всяка дума, а не за всеки суфикс.
Съображения
Има компромис в това, когато разделяме „думи“ (или фрагменти). Като пример от реалния свят:какво правим с тирета? Съхраняваме ли прилагателното five-letter
като една или две думи?
Компромисът е както следва:
- Всичко, което е разбито, не може да бъде намерено като единичен елемент. Ако съхраняваме
five
иletter
отделно, търсейкиfive-letter
илиfiveletter
ще се провали. - Всичко, което не счупен ще отнеме повече място за съхранение. Не забравяйте, че изискването за съхранение се увеличава квадратично в дължината на думата.
За удобство може да искате да премахнете тирето и да съхраните fiveletter
. Думата вече може да бъде намерена чрез търсене на five
, letter
и fiveletter
. (Ако премахнете тирета и от която и да е заявка за търсене, потребителите все още могат успешно да намерят five-letter
.)
И накрая, има начини за съхраняване на суфиксни масиви, които не водят до големи разходи, но все още не съм сигурен дали те се превеждат добре в бази данни.