草稿/实时内容系统数据库设计

时间:2011-10-25 21:19:40

标签: sql database database-design

我一直致力于一个需要草稿/现场版内容的项目,并考虑过如下设计:

Article
    ID
    Creator
    CreationDate
    DraftContent(fk to ArticleContent)
    PublicContent(fk to ArticleContent)
    IsPendingApproval

ArticleContent
    Title
    Body

我想知道在发布文章时更改外键是否更好,或者将草稿表中的内容复制到实时表是否更好。

有什么建议吗?

编辑:草稿和实时版本同时存在,但实时版本是唯一对公众可见的版本。只能有一个草稿和一个实时表格

此设计的部分原因是强制用户在其上线之前批准其文章。

更新

我们决定使用Kieren的解决方案稍作修改。我们决定使用单个状态列,而不是像IsPublished IsLive这样的项使用列。否则设计保持不变。

2 个答案:

答案 0 :(得分:8)

生效的文章草稿然后“发布”

通常情况是在文章表格上有一个状态/类型标记 - IsLive

使用单独的表是不必要和冗余的;更改外键也没有多大意义。将该文章视为有效对象,无论是草稿还是实时。唯一的区别是,在大多数情况下,您只想显示实时文章。在将来的某些情况下,您可能希望同时显示两者。

可能会在最初生效后编辑并拥有新草稿版本的文章

就一篇同时包含实时和草稿版本的文章而言,最常见的模式是拥有一个主Article实体/对象,然后说ArticleVersion来自该实体/对象。 ArticleVersion具有IsLive属性,甚至更好,Article本身将拥有属性CurrentLiveVersionId。这样就可以存在实时和草稿版本,但您通常只需ArticleArticleVersion CurrentLiveVersionId即可获得当前的实时版本。

拥有ArticleVersion表的优点包括可以存储文章的整个历史记录,更改日志,因此您可以根据需要恢复到以前的版本,或查看更改。所有这些都是非常低的实施成本..

如果我能澄清这种方法,请告诉我。

答案 1 :(得分:1)

您的设计看起来很合适。当新版本上线时,我会:

  1. UPDATE PublicContent键指向(以前)草稿。

  2. DELETE不再引用的以前发表过的文章。

  3. NULL DraftContent键,或者,如果您的模型要求始终拥有草稿版本,INSERT新的空草稿进入ArticleContent并将DraftContent键指向它。