Chuỗi của bạn dài bao nhiêu?
Nếu chúng tương đối ngắn (ví dụ:từ tiếng Anh; avg_len =5) và bạn có bộ nhớ cơ sở dữ liệu dự phòng, hãy thử phương pháp này:
- Đối với mỗi từ bạn muốn lưu trữ trong bảng, thay vào đó hãy lấy mọi hậu tố có thể có của từ đó. Nói cách khác, bạn tiếp tục loại bỏ ký tự đầu tiên cho đến khi không còn lại gì. Ví dụ:từ
value
cho:-
value
-
alue
-
lue
-
ue
-
e
-
- Lưu trữ từng trong số các hậu tố này trong cơ sở dữ liệu.
- Bây giờ bạn có thể tìm kiếm các chuỗi con bằng cách sử dụng
LIKE 'alu%'
(sẽ tìm thấy 'alu' như một phần của 'giá trị').
Bằng cách lưu trữ tất cả các hậu tố, bạn đã loại bỏ nhu cầu về ký tự đại diện đứng đầu (cho phép một chỉ mục được sử dụng để tra cứu nhanh), với chi phí là không gian lưu trữ.
Chi phí lưu trữ
Số ký tự cần thiết để lưu trữ một từ trở thành word_len*word_len / 2
, tức là bậc hai trong độ dài từ, trên cơ sở mỗi từ. Đây là yếu tố gia tăng đối với các kích thước từ khác nhau:
- Từ gồm 3 chữ cái:
(3*3/2) / 3 = 1.5
- Từ gồm 5 chữ cái:
(5*5/2) / 5 = 2.5
- Từ gồm 7 chữ cái:
(7*7/2) / 7 = 3.5
- Từ gồm 12 chữ cái:
(12*12/2) / 12 = 6
Số hàng cần thiết để lưu trữ một từ tăng từ 1 lên word_len
. Hãy lưu ý đến chi phí này. Các cột bổ sung nên được giữ ở mức tối thiểu để tránh lưu trữ lượng lớn dữ liệu dư thừa. Ví dụ:số trang mà từ được tìm thấy ban đầu sẽ ổn (nghĩ là không dấu smallint), nhưng siêu dữ liệu mở rộng về từ đó nên được lưu trữ trong một bảng riêng trên cơ sở từng từ, thay vì cho từng hậu tố.
Cân nhắc
Có một sự đánh đổi ở chỗ chúng ta tách 'các từ' (hoặc các đoạn). Như một ví dụ trong thế giới thực:chúng ta làm gì với dấu gạch ngang? Chúng ta có lưu trữ tính từ five-letter
không là một hay hai từ?
Sự đánh đổi như sau:
- Không thể tìm thấy bất kỳ thứ gì bị chia nhỏ dưới dạng một phần tử duy nhất. Nếu chúng tôi lưu trữ
five
vàletter
riêng biệt, tìm kiếmfive-letter
hoặcfiveletter
sẽ thất bại. - Bất kỳ điều gì không phải chia nhỏ ra sẽ tốn nhiều dung lượng lưu trữ hơn. Hãy nhớ rằng yêu cầu lưu trữ tăng lên bậc hai về độ dài của từ.
Để thuận tiện, bạn có thể muốn xóa dấu gạch nối và lưu trữ fiveletter
. Từ bây giờ có thể được tìm thấy bằng cách tìm kiếm five
, letter
và fiveletter
. (Nếu bạn cũng loại bỏ dấu gạch ngang khỏi bất kỳ truy vấn tìm kiếm nào, người dùng vẫn có thể tìm thấy thành công five-letter
.)
Cuối cùng, có những cách lưu trữ mảng hậu tố không tốn nhiều chi phí, nhưng tôi chưa chắc liệu chúng có dịch tốt sang cơ sở dữ liệu hay không.