我在以PHP和MySQL开发的市场研究数据库为中心的网站上工作。 它由两个重要部分组成 - 一个是用户插入和更新自己的数据(比如一个表T带有user_id字段),另一个是网站管理员可以插入新的或更新现有记录(同一个表)。
显然,在某些情况下,最终用户的数据会被管理员覆盖,而在其他情况下,管理员输入的数据会被最终用户更新(两种方式都很好)。
如果最终用户是最后一个更新某个字段,则要求突出显示/编辑表单(如果说是蓝色),如果管理员要“责备”,则突出显示红色。
我正在研究一种有效且一致的方法来实现它。
到目前为止,我有以下选择:
对于表T中的每个记录,添加另一个(char(1)),如果最终用户插入/更新了字段,则写入“U”;如果管理员这样做,则添加“A”。呈现视图/编辑表单时,请使用此信息相应地突出显示每个字段。
创建一个新表H,存储包含user_id,field_name,last_update_user_id之类的编辑历史记录。在主表T中更新字段时,使表H保持最新。在呈现视图/编辑表单时,使用此信息相应地突出显示每个表单字段。
这些选择的优点/缺点是什么;你能推荐别人吗?
答案 0 :(得分:2)
我认为这取决于你想要的前瞻性。
您的第一种方法的优点是实现起来非常简单,更新和使用非常简单,而且只会略微增加您的存储要求,但就您所需的信息量而言,它也是极端最小的。重新存储。
如果您使用第二种方法并存储更完整的历史记录,如果您将来需要添加“编辑历史记录”,那么您已经为此设置了一些内容,并且等待了大量数据。但如果你最终不需要这些数据,那就有点浪费了。
或者,如果你想要两全其美,你可以将它们结合起来。保留完整的编辑历史记录,但也更新主记录中的单字符标志。这样你就不必对历史进行任何处理来查找最新的编辑,只需查看标志即可。但如果您确实需要完整的历史记录,那么它就可以使用。
就个人而言,我更喜欢保留比当时我想要的更多的信息。存储空间非常便宜,你永远不知道什么时候它会派上用场。我可能会比你提出的更进一步,也可以使编辑历史跟踪他们改变的以及之前/之后的值。这对于调试非常方便,并且可能在将来有用,具体取决于项目的确切需求。
答案 1 :(得分:2)
是的,实施一个审核表,其中包含历史数据的副本,由谁/来自c。我正在处理一个目前保持简单的系统,并将值更改写为简单的名称 - 值字符串对以及日期和由谁。它需要强制主记录调整,但适用于跟踪。您可以使用触发器轻松实现此功能。
答案 2 :(得分:0)
审核数据更改的最佳方法是通过数据库表上的触发器。在您的情况下,您可能只想更新最后一个人进行更改。或者,您可能需要一个完整的审核解决方案,您可以在其中存储以前的值,以便在出错时轻松恢复它们。但关键是要在数据库上而不是通过应用程序执行此操作。数据库更改通常通过应用程序以外的来源进行,您将想知道是否也发生了这种情况。假设某人入侵数据库并更新了数据,您是不是希望能够轻松找到旧数据,或者知道是谁通过查询窗口而不是通过应用程序执行此操作?如果您一次需要获取大量数据,则可能还需要知道数据是否已通过数据导入进行了更改。