我目前正在开发一个应用程序,该应用程序基本上允许用户在线提交数据并存储数据。我们为数据分配一个唯一的ID,以便以后用户可以通过ID检索数据,以及修改或删除数据。但是大多数时候,我们希望用户继续提交新数据(并为新数据分配新的ID)。我们需要跟踪所有历史数据,因此,如果用户修改/删除数据,我们将永远不会修改/删除原始数据,而是将数据的新快照保存到当前表中。我们始终会检索数据的最新快照(按唯一ID)。
当前,我们以这种方式获取最新的快照-按唯一ID对数据进行分组,并按db主键排序,然后找到Max(db主键)条目。我正在考虑向快照添加状态标志,以指示哪个快照处于活动状态,以便我们可以简化SQL查询。但是我们的数据库管理员告诉我们,这不利于性能(或使过程复杂化),因为这意味着每次用户修改数据时,我们都需要采取额外的步骤来停用当前快照,并且更新操作比搜索更昂贵用于数据库。但是对我来说,用于获取数据的SQL查询现在变得太复杂了,因为我们拥有所有内容的快照,因此我们几乎需要对所有数据进行快照分组,并且当我们尝试检索多种类型的已提交数据时,它也容易出错。数据是相关的(我们必须非常小心sql中的哪个位置才能获取最新快照)。因此,我想对此问题发表一些意见。有什么意见或建议吗?或只是教育我为什么拥有状态标志是个坏主意。
答案 0 :(得分:0)
状态标志是完成所需内容的最佳方法之一。实际上,使用Max(db主键)比尝试查找二进制值(0或1)要消耗更多的处理能力。
答案 1 :(得分:0)
该主题在我看来是审计表跟踪。最好的办法是在表上创建触发器,并将更改(例如插入,更新,删除)写入单独的表中。
例如您有表CUSTOMER和 AUDIT _ CUSTOMER。 在CUSTOMER中,您拥有当前数据,在AUDIT_CUSTOMER中,您拥有整个历史记录。
取决于设计的审核表具有这样的结构
DT - date and time
USER_NAME - user changed data
KIND - I,U,D (insert, update, delete)
oryginal_table_fields_here
您只需在触发器中插入数据,就可以简单地检索当前数据,如果需要,可以通过将源表从NORMAL更改为AUDIT并按DT过滤来及时返回