Tìm kiếm toàn văn qua nhiều bảng trong MySQL


7

Chúng tôi có các trang web tin tức giao thông cao, tôi muốn thêm một tính năng mà mọi người sử dụng có thể tìm kiếm thông qua khắp nội dung của trang web, chẳng hạn như news, polls, comments, galleries, vv. Mỗi loại nội dung có (các) bảng riêng.

Tôi quyết định tạo một bảng chứa tất cả các nội dung từ tất cả các loại:

CREATE TABLE full_text_search
(
    master_id INT NOT NULL,
    content_text TEXT NOT NULL,
    PRIMARY KEY ( master_id )
);

Tôi tạo một số duy nhất master_idcho từng nội dung của tất cả các loại để xác định từng loại content_texttrong full_text_searchbảng.

ví dụ:

News table:
+----+-------------+---------+---------+----------+------------+
| id | news_title  | lead    | subtitle|  content | master_id  |
+----+-------------+---------+---------+----------+------------+
|  1 |  sometitle  |some lead| subtitle|content 1 |     3      |
|  2 |  some title |some lead| subtitle|content 2 |     5      |
+----+-------------+---------+---------+----------+------------+

article table:
+----+-------------+---------+------------------+---------+------------+
| id | title       | author  | short description| content | master_id  |
+----+-------------+---------+------------------+---------+------------+
|  1 |  sometitle  | someone | very short desc  |content1 |     1      |
|  2 |  some title | otherone|  some short desc |content2 |     4      |
+----+-------------+---------+------------------+---------+------------+

Như bạn có thể thấy master_idlà duy nhất giữa các bảng trên. Khi bao giờ một nội dung mới từ mỗi loại được chèn, tôi cũng nên đưa INSERTnó vào full_text_searchbảng.

CÂU HỎI

  • Đối với nhiều chèn trong một ngày (khoảng 3000 từ tất cả các loại), đó là một giải pháp tốt hay nó là mô hình chống?
  • Có phải là sự lựa chọn tốt hơn nếu tôi tách bảng này khỏi các bảng khác của mình và đặt nó vào bất kỳ DB nào khác như RDBMS hoặc NoQuery khác không?
  • Bất kỳ giải pháp nào khác?

Với full_text_search-table, làm thế nào bạn sẽ xác định kết quả chính xác với loại và id chính xác?
Oskar Persson

1
Tôi đã chỉnh sửa câu hỏi của tôi.
Arash Mousavi

Câu trả lời:


3

Chắc chắn, thật tốt khi sao chép nội dung có thể tìm kiếm vào bảng full lòng_search của bạn.

MySQL chỉ hỗ trợ các chỉ mục FULLTEXT trong công cụ lưu trữ MyISAM (cho đến MySQL 5.6, nhưng toàn văn bản trong InnoDB trong MySQL 5.6 vẫn có vẻ không ổn định). Vì vậy, bạn có thể lưu trữ dữ liệu chính tắc của mình trong InnoDB để đảm bảo an toàn và một bản sao trong MyISAM để lập chỉ mục. MyISAM dễ bị hỏng dữ liệu, nhưng nếu đó chỉ là một bản sao thì bạn chỉ cần sao lưu bảng MyISAM nếu nó bị hỏng.

Việc bạn sử dụng master_id khác với khóa chính của mỗi bảng là hơi lạ. Tại sao không sử dụng khóa chính và thêm một cột khác vào bảng full lòng_search của bạn cho loại nội dung?

CREATE TABLE full_text_search
(
    id INT NOT NULL,
    content_type ENUM('news','polls','comments','galleries','articles') NOT NULL,
    content_text TEXT NOT NULL,
    PRIMARY KEY ( id, content_type )
);

full_text_search table:
+----+--------------+---------------+
| id | content_type | content_text  |
+----+--------------+---------------+
|  1 |         news |     ...       |
|  1 |     articles |     ...       |
|  2 |     articles |     ...       |
+----+--------------+---------------+

Một tùy chọn khác là tạo chỉ mục tìm kiếm toàn văn bản trong một công nghệ chuyên dụng khác như Sphinx Search hoặc Apache Solr. Nhưng mẫu tương tự sẽ hữu ích - lưu trữ trường khóa chính trường cho loại nội dung.


1
Tôi đã đọc cuốn sách của bạn SQL Antipatterns: Avoiding the Pitfalls of Database Programming. Trong phần "Hiệp hội đa hình" mà bạn đã nói trong MySQL, chúng ta không thể có liên kết đa hình, trong tôi muốn có khóa ngoại cho bảng này, tôi nên có "Bảng siêu chung", master_id là id được tạo bởi siêu phổ biến này bàn.
Arash Mousavi

1
Vậy thì tại sao không sử dụng master_id đó làm khóa chính trong mỗi bảng phương tiện, như các ví dụ tôi hiển thị trong sách của mình? :-) Lý do chính đáng để làm điều đó là thực tế là việc tra cứu khóa chính hiệu quả hơn so với tra cứu khóa phụ trong công cụ lưu trữ InnoDB.
Bill Karwin

Nhìn vào việc tự làm điều này để tôi có thể thực hiện tìm kiếm toàn văn bản bằng cách kết hợp dữ liệu từ nhiều bảng. Tạo một bảng mới dường như là câu trả lời.
Daniel West
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.