SQL Schema允许用户向各种表添加注释

时间:2009-03-20 18:19:16

标签: sql schema

所以,我正在建立一个网站,我将有标准的CMS表格,如文章,博客,民意调查等。我想让用户发表评论到这些项目中的任何一个。所以我的问题是,我是否需要为每个创建单独的注释表(例如ArticleComment,BlogComment,PollComment),或者我可以创建一个可以与任何表一起使用的通用注释表吗?什么对人有用?

方法1:许多评论表

  • Article {ArticleID [PK],Title,FriendlyUrl}
  • ArticleComment {ArticleCommendID [PK],ArticleID [FK],Comment}
  • Blog {BlogID,Title,PubDate,Category}
  • BlogComment {BlogCommendID [PK],BlogID [FK],Comment}
  • 民意调查{PollID,Title,IsClosed}
  • 民意调查{PollCommentID [PK],民意调查[FK],评论}

方法2:单一评论表

  • Article {ArticleID [PK],Title,FriendlyUrl}
  • Blog {BlogID,Title,PubDate,Category}
  • 民意调查{PollID,Title,IsClosed}
  • 评论{CommentID [PK],ReferenceID [FK],评论}

5 个答案:

答案 0 :(得分:3)

我会选择通用评论表。它会使很多事情变得更加简单。我还会使用创建它们的用户的ID或其他源识别信息(IP地址等)来标记注释。即使你不显示它,当你必须清理垃圾邮件等时,它也会非常方便。

答案 1 :(得分:3)

似乎有两种主要方法可以将OO继承映射到关系数据库:

  1. 从父类和所有子类中获取所有属性并将它们放在表中,以及“哪个类是这个?”领域。每个对象在一个表中被序列化为一行。

  2. 为父类创建一个表,为每个子类创建一个表。父类表的表包含'哪个类是这个?'领域。子类表包含指向父类表的外键。每个对象在父类表中被序列化为一行,在子类表中被序列化为一行。

  3. 方法一不能很好地扩展:它很快就会出现很多可空的字段,几乎总是空的,并且有可怕的CHECK约束。但对于小类层次结构来说,它相当简单。

    方法二扩展得更好,但更多的工作。它还会在架构中生成更多表。

    我建议你看看你的文章/民意调查/博客表中的方法二 - 对我来说,它们听起来像Content或其他东西的子表。然后,您将有一个非常简单易用的地方附加评论:Content

答案 2 :(得分:1)

为什么要将所有评论保留在同一个表格中?你会把所有评论视为一个群体吗?如果您不希望将所有项目的所有评论都作为一个组进行处理,那么就没有理由将它们全部组合在一起。仅仅因为数据库中的两个实体共享相同的属性并不意味着它们应该放在同一个物理表中。

答案 3 :(得分:0)

我建议只有一个评论表,添加一个ItemID字段,告诉哪个项目类型是评论:

Article {ArticleID [PK], Title, FriendlyUrl}
Blog {BlogID, Title, PubDate, Category}
Poll {PollID, Title, IsClosed}
Comment {CommentID [PK], ReferenceID [FK], ItemID, Comment}
Item {ItemID, Type}

最后一个表格将包含(1,'article'),(2,'blog')等记录。

通过这种方式,您将能够确定每个评论的内容类型。

答案 4 :(得分:0)

我正在使用以下模型进行评论的系统:

  Data Table(s)      Many-to-many Assoc             Comment Table
  CommentableId  ->  CommentableId/CommentId   ->   Comment_Id

不是我的设计,但我喜欢这种灵活性。它允许我们在许多中使用一个注释 不同的地方。由于在UI中实现这一点并非易事,因此用户无法看到此功能(只需在文本框中键入注释),但在数据库中进行批量导入和遗留数据处理时会使用它。 / p>