V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
androidBrant
V2EX  ›  程序员

问个问题,顶、文章、用户的关系是如保存的?(内有例子)

  •  
  •   androidBrant · 2013-12-04 14:50:28 +08:00 · 2701 次点击
    这是一个创建于 4011 天前的主题,其中的信息可能已经有所发展或是发生改变。
    举个例子,糗事百科每个帖子都有顶这个功能,但每个人只能顶一次,那顶的人,和帖子的关系是如何保存的(数据库如何设计的?)?
    7 条回复    1970-01-01 08:00:00 +08:00
    raincious
        1
    raincious  
       2013-12-04 14:58:42 +08:00
    猜想类似于

    SELECT `t`.`topic`, `like`.`liked` FROM `topic` AS `t`
    LEFT JOIN `liked` AS `like` ON `like`.`topicID` = `t`.`topicID` AND `like`.`likerID` = %CURRENTUSERID%

    然后每次顶好了,liked表里面加一条什么的。

    当然这样数据库负担很大,或许需要拆成两个SELECT然后在程序里合并结果什么的。当然,拆来来之后,都能直接上NOSQL了。
    spoony
        2
    spoony  
       2013-12-04 14:59:03 +08:00
    Token+Postid 的Hashtable
    hustlzp
        3
    hustlzp  
       2013-12-04 15:16:13 +08:00   ❤️ 1
    一张表,2个field:user_id, post_id。

    然后主键设为user_id+post_id的组合。

    这样应该就保证一个人只能顶一篇文章一次。
    mechille
        4
    mechille  
       2013-12-04 15:32:25 +08:00
    提供个思路(没实际操作过,欢迎拍砖):在POST表建一个字段post_user。

    里边存入user的id,半角逗号分割。

    下次直接用find_in_set判断当前这个user是否存在于这个post的post_user里就可以了
    ayang23
        5
    ayang23  
       2013-12-04 16:01:40 +08:00
    @mechille 几千个id组成字符串对mysql的io也有不少影响,而且程序还得处理,效率不一定比left join好
    mechille
        6
    mechille  
       2013-12-04 16:08:36 +08:00
    @ayang23 那么三楼方案应该是最佳的了。插入用REPLACE INTO 或者 INSERT INTO ... ON DUPLICATE KEY UPDATE。检索用 substring_index 做关系(应该比like效率高吧)
    slixurd
        7
    slixurd  
       2013-12-04 23:45:40 +08:00
    2楼的hashtable显然更好啊,如果不需要查看是谁顶帖的情况下
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3257 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 12:29 · PVG 20:29 · LAX 04:29 · JFK 07:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.