论坛帖子投票/观看的数据库模式,以及递增和显示视图数量的策略

med*_*iev 2 mysql sql database-design data-modeling database-schema

如果现在重要的是我正在使用MySQL/MyISAM,但我愿意使用PostgreSQL.我也愿意使用memcached.

考虑一个用于存储论坛帖子的表格:

id forum_name post_date
1  Hey!       2009-01-01 12:00:00
Run Code Online (Sandbox Code Playgroud)
  • 存储与线程相关的实体(如投票,视图和计数器)的最佳做法是什么?

我是不是该..

创建一个单独的表,如

id thread_id views
1  1         532
Run Code Online (Sandbox Code Playgroud)

或者将它保存为初始线程表中的列?

id forum_name post_date              views
1  Hey!       2009-01-01 12:00:00    532
Run Code Online (Sandbox Code Playgroud)

另一个相关的小窍门,显示和增加页面浏览量的实用解决方案是什么?我读了这个帖子,似乎我只能缓存一段时间的值,我对增量部分并不十分清楚 - 也许就像将值存储在某个地方的平面文件中,然后定期用cronjobs更新数据库论坛视图每小时左右?

编辑: 澄清一下,投票就像SO一样,每个帖子一票,并且可以有逆转.没关系我对柜台的意思.

OMG*_*ies 8

表决

我建议除了线程表之外还定义两个表 - VOTE_CODESTHREAD_VOTES.一目了然,它可能看起来过于标准化,但格式将允许您更改投票值而无需进行主要的DML更改.

VOTE_CODES

  • vote_code,主键,IE:向上,向下
  • vote_cast_value - 值归因于上/下投票
  • vote_caster_value --optional,如果你想保持SO的负面投票风格影响施法者.

THREAD_VOTES

  • thread_id
  • user_id
  • vote_code

所有列THREAD_VOTES都是主键 - 这将确保给定用户和线程只有与投票代码一样多的行.假设只有两个代码,这将支持反转投票的能力,因为只能有两个记录 - 一个带有任一代码.

查看

我建议存储:

  • 线程ID
  • IP地址
  • user_agent - 通过浏览器捕获
  • 时间戳

以上所有都是主键.您的表格将快速填充,但它将使您能够在视图中创建计算列以获得更准确的报告.