Ara*_*avi 7 mysql nosql rdbms database-design full-text-search
我们有高流量的新闻网站,我想添加一个功能,每个用户都可以搜索网站的所有内容,例如news
,polls
,comments
,galleries
,等。每种内容类型都有自己的表。
我决定创建一个包含所有类型的所有内容的表:
CREATE TABLE full_text_search
(
master_id INT NOT NULL,
content_text TEXT NOT NULL,
PRIMARY KEY ( master_id )
);
Run Code Online (Sandbox Code Playgroud)
我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 |
+----+-------------+---------+------------------+---------+------------+
Run Code Online (Sandbox Code Playgroud)
如您所见master_id
,上表之间是唯一的。当插入每种类型的新内容时,我也应该INSERT
其放入full_text_search
表格中。
当然,可以将可搜索内容复制到 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 | ... |
+----+--------------+---------------+
Run Code Online (Sandbox Code Playgroud)
另一种选择是使用另一种专业技术(例如 Sphinx Search 或 Apache Solr)创建全文搜索索引。但相同的模式很有用——存储主键字段和内容类型字段。