帖子,评论和回复的数据库架构设计

时间:2016-05-26 09:00:12

标签: mysql database schema

在我以前的项目中,我将帖子和评论分为两个表:

  • ID
  • 文本
  • 时间戳
  • 用户ID

评论

  • ID
  • 消息
  • 时间戳
  • 用户ID
  • 帖子ID

现在我必须设计回复评论。回复只是一个级别,因此用户只能回复评论,而不能回复。树结构只有1层深。我的第一个想法是对评论和回复使用相同的评论表。我添加了一个新专栏:

评论

  • ID
  • 消息
  • 时间戳
  • 用户ID
  • 帖子ID
  • parentcommentid

回复已将parentcommentid设置为其所属的父评论。家长评论没有(null)

检索给定帖子的评论很简单:

但这次我需要另一个查询来查找评论回复。每个评论都必须这样做:

这似乎不是一个好的解决方案,有没有办法让一个查询以正确的顺序返回完整的评论/回复列表? (由时间戳和嵌套决定)

3 个答案:

答案 0 :(得分:3)

您可以在我提供的单个查询中使用join并获得结果:

  SELECT *, cc.message as replied_message 
    FROM `post` 
    JOIN comment as c 
      ON c.postid = post.id 
    JOIN comment as cc 
      ON cc.id = c.parentcommentid 
ORDER BY c.timestamp DESC, cc.timestamp DESC;

请注意,只有当1个评论只有1个回复时,它才能正常工作。此查询不支持单个评论的多个回复

答案 1 :(得分:0)

如果您使用的数据库支持JSON或对象聚合,则可以从查询中获得更好的结果,其中每个顶级注释都是一行(并且不能重复),并且答复嵌套在一个数组中/ JSON在每行中。

这使您可以灵活地进行操作,还可以更轻松地确保排序和嵌套正确。

使用Postgres的示例:

from tkinter import  *
from tkinter import messagebox
root=Tk()
def clicked():
  label1=Label(root,text="This is text")
  label1.pack()
def popup():
  response=messagebox.askquestion("Title of message box ","Exit Programe ?", 
  icon='warning')
  print(response)
   if   response == "yes":
      b2=Button(root,text="click here to exit",command=root.quit)
      b2.pack()
  else:
    b2=Button(root,text="Thank you for selecting no for exit .")
    b2.pack()
button=Button(root,text="Button click",command=clicked)
button2=Button(root,text="Exit Programe ?",command=popup)
button.pack()
button2.pack()
root.mainloop()

请注意,如上所述,此示例将仅检索顶级及其第一级的答复。它不会得到答复。您可以使用递归命令或其他子查询来做到这一点。

答案 2 :(得分:0)

我知道此答复为时已晚,但希望它现在可以帮助其他面临此问题的人。

我想出了一个表和一个查询,该查询以我在自己的网站上使用的正确顺序返回所有结果,虽然略有不同,但是可以使用逻辑来解决这个问题。

表名:评论

  • id / varchar(32)
  • 用户ID / int(10)
  • 评论/文字
  • 订购/整数(10)
  • ordering_secondary / int(10)
  • source / tinyint(4)
  • 状态/ tinyint(4)
  • 创建/时间戳
  • 已编辑/时间戳

在(id,ordering,ordering_secondary,source)上有一个主键,因此这四个列的总和不会重复。

插入评论,首先检查“排序”,然后将新评论增加1。

SELECT ordering FROM comments WHERE id="page id" AND source=0 ORDER BY ordering DESC LIMIT 1

“源”列对于父级将为“ 0”,对于答复为“ 1”。因此,只需插入注释,对于特定ID上的每个注释,其排序值就会增加1。

插入回复评论时,使用与父项相同的“ ordering”值,但增加“ ordering_secondary”列。

SELECT ordering FROM comments WHERE id="page id" AND source=1 AND ordering="parent comment ordering" ORDER BY ordering DESC LIMIT 1

所以数据看起来像:

enter image description here

在表中有两个父注释和对第二个父注释的两个答复。没有回复第一位家长的评论。

这种方法显然在插入上的开销更大,因为您必须查找“ id”上最后一条注释的排序值,但查询数据很简单。

SELECT * FROM comments WHERE id=? ORDER BY ordering DESC, ordering_secondary ASC LIMIT 30