Temos sites de notícias de alto tráfego, quero adicionar um recurso que cada usuário pode pesquisar em todo o conteúdo do site, como news
, polls
, comments
, galleries
etc . Cada tipo de conteúdo tem sua(s) própria(s) tabela(s).
Decidi criar uma tabela que contém todo o conteúdo de todos os tipos:
CREATE TABLE full_text_search
(
master_id INT NOT NULL,
content_text TEXT NOT NULL,
PRIMARY KEY ( master_id )
);
Eu gero um número único master_id
para cada conteúdo de todos os tipos para identificar cada um content_text
na full_text_search
tabela.
por exemplo:
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 |
+----+-------------+---------+------------------+---------+------------+
Como você pode ver master_id
, é único entre as tabelas acima. Sempre que um novo conteúdo de cada tipo é inserido, também devo inseri- INSERT
lo na full_text_search
tabela.
PERGUNTAS
- Para muitas inserções por dia (cerca de 3000 de todos os tipos), é uma boa solução ou é anti-padrão?
- É uma escolha melhor se eu separar esta tabela das minhas outras tabelas e colocá-la em qualquer outro banco de dados, como outro RDBMS ou NoSQLs?
- Quaisquer outras soluções?
Claro, não há problema em copiar o conteúdo pesquisável para sua tabela full_text_search.
O MySQL suporta índices FULLTEXT apenas no mecanismo de armazenamento MyISAM (até o MySQL 5.6, mas fulltext no InnoDB no MySQL 5.6 ainda parece um pouco instável). Assim, você pode armazenar seus dados canônicos no InnoDB para segurança e uma cópia no MyISAM para indexação. MyISAM é suscetível à corrupção de dados, mas se for apenas uma cópia, você só precisa preencher novamente a tabela MyISAM se ela for corrompida.
Seu uso de master_id como distinto da chave primária de cada tabela é um pouco estranho. Por que não usar a chave primária e adicionar outra coluna à sua tabela full_text_search para o tipo de conteúdo?
Outra opção é criar um índice de pesquisa de texto completo em outra tecnologia especializada, como Sphinx Search ou Apache Solr. Mas o mesmo padrão seria útil -- armazene o campo de chave primária e um campo para o tipo de conteúdo.