トラフィックの高いNEWS Webサイトがあります。news
、polls
、comments
、galleries
など、すべてのユーザーがサイトのすべてのコンテンツを検索できる機能を追加したいと思います。コンテンツタイプごとに独自のテーブルがあります。
すべてのタイプのすべてのコンテンツを保持するテーブルを作成することにしました。
CREATE TABLE full_text_search
(
master_id INT NOT NULL,
content_text TEXT NOT NULL,
PRIMARY KEY ( master_id )
);
master_id
テーブルの各content_text
を識別するために、すべてのタイプのコンテンツごとにfull_text_search
として一意の番号を生成します。
例えば:
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 |
+----+-------------+---------+------------------+---------+------------+
ご覧のとおり、master_id
は上記のテーブル間で一意です。各タイプの新しいコンテンツが挿入されると、full_text_search
テーブルにINSERT
を挿入する必要があります。
もちろん、検索可能なコンテンツをfull_text_searchテーブルにコピーしても問題ありません。
MySQLはMyISAMストレージエンジンでのみFULLTEXTインデックスをサポートします(MySQL 5.6までは、MySQL 5.6のInnoDBのフルテキストはまだ少し不安定に見えます)。安全のために標準データをInnoDBに保存し、インデックス作成のためにMyISAMにコピーを保存できます。 MyISAMはデータ破損の影響を受けやすいですが、それがコピーだけの場合は、MyISAMテーブルが破損した場合にそれを再設定する必要があります。
各テーブルの主キーとは異なるmaster_idの使用は少し奇妙です。主キーを使用せず、コンテンツのタイプに応じてfull_text_searchテーブルに別の列を追加してみませんか?
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 | ... |
+----+--------------+---------------+
別のオプションは、Sphinx SearchやApache Solrなどの別の特殊なテクノロジーで全文検索インデックスを作成することです。しかし、同じパターンが役立ちます-主キーフィールドを格納しますandコンテンツのタイプのフィールド。