Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用于分组注释和回复的良好SQL结构_Sql_Performance_Structure_Grouping - Fatal编程技术网

用于分组注释和回复的良好SQL结构

用于分组注释和回复的良好SQL结构,sql,performance,structure,grouping,Sql,Performance,Structure,Grouping,我有两张桌子:新闻、图片。两者都可以有注释,所以我决定尝试创建一个通用注释表。此外,评论可以有一个答复。我解决了两种可能的方法,但我不知道按照良好实践或良好性能解决方案的顺序选择哪一种 方法1(我正在使用): 新闻: 图像: | ID | CommentGroup | Url | ...etc | ID | Url | ...etc 考虑下一幅图像: | 14 | 22 | http://image.gif |

我有两张桌子:新闻、图片。两者都可以有注释,所以我决定尝试创建一个通用注释表。此外,评论可以有一个答复。我解决了两种可能的方法,但我不知道按照良好实践或良好性能解决方案的顺序选择哪一种

方法1(我正在使用): 新闻:

图像:

| 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