【发布时间】:2009-09-16 13:54:11
【问题描述】:
我正试图弄清楚我应该如何保存用户对其个人资料所做的编辑,这种编辑在得到管理员批准之前不会上线或影响现有的实时数据。有第二个表格用于编辑配置文件,然后复制批准数据?将其全部保存在一个表中并拥有所有可编辑字段的 _tmp 副本?有这方面的最佳做法吗?
感谢您的意见。
【问题讨论】:
标签: sql mysql data-modeling
我正试图弄清楚我应该如何保存用户对其个人资料所做的编辑,这种编辑在得到管理员批准之前不会上线或影响现有的实时数据。有第二个表格用于编辑配置文件,然后复制批准数据?将其全部保存在一个表中并拥有所有可编辑字段的 _tmp 副本?有这方面的最佳做法吗?
感谢您的意见。
【问题讨论】:
标签: sql mysql data-modeling
对我来说,有一张单独的桌子听起来不错。这样您就可以只存储已更改的内容,而不是其他所有内容。
【讨论】:
为简单起见,我经常使用数据库中的一些“状态”列来确定特定行是否可以公开查看。然后在您的 SQL 中添加
WHERE status = 'published'
这适用于简单的网站。
对于更繁忙的网站,我怀疑没有 WHERE 子句会带来一些性能提升。在单独的表中进行待处理的编辑将是一个不错的选择,然后您将 INSERT INTO ... SELECT FROM 移动到活动表中。
【讨论】:
您可以在应用程序中构建一些工作流程。因此,您将拥有一个工作流表,其中定义了各种状态(例如,输入、建议、批准等)。
然后您还可以有一个 PendingChanges 表来存储这些建议的更改。当提议的更改获得批准后,您将更改合并到主用户配置文件更改中。
【讨论】:
如果您有很多这样的情况(跨越许多不同的表),您可以有一个 TempObject 表,您可以在其中序列化对 XML 或其他状态的更改,直到它们被批准。
或者,如果它只是用户配置文件表,您可以在 UserID + Approved(boolean) 上有一个唯一键。当用户编辑他们的数据时,它会以 UserID 的形式进入表中,Approved = false,然后要批准它,您只需删除已批准的数据并将未批准的数据更新为已批准(当然是在事务中)。
毕竟,您已经拥有保存所有数据的结构 - 为什么不重复使用它呢?
【讨论】:
这似乎最简单:您可以在 USERS 表中添加一个 VERSION 和一个 STATUS 字段。然后,根据需要使用 STATUS 字段显示最高版本的行。显然,这也为您提供了记录的版本控制。
只要对 VERSION 和 STATUS 进行索引,它们就不会真正减慢任何显示操作的速度。添加行会稍微慢一些,因为必须维护索引。
【讨论】:
与第一个格式相同的第二个表不容易让多个更改排队。
我建议设计一个特定的结构来将每个变更请求记录为一个变更请求。更改对象、更改内容、更改对象、提出请求的人员、何时等字段。
然后有代码在验证时应用更改。
这也可以作为一个易于跟踪的审计线索。
我不会在同一张表中进行更改,它将实现紧密地绑定在一起,使以后的维护变得头疼。独立性降低了所有事物的耦合程度,以便在未来获得更大的灵活性。
【讨论】: