mysql 一对多表与键值数据库列表

标签 mysql database database-design nosql database-performance

我正在构建一个评论系统,一条评论可以有很多回复。

如果我要在 mysql 中实现它,我会构建一个 comments 表,并包含以下列:

  • comment_id,
  • parent_comment_id

其中父评论 id 为 0 表示评论, 是父评论 id 表示回复。因此,如果我正在寻找某个评论的回复,我会寻找具有 parent_comment_id 以匹配我正在寻找的评论的评论。

这对我来说似乎是多余的,因为它需要我遍历整个 comments 表来查找评论是否有回复(尤其是对于大数据),如果我有一个 key -store 数据库,我会有一个评论 ID 的键,里面是按日期排序的回复列表。

那么您认为哪种方法更适合解决这个问题?

此外,我想将问题概括为任何一对多关系,以列表形式存储在 key 存储数据库中。如果您推荐使用 key 存储数据库,您会为大数据推荐哪一个? (我不想为此使用 redis,因为它在内存中,而且我怀疑评论的回复是否需要经常访问)。

感谢回复。

最佳答案

关系数据库应该可以很好地处理这种“邻接表”模型。

首先,不要在 parent_comment_id 中使用 0在“root”注释中,使用 NULL。然后你可以从 parent_comment_id 构建一个 FOREIGN KEY至 comment_id这将防止您错误地附加对不存在的评论的回复。

it will require me to go through the whole comments table just to find whether a comment has replies or not

假设您已将 parent_comment_id 编入索引(InnoDB did automatically 如果您在上面创建了 FK),找到给定评论的第一级回复将需要索引范围扫描。要了解索引范围扫描及其高效的原因,您首先需要了解 Anatomy of an SQL Index .

找到第二层将需要另一次范围扫描等。不幸的是,MySQL 不支持递归查询,这种递归查询允许您在一次数据库往返中完成所有这些,但它应该仍然相当有效。

如果您已经执行了测量并得出结论这是一个问题,还有其他表示层次结构的策略(具有不同的权衡),例如“嵌套集”和“闭包”。看看this presentation by Bill Karwin .

关于mysql 一对多表与键值数据库列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14671153/

相关文章:

php - uploadify php mysql - 批量上传和批量插入

php - 无法使用 PHP 插入数据库

mysql - 错误率: Performance of Indexed Fields

mysql - 删除一条记录导致另一个表中的记录丢失

sql - 文本文件的 Oracle 数据类型?

java - 如何使用java获取数据库状态?

带有 CRUD 存储库的 MySql ANY_VALUE() 方法

sql-server - SQL Server 2012 - 创建数据库权限在数据库主机中被拒绝(错误 262)

javascript - 用于创建数据库连接一次的 node.js 设计模式

design-patterns - 跟踪用户代币/硬币的策略