SQL历史表设计

我需要设计一个历史记录表来跟踪在编辑时在特定记录上更改的多个值.

例:
用户被呈现一个页面来编辑记录.

标题:先生
姓名:乔
电话:555-1234
dob:1900-10-10

如果用户更改了这些值,我需要跟踪旧值并记录新的值.

我想到使用这样的表:

历史 – – – – – – – –

ID
modifiedUser
modifiedDate
表名
的recordId
属性oldValue
NEWVALUE

一个问题是它将为每个编辑有多个条目.
我正在考虑另一张桌子来分组,但你仍然有同样的问题.

我也在考虑在历史表中保留一行的副本,但是似乎也没有效率.

有任何想法吗?

谢谢!

解决方法

您应该定义您感兴趣的效率类型:您可以提高存储空间,记录历史记录所需的工作效率(交易成本),或者以特定方式查询记录的历史时间的效率.

我注意到您在建议的历史表中有一个表名,这意味着要记录多个表的历史记录,这将排除将记录的精确副本存储在历史记录表中的选项,除非所有表您的跟踪将始终具有相同的结构.

如果您单独处理列,即每个历史记录只记录一个列值,则必须设计一个能够准确表示您将遇到的每个列值的多态数据类型.

如果存储空间的效率是您的主要关注点,那么我将把历史记录分解成多个表.这意味着将新的列值表链接到编辑事件表和列定义表.编辑事件表将记录用户和时间戳,列定义表将记录表,列和数据类型.正如@njk所说,您不需要旧的列值,因为您可以随时查询以前的编辑以获取旧值.预期这种方法可以节省空间的主要原因是假设一般来说,用户将编辑可用字段的一小部分.

如果查询的效率是您的主要关注点,我将为您正在跟踪的每个表设置历史记录表,并向每个历史记录表添加用户和时间戳字段.这对于编辑的交易成本也应该是有效的.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...