草稿/已发布状态的最佳实践

问题描述 投票:0回答:1

我正在构建一个 CMS 并试图找出处理“另存为草稿”功能的最佳数据架构。

假设我有一张

post
桌子。我需要能够将帖子保存为草稿,并在需要时发布。如果帖子已保存为草稿,我们将看到该帖子的已发布版本。编辑该帖子时,我们将看到草稿版本,可以选择将其另存为草稿或发布。

完成一些研究后,我发现了数据架构的这些选项:

选项1

post
  id
  title
  body
  status

post_draft
  id
  title
  body
  post_id

创建帖子时,我们在两个表中插入一行。查看帖子时,我们会查找

post
表。编辑帖子时,我们会在
post_draft
表中查看是否有草稿。保存草稿时,我们更新
post_draft
表,发布时我们将
post_draft
的内容复制到相关帖子。

我已经尝试过了,效果很好,但它的缺点是必须维护两个相同的表。因此,如果将来我需要在帖子中添加一列,我需要将其添加到两个表中。

但是,它巧妙地将已发布的帖子和草稿帖子分开。

选项2

post
  id

post_content
  title
  body
  status
  post_id

这里我们有一个帖子表,我们根据要检索的状态来检索其内容。如果我们想要草稿版本,我们将

post
post_content
status="draft"

连接起来

这也很有效,但它使索引和搜索等事情变得更加复杂。它还为我需要做的其他事情带来了更多的复杂性,例如能够在一个请求中返回多个表(我不会详细说明 - 我只想说它使其他一些要求变得复杂)。

选项3

post
  id
  title
  body
  status
  published_id

我们这里只有一张桌子。为了获取帖子的已发布版本,我们使用

status="published"
查找 id。要查找草稿版本,我们会查找
status="draft"
published_id=[the post id]

这似乎解决了很多问题。我看到的唯一缺点是发布的帖子的 id 会跳得到处都是。

有实施这样的事情的最佳实践吗?有什么更好的选择或我没有考虑过的事情吗?

database design-patterns database-design content-management-system
1个回答
0
投票

第三个选项是最好的选项,从我的角度来看,也是唯一正确的选项。 DRAFT和LIVE的内容是一样的,只是通过一个属性——状态来区分。想象一下这样一种情况,您需要添加一个新的状态,如“已接受”、“已删除”等。您可能不想为此创建新表,因为处理它将是一场噩梦。

为什么您认为跳过 ID 是一个问题?这对于数据库和帖子编号来说不是问题,如果您希望它们按顺序排列,那么您可以添加一个 post_number 列。

© www.soinside.com 2019 - 2024. All rights reserved.