用于分组注释和回复的良好SQL结构
我有两张桌子:新闻、图片。两者都可以有注释,所以我决定尝试创建一个通用注释表。此外,评论可以有一个答复。我解决了两种可能的方法,但我不知道按照良好实践或良好性能解决方案的顺序选择哪一种 方法1(我正在使用): 新闻: 图像:用于分组注释和回复的良好SQL结构,sql,performance,structure,grouping,Sql,Performance,Structure,Grouping,我有两张桌子:新闻、图片。两者都可以有注释,所以我决定尝试创建一个通用注释表。此外,评论可以有一个答复。我解决了两种可能的方法,但我不知道按照良好实践或良好性能解决方案的顺序选择哪一种 方法1(我正在使用): 新闻: 图像: | ID | CommentGroup | Url | ...etc | ID | Url | ...etc 考虑下一幅图像: | 14 | 22 | http://image.gif |
| ID | CommentGroup | Url | ...etc
| ID | Url | ...etc
考虑下一幅图像:
| 14 | 22 | http://image.gif | ...etc
评论可能是以下内容:
|UserA:
| Coment1
|
|--|UserB -> UserA:
| Coment2
|
|---|UserC -> UserB:
| | Comment4
|
|UserD -> UserA:
| Coment3
结果意见:
| ID | Group | ReplyGroup | Replied | Content | User |
| 13 | 22 | NULL | 1 | Comment1 | UserA |
| 17 | 22 | 13 | 1 | Comment2 | UserB |
| 11 | 22 | 13 | NULL | Comment3 | UserD |
| 15 | 22 | 17 | NULL | Comment4 | UserC |
如果在注释图像14之后创建了一个新的注释组,我将通过计算组列(22)的最大值来决定未来的注释组编号,因此添加1(23)
新的:
评论:
| ID | Group | ReplyGroup | Replied | Content | User |
| 13 | 22 | NULL | 1 | Comment1 | UserA |
| 17 | 22 | 13 | 1 | Comment2 | UserB |
| 11 | 22 | 13 | NULL | Comment3 | UserD |
| 15 | 22 | 17 | NULL | Comment4 | UserC |
| ID | Group | ReplyGroup | Replied | Content | User |
| 22 | 23 | NULL | 1 | Comment1 | UserA |
| 30 | 23 | 22 | NULL | Comment2 | UserB |
| ID | Group | Type | ReplyGroup | Replied | Content | User |
方法2
摘自问题:
新闻:
图像:
| ID | CommentGroup | Url | ...etc
| ID | Url | ...etc
评论:
| ID | Group | ReplyGroup | Replied | Content | User |
| 13 | 22 | NULL | 1 | Comment1 | UserA |
| 17 | 22 | 13 | 1 | Comment2 | UserB |
| 11 | 22 | 13 | NULL | Comment3 | UserD |
| 15 | 22 | 17 | NULL | Comment4 | UserC |
| ID | Group | ReplyGroup | Replied | Content | User |
| 22 | 23 | NULL | 1 | Comment1 | UserA |
| 30 | 23 | 22 | NULL | Comment2 | UserB |
| ID | Group | Type | ReplyGroup | Replied | Content | User |
其中类型DINTINGS在新闻或图像组之间
你认为怎样更好?
或者还有什么其他的解决方案
谢谢。最初,作为一个基本实现,我会将所有内容都视为“内容”分组公共属性
CONTENT (
id int primary key,
created_on datetime,
created_by int
)
然后有更具体的内容类型表
e、 g
及
及
每一个都与内容有1:1
关系
评论
然后会通过家长id
直接引用其他内容,引用的内容可以是图像、新闻,也可以是其他评论
评论中的根id
将引用实际图像或新闻内容(所有“顶级”评论的父id
)。这增加了维护根\u id
的开销(这应该不会太难),但有助于为某些内容选择注释
e、 g
您使用的是哪种数据库管理系统?谢谢。我想这样试试
-- get the article
SELECT *
FROM content
JOIN news
ON news.content_id = content.id
JOIN users
ON users.id = content.created_by
WHERE content.id = @news_id
-- get the comments
SELECT *
FROM content
JOIN comments
ON comments.content_id = content.id
JOIN users
ON users.id = content.created_by
WHERE comments.root_id = @news_id