【发布时间】:2011-07-09 19:21:49
【问题描述】:
给定我页面上元素的 cmets 系统,我想避免重复表格,例如:
tblBlogComments
tblNewsComments
tblArticleComments
等等等等
设计这个的好方法是什么?一张 cmets 表?如何将这些链接到博客中的单个整体?
【问题讨论】:
标签: database-design normalization
给定我页面上元素的 cmets 系统,我想避免重复表格,例如:
tblBlogComments
tblNewsComments
tblArticleComments
等等等等
设计这个的好方法是什么?一张 cmets 表?如何将这些链接到博客中的单个整体?
【问题讨论】:
标签: database-design normalization
您可以创建一个包含所有 cmets 和某种类型元素 ID 的 cmets 表,该表链接回特定元素(博客文章、新闻项目、文章等)。
将对象类型添加到 cmets 表中也可能很好,其中值将是注释链接到的元素的类型。通过这种方式,您可以创建一个视图来过滤网站不同部分中的查询表,因此您无需每次都进行全表/索引扫描。
【讨论】:
enum 可能的类型(博客、新闻或文章),并使数据库值等于枚举价值。
当然,您可以为这些表使用一个表,但您必须非常仔细地考虑是否要为特定表添加您不希望其他表使用的特定功能/字段。
即你可以有
TABLE Comments (commentid, userid, blogid, newsid, articleid, commenttitle, comment)
但是,如果您随后只想为 News cmets 添加另一个字段,即 NewsPicture,那么在使事情变得更容易和最终得到一个语义不正确的表结构之间有一条很好的界限
【讨论】:
这取决于。单独的表格是有原因的,例如不必包含类别或过滤,以及在逻辑上分隔不应分组的条目(博客 cmets 与新闻 cmets)。
如果您想要一个简单的 cmets 表,您始终可以添加一个“类别”列,用于标记评论的位置/评论内容(博客、新闻、文章等)。如果您计划了您的唯一 ID,您可以只拥有一个类似“父文档”的列,并将其指向发布评论的文章/博客/等的 ID。
【讨论】:
假设所有 cmets 都是相同的(即,所有 cmets 都具有相同的最大长度和其他存储字段,例如“评论作者”),我会采用一种方法,即拥有一个具有 CommentTypeId 的 Comment 表列来确定它是什么类型的评论。
顺便说一句,我也会从实体名称的开头删除tbl,因为这并不是真正必要的,至少在 IMO =)
【讨论】:
这种方法的两个问题是
a) 外键约束。没有简单的方法来指定
如果comment_type_id 为“Article”,则检查此parent_id 是否存在于Article 表中 如果comment_type_id 为“Blog”,则检查此parent_id 是否存在于Blog 表中 --- 等等..
我见过的大多数地方都忽略了外键约束,并在添加评论时在应用程序层(java、.net.. 不管)中进行检查。这会引入更多复杂性,例如并发用户和事务以及锁定。
b) 第二个问题是某些 cmets 具有特定数据(仅与博客、文章或新闻相关)。即使有,请确保将其作为单独的列包含,并且没有像“additional_column_1”这样的通用列。
【讨论】:
您的问题与database design problem 几乎相同,其中包括用于实现此类评论系统的 SQL 示例代码。您应该能够很容易地适应 SQL。
【讨论】: