我正在为我的微博客网络应用添加“Hashtag支持”。像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和相关搜索的经验。
我愿意接受可能指向使用主题标签的另一个方向的建议和信息。
答案 0 :(得分:3)
建立主题标签和消息之间的多对多关系可能是值得的。这包括再添加2个表:
id
和hashtag
(可能还有其他元数据),这将是所有现有主题标签的定义(并将在以后更新一个新的由用户创建)post_id
和hashtag_id
,当用户使用主题标签创建帖子时,这些字段会更新。此表中的每个条目都是在帖子上找到的单个标签。例如:
hashtags
--------
id | hashtag
---+--------
1 | php
2 | madara
3 | awesome
hashtags-messages
-----------------
post_id | hashtag_id
-----------+-----------
1 | 2
1 | 3
2 | 1
2 | 3
这意味着帖子1包含标签#madara
和#awesome
,而帖子2包含#php
和#awesome
。
查询最流行的主题标签就像在hashtag_id分组时查询计数一样简单。使用JOIN,您可以获得有关标签本身的所有信息。