我正在构建一个评论系统,一条评论可以有很多回复。
如果我要在 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/