我一直致力于一个需要草稿/现场版内容的项目,并考虑过如下设计:
Article
ID
Creator
CreationDate
DraftContent(fk to ArticleContent)
PublicContent(fk to ArticleContent)
IsPendingApproval
ArticleContent
Title
Body
我想知道在发布文章时更改外键是否更好,或者将草稿表中的内容复制到实时表是否更好。
有什么建议吗?
编辑:草稿和实时版本同时存在,但实时版本是唯一对公众可见的版本。只能有一个草稿和一个实时表格
此设计的部分原因是强制用户在其上线之前批准其文章。
更新
我们决定使用Kieren的解决方案稍作修改。我们决定使用单个状态列,而不是像IsPublished IsLive这样的项使用列。否则设计保持不变。
答案 0 :(得分:8)
生效的文章草稿然后“发布”
通常情况是在文章表格上有一个状态/类型标记 - IsLive
。
使用单独的表是不必要和冗余的;更改外键也没有多大意义。将该文章视为有效对象,无论是草稿还是实时。唯一的区别是,在大多数情况下,您只想显示实时文章。在将来的某些情况下,您可能希望同时显示两者。
可能会在最初生效后编辑并拥有新草稿版本的文章
就一篇同时包含实时和草稿版本的文章而言,最常见的模式是拥有一个主Article
实体/对象,然后说ArticleVersion
来自该实体/对象。 ArticleVersion
具有IsLive
属性,甚至更好,Article
本身将拥有属性CurrentLiveVersionId
。这样就可以存在实时和草稿版本,但您通常只需Article
加ArticleVersion
CurrentLiveVersionId
即可获得当前的实时版本。
拥有ArticleVersion
表的优点包括可以存储文章的整个历史记录,更改日志,因此您可以根据需要恢复到以前的版本,或查看更改。所有这些都是非常低的实施成本..
如果我能澄清这种方法,请告诉我。
答案 1 :(得分:1)
您的设计看起来很合适。当新版本上线时,我会:
UPDATE
PublicContent
键指向(以前)草稿。
DELETE
不再引用的以前发表过的文章。
NULL
DraftContent键,或者,如果您的模型要求始终拥有草稿版本,INSERT
新的空草稿进入ArticleContent
并将DraftContent
键指向它。