我们有高流量的新闻网站,我想添加一个功能,每个用户都可以搜索网站的所有内容,例如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
,上述表格之间是独一无二的。当插入每种类型的新内容时,我也应该INSERT
将其放入full_text_search
表格中。
问题
- 对于一天的许多插入(所有类型大约 3000 个),这是一个好的解决方案还是反模式?
- 如果我将此表与其他表分开并将其放入任何其他数据库(例如其他 RDBMS 或 NoSQL)中,这是更好的选择吗?
- 还有其他解决方案吗?
当然,可以将可搜索的内容复制到您的 full_text_search 表中。
MySQL 仅在 MyISAM 存储引擎中支持 FULLTEXT 索引(直到 MySQL 5.6,但 MySQL 5.6 中的 InnoDB 中的全文似乎仍然有点不稳定)。因此,您可以将规范数据存储在 InnoDB 中以确保安全,并将副本存储在 MyISAM 中以进行索引。MyISAM 容易受到数据损坏的影响,但如果它只是一个副本,那么如果它被损坏,您只需要重新填充 MyISAM 表。
您将 master_id 与每个表的主键不同的使用有点奇怪。为什么不使用主键,并在您的 full_text_search 表中添加另一列以获取内容类型?
另一种选择是在另一种专业技术(例如 Sphinx Search 或 Apache Solr)中创建全文搜索索引。但同样的模式也很有用——存储主键字段和内容类型的字段。