用php创建像twitter或convore的提及

Ada*_*han 8 php mysql architecture

你好我很好奇.关于他们如何做事.我认为他们做了这样的事情

@someone1 im stacking on stackoverflow RT @someone2 : hello guys what are you doing?
Run Code Online (Sandbox Code Playgroud)

在我以我的方式做之前我想告诉你我的数据库方案

// CID = COMMENT ID, BID  = BLOG ID, UID = USER ID
CID    BID   UID    COMMENT
1       1     1      @someone1 im stacking on stackoverflow RT @someone2 : ....
2       1     4      @someone1 im stacking on stackoverflow RT @someone2 : ....
3       1     12     @someone1 im stacking on stackoverflow RT @someone2 : ....
Run Code Online (Sandbox Code Playgroud)
  1. 他们使用正则表达式来做这样的@someones名称

    preg_match_all("/@[a-zA-Z0-9_]+/", $text, $matches);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后他们从每个名字得到@

    foreach ($matches as $value) {
    foreach ($value as $value) {
        $usernames[] = substr($value, 1);
    }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 然后他们从数据库中获取UID来做这样的事情

    foreach ($username as $value) {
    # insert database one by one ? so it will be like the example above
    }
    
    Run Code Online (Sandbox Code Playgroud)

然后我们可以输出评论购买UID.

然后somhow我们可以在博客中获得所有评论.(没有相同的评论)where blog buid = 1并通过提供每个用户的通知where uid = :uid.

有没有更好的方法呢?像twitter或convore这样的东西?

谢谢你的关注

亚当拉马丹

Ril*_*ton 10

我已经使用我们用于通信的内部应用程序做了类似的事情.

基本上,你将有两个表:status_updatesmentions.每个状态更新都有很多提及.每当有人创建状态更新时,您都将其保存到status_updates表中.在此过程中,您还可以使用Regex来检测任何@username"提及".当您找到提及时,将其添加到您的mentions表中.例如,您的mentions表可能如下所示:

 mention_id (Auto-incrementing key) | status_message_id | username_id
Run Code Online (Sandbox Code Playgroud)

这样,如果您想查看状态消息中是否有人被提及,您可以在status_messages表中快速查找,而不是每次都加载状态消息并运行正则表达式.这种方法的另一个好处是它允许您在每个状态消息中有多个提及.只需mentions为每个创建一个记录.

这是我们设置它的基本方式.

编辑:如果您想为给定用户提取"活动源​​",仅显示已提及它们的状态更新,则它将如下所示:

SELECT * FROM mentions m LEFT JOIN status_messages s ON m.status_message_id = s.id WHERE m.username_id = $username_id
Run Code Online (Sandbox Code Playgroud)

我应该注意到,这不是他们在Twitter上的表现,因为他们正在处理规模问题,这会使这种简单的做事方式变得不可能.但是,如果您不担心扩展到数十万用户,我认为这是最简单的解决方案.如果你是,那么你手上的问题可能比这更多.

  • @Kevin Pelo确实.它绝对应该是一个复合键.这实际上就是我们所做的,然后使用REPLACE INTO而不是INSERT,以防他们在同一状态消息中多次提到用户名.在这种情况下,我选择保持简单,例如目的.也许我不应该有?:-) (2认同)