sql - 论坛线程投票/ View 的数据库架构,以及增加和显示 View 数量的策略

标签 sql mysql database-design data-modeling database-schema

If it matters as of now I'm using MySQL/MyISAM but I'm open to using PostgreSQL. I'm also open to using memcached.

考虑一个用于存储论坛线程的表:

id forum_name post_date
1  Hey!       2009-01-01 12:00:00
  • 存储投票、 View 和计数器等线程相关实体的最佳做法是什么?

我应该..

创建一个单独的表如

id thread_id views
1  1         532

还是将其保留为初始线程表中的一列?

id forum_name post_date              views
1  Hey!       2009-01-01 12:00:00    532

另一个相关的花絮,显示和增加页面浏览量的实用解决方案是什么?我读了这个thread似乎我可以只缓存一个值一段时间,我对递增部分不是很清楚——也许是像将值存储在某个地方的平面文件中,然后使用 cronjobs 每隔一小时左右定期更新数据库论坛 View ?

编辑: 澄清一下,投票就像每个线程一票一样,并且可以逆转。别管我说的计数器是什么意思。

最佳答案

投票

我建议除了线程表之外还定义两个表 - VOTE_CODESTHREAD_VOTES。乍一看,它可能看起来过于规范化,但这种格式将允许您更改投票值,而无需进行重大的 DML 更改。

VOTE_CODES

  • vote_code, 主键, IE: up, down
  • vote_cast_value --归因于赞成/反对票的值
  • vote_caster_value --可选,如果你想保持 SO 的负面投票风格影响施法者。

THREAD_VOTES

  • thread_id
  • user_id
  • vote_code

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

观看次数

我建议存储:

  • 线程编号
  • IP 地址
  • user_agent -- 粗略的浏览器捕获
  • 时间戳

以上都是主键。您的表将快速填充,但它会让您能够在 View 中创建计算列以获得更准确的报告。

关于sql - 论坛线程投票/ View 的数据库架构,以及增加和显示 View 数量的策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1944055/

相关文章:

具有附加条件的 MySQL GROUP BY

php - 不是唯一的表/别名(codeigniter)

.net - End using 是否关闭打开的 SQL 连接

MySQL 5.6 - 避免解析几何两次?

sql - 维护参照完整性-好还是坏?

android - 设计一个结构化数据库来聊天,一张表或多张表

java - 我的 SQL 准备语句通过某个 id 获取点的总和?

mysql - 为什么在 SQL 中不可避免地使用双重嵌套 NOT EXISTS 语句

php - 哪一个更好?使用您自己的加密算法还是使用 md5/sha1?

适用于多个用户的 MySQL 数据库结构,每个用户有 100 到 1000 条唯一行