mysql - Forum Schema : should the "Topics" table countain topic_starter_Id? 还是冗余信息?

标签 mysql database-design

我正在用 php 创建一个论坛应用程序并且有一个关于数据库设计的问题:

我可以获得特定主题的所有帖子。所有帖子都有一个 auto_increment 标识列和一个时间戳。

假设我想知道话题发起者是谁,哪个是最好的解决方案?

  • 获取该主题的所有帖子并按时间戳排序。但是,如果有人立即回复该主题,会发生什么情况。然后我有前两个帖子具有相同的时间戳(不太可能但可能)。我不知道第一个是谁。这也是标准化的,但在表增长后变得昂贵。

  • 获取该主题的所有帖子并按 post_id 排序。这是一个 auto_increment 列。我可以保证数据库将按插入顺序使用索引 ID 吗?稍后插入的帖子是否总是比前几行具有更高的 ID?如果我删除帖子怎么办?我的数据库以后会重用 post_id 吗?这是我正在使用的 mysql。

  • 当然,最简单的方法是使用 topic_starter_id 简单地向主题表添加一个字段并完成它。但它没有标准化。我相信这也是主题和帖子表增长到数百万行后最有效的方法。

你怎么看?

最佳答案

Zed 的评论非常到位。

您通常希望实现规范化,但非规范化可以节省潜在的昂贵查询。

根据我编写论坛软件的经验(商业五年,业余爱好五年),这种特殊情况需要非规范化来保存单个查询。存储第一个用户的显示名称和 ID 以及最后一个用户的显示名称和 ID 是完全理智和可接受的,只要将帖子添加到主题的代码始终更新记录。您只需要一个代码路径。

关于mysql - Forum Schema : should the "Topics" table countain topic_starter_Id? 还是冗余信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1516970/

相关文章:

mysql - 如何使用kubernetes备份MYSQL数据库

MySql 命令行 csv

mysql - SQL - 触发器更新错误

database-design - 多数据库交易

postgresql - BDR 对于生产 Postgres 同步有多好?

database-design - 支持应用程序中自定义字段的设计模式有哪些?

php - MySQL 从搜索结果中获取列名

mysql - 太阳黑子和solr

php - 根据字符串相似度获取最长公共(public)子串

database-design - 没有 WHERE 的 SELECT 的 CQL 设计