我正在向我的微博网络应用程序添加“标签支持”。像 twitter、google+、facebook 和 co。我的应用用户可能会在他们的消息中添加主题标签。Hashtags 被转换为指向列出所有相关消息的搜索页面的 html 锚点。现在我还想展示“Trending Hashtags”。
消息与 user_id 和一些 meta_data 一起保存在 MySQL 表 (InnoDB) 中。
我正在考虑以下处理趋势 HT 的方法:
从消息中提取主题标签;
<?php preg_match_all( '/(#\w[\w\d]+)/', $message, $ht_matches ); $hashtags = array_unique($ht_matches[1]); $hashtags_str = implode( ' ', $hashtags );
将它们保存在 db 记录中的单独行中(空格分隔的字符串);
e.g. #SanFrancisco #Boeing777 #AirplaneAccident --- --- Table 'messages' --- +----+------------+--------------------------------------------+-----+ | id | message | hashtag | ... | +----+------------+--------------------------------------------+-----+ | 1 | ... | #SanFrancisco #Boeing777 #AirplaneAccident | ... | +----+------------+--------------------------------------------+-----+
如果不存在,则将每个主题标签与元数据一起存储在单独的表中;
--- --- Table 'message_hashtags' --- +----+---------------------+------------+---------------------+---------------------+ | id | hashtag | messages | created_at | updated_at | +----+---------------------+------------+---------------------+---------------------+ | 1 | #SanFrancisco | 1465 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | +----+---------------------+------------+---------------------+---------------------+ | 2 | #Boeing777 | 294 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | +----+---------------------+------------+---------------------+---------------------+ | 3 | #AirplaneAccident | 1721 | 0000-00-00 00:00:00 | 0000-00-00 00:00:00 | +----+---------------------+------------+---------------------+---------------------+ id int not null autoincrement hashtag char(20) not null messages int not null default 0 created_at timestamp not null updated_at timestamp not null default '0000-00-00 00:00:00'
查询数据库以获取趋势标签,例如:
SELECT id FROM message_hashtags WHERE messages > 1 ORDER_BY messages LIMIT 10
这都是理论上的。从长远来看,这种设置会表现良好吗?我担心可能会导致性能不佳和尴尬的瓶颈和存储问题。我不认为这是过早的优化,因为如果我现在不以正确的方式进行操作,那么以后可能需要进行大量更改。
Hashtags 是一个受欢迎的主题,所以我假设你们中的一些人有处理 HT 和相关搜索的经验。
我愿意接受可能指向使用主题标签的另一个方向的建议和信息。