如何使用树结构规范化数据库

时间:2016-03-27 20:28:11

标签: sql-server

我需要一些SQL结构方面的帮助。 我写文章并希望在我的网站上在线分享,用户可以对它们发表评论。

每篇文章都包含名称,段落,部分和内容块。 您可以将其视为树:article => paragraph => sections =>内容块。 每篇文章都有很多段落,每个段落都有很多段落,每个段落都有很多内容。

现在,我希望用户能够为树中的每个级别添加注释。 为此,我为每个保存静态信息的实体(文章,段落,部分和内容块)创建了一个表。

我的问题是处理动态部分的最佳方法是什么,在哪里存储用户的评论? 什么是最好的解决方案?

感谢。

2 个答案:

答案 0 :(得分:2)

我建议它为每个实体创建一个表,用于存储注释的位置。

例如,您可以创建以下表格:

  • article_comments
  • paragraph_comments
  • section_comments
  • blockscontent_comments

所以每个表都将存储父实体Id,用户ID(如果已注册则为null,如果未注册则为null)和注释。

我之所以建议使用tou来使用不同的表只有一个是以下的:

  • 从某种意义上说,它是一种可扩展的解决方案,您可以在每个注释表中添加仅与父实体相关的自定义字段。如果你以后使用一个表执行该操作,那么表结构会因许多空行或空行字段而变得混乱。

  • 您的表格看起来会有分类和结构化。

  • 如果将来你有大量的评论,你的RDBMS将花费更少的时间从不同的表而不是一个表查询(当使用长文本/ blob字段时,查询变得更重,更慢)。 p>

  • 只使用一个父表设置外部约束很容易,参照完整性检查将花费更少的时间。

答案 1 :(得分:1)

内容表也是动态的,因为可以添加,修改或删除内容。

我会创建一个只包含主键和注释数据的注释表(文本为nvarchar(max)数据类型,作者的外键)。

然后,对于每个内容表,一个引用表,包含来自内容和注释表的PK作为一对外键。从理论上讲,注释可能属于多个内容项,应该在应用程序中防止(注释FK引用的唯一约束可以限制每个内容类型至少一个父项)。

不要忘记内容,评论和参考表的正确索引