允许用户向各种表添加注释的SQL架构
所以,我正在建立一个网站,我将有标准的CMS表格,如文章、博客、民意测验等。我想让用户对这些项目发表评论。所以我的问题是,我是否需要为每个表创建单独的注释表(例如ArticleComment、BlogComment、PollComment),或者我是否可以创建一个可以与任何表一起使用的通用注释表?什么对人们有用 方法1:许多注释表允许用户向各种表添加注释的SQL架构,sql,schema,Sql,Schema,所以,我正在建立一个网站,我将有标准的CMS表格,如文章、博客、民意测验等。我想让用户对这些项目发表评论。所以我的问题是,我是否需要为每个表创建单独的注释表(例如ArticleComment、BlogComment、PollComment),或者我是否可以创建一个可以与任何表一起使用的通用注释表?什么对人们有用 方法1:许多注释表 文章{ArticleID[PK],标题,FriendlyUrl} ArticleCommodId[PK],ArticleID[FK],Comment} 博客{Blo
- 文章{ArticleID[PK],标题,FriendlyUrl}
- ArticleCommodId[PK],ArticleID[FK],Comment}
- 博客{BlogID,标题,发布日期,类别}
- BlogComment{BlogCommodId[PK],BlogID[FK],Comment}
- 轮询{PollID,Title,IsClosed}
- PollComment{PollCommentID[PK],PollID[FK],Comment}
- 文章{ArticleID[PK],标题,FriendlyUrl}
- 博客{BlogID,标题,发布日期,类别}
- 轮询{PollID,Title,IsClosed}
- 注释{CommentID[PK],ReferenceID[FK],Comment}
- 我会选择通用注释表。这将使很多事情变得更简单。我还用创建注释的用户ID或其他源标识信息(IP地址等)标记注释。即使您不显示此项,在您必须清理垃圾邮件等时也会非常方便。我建议只使用一个注释表,添加一个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')等记录
通过这种方式,您将能够识别每个评论的内容类型。我正在开发一个系统,在该系统中,我们使用以下模型进行评论:
Data Table(s) Many-to-many Assoc Comment Table
CommentableId -> CommentableId/CommentId -> Comment_Id
不是我的设计,但我喜欢它的灵活性。它允许我们在许多评论中使用一条评论
不同的地方。由于在UI中实现这一功能并不简单,用户看不到这一功能(只是一个用于键入注释的文本框),但当我们在数据库中执行批导入和遗留数据处理时,会使用它。将OO继承映射到关系数据库似乎有两种主要方法:
CHECK
约束。但对于小型类层次结构来说,这相当简单
方法两个尺度更好,但更多的工作。它还会在您的模式中产生更多的表
我建议为你的文章/民意测验/博客表看看方法二——对我来说,它们听起来像
内容的子表。然后,您将有一个非常清晰和简单的位置来附加注释:到内容为什么要将所有注释保留在同一个表中?你会把所有的评论作为一个整体来对待吗?如果您不希望将所有项目上的所有评论作为一个单独的组来处理,那么就没有理由将它们全部组合在一起。仅仅因为数据库中的两个实体共享相同的属性并不意味着它们应该放在同一个物理表中。如果主键是guid,我甚至需要添加一个“Type”列吗?@Jim不,如果设置正确,你不会。通过设置权限,我的意思是您有一种方法(不需要搜索)来确定GUID引用的对象类型。如何在“ReferenceID”上设置FK?在单个注释表上声明外键是不可能的。@derobert--我相信SQL Server可以创建多个外键关系。我只需要确保引用完整性不被强制执行。这违背了使用外键的部分目的,但似乎有效。Linq2Sql似乎可以生成。是的,您将牺牲引用完整性,但听起来您似乎只希望ORM使用FKs?OO到关系映射的好东西