评论系统数据库设计

时间:2011-02-28 19:05:14

标签: asp.net database-design

我正在开发一个像SO这样的系统(完全不同的主题),回复和评论与我们每天在StackOverflow上看到的系统相似。

我的问题是,我正在使用存储的PROC加载问题,使用另一个存储的PROC加载回复,现在我正在添加注释系统。我是否需要逐个获取有关主题的每个回复的评论?

这意味着,如果我的页面大小设置为20个回复,我将进行22次数据库操作,这比我想的要多。

我认为我不需要为这个问题添加我的数据库图表,但仍然是:

Questions
-----------
QUESTION_ID
USER_ID
QUESTION_TEXT
DATE

REPLIES
-----------
REPLY_ID
QUESTION_ID
USER_ID
REPLY_TEXT
DATE

COMMENTS
------------
REPLY_ID (fk replies)
USER_ID
TEXT
DATE

2 个答案:

答案 0 :(得分:2)

您应该立即收到所有评论。

然后使用每个回复的过滤器从结果中创建DataView并绑定到DataView。您还可以将linq用于实体,并在每个绑定上过滤掉新的集合。这是一个基本的伪代码示例:

  1. 获取所有回复问题的所有评论
  2. 绑定回复
  3. 为将显示评论的回复控件实施OnDataBinding
  4. OnDataBinding中为具有相同回复ID的评论的结果集添加过滤器
  5. 将过滤后的评论列表绑定到评论的显示控件
  6. 这应该可行,我已经为类似类型的数据结构实现了相同的场景。

答案 1 :(得分:1)

Pabuc,

对于您的初始问题,为什么不使用针对给定问题/回复的单个查询获得所有结果?

select reply_text, user_id 
  from REPLIES
  order by DATE asc

另外,正如您所指出的,除了细微差别之外,问题和答案的属性几乎与帖子的属性相同。

下面的模型不会更有意义吗?问题和答案都是“帖子”,唯一的区别是答案将问题作为父母,问题没有父母。

Create table post -- question/reply (
   post_id number,
   parent_post_id number, -- will be null if it is the question, will have the question id
                          -- if it is a reply to a question
   post_text varchar2(4000),
   user_id   number,
       post_date date);

-self referential foreign key
Alter table post
  add constraint foreign key (parent_post_id) references post(post_id);

- 对所有帖子发表评论(问题/回复)。

create table comments(
  comment_id number,
  post_id number,
  comment_txt varchar2(140),
  comment_user_id number,
  comment_date  date
);

alter table comments add constraint fk_comments_post
  foreign key (post_id) references post(post_id).

- 对于给定的问题(帖子)ID,您可以使用...

获取所有回复和帖子
select replies.*,
       comments.*
  from posts replies,
       comments
  where replies.parent_id = :Question_id --input
    and comments.post_id = replies.post_id

您可能必须添加order by子句以根据需要获取结果,updated_timestamp或任何其他属性。