数据库设计 – 数据库设计的时间点“快照”的数据?

如何设计一个支持允许应用程序用户在某个时间点创建其数据快照的功能数据库,有点像版本控制.

它将使用户能够回头看看过去他们的数据看起来像什么.

假设“快照”的数据很复杂,包括多个表的连接.

我正在寻找一种方式来为每个应用程序用户提供对数据进行快照并返回的能力.整个数据库快照不是我正在寻找的.

编辑:谢谢你的答案. 6NF的答案是令人信服的,因为它的简单性,使快照数据解除规范化的建议.

说明:这不是一个数据仓库问题,也不是关于数据库备份和还原的问题;它关于如何构建一个模式,允许我们在某个时间点捕获一组特定的相关数据的状态.快照由应用程序用户在看到合适时生成.用户不会快照整个数据库,只是他们感兴趣的数据对象.

解决方法

我们通过创建单独的数据库表来创建单独的数据库表,其中包含我们想要快照的数据,但是非规范化,即每个记录都包含所有需要理解的数据,而不是引用可能存在或可能不再存在的id.它还为每行添加了一个日期.

然后,我们为特定的插入或更新生成了对所有受影响的表进行连接的触发器,并将其插入到快照表中.

这样一来,写一些将用户数据恢复到一个时间点的东西就是微不足道的.

如果你有一张桌子:

用户

id,firstname,lastname,department_id

部:

id,name,departmenthead_id

您的用户表的快照可能如下所示:

user_id,user_firstname,user_lastname,department_id,department_name,deparmenthead_id,deparmenthead_firstname,departmenthead_lastname,snapshot_date

和一个查询

INSERT INTO usersnapshot
SELECT user.id AS user_id,user.firstname AS user_firstname,user.lastname AS user_lastname,department.id AS department_id,department.name AS department_name
departmenthead.id AS departmenthead_id,departmenthead.firstname AS departmenthead_firstname,departmenthead.lastname AS departmenthead_lastname,GETDATE() AS snapshot_date
FROM user
INNER JOIN department ON user.department_id = department.id
INNER JOIN user departmenthead ON department.departmenthead_id = departmenthead.id

这可以确保快照中的每一行在时间上都是正确的,即使部门或部门主管同时发生变化.

相关文章

(一)日志传送架构 (1.1)相关服务器 主服务器 :用于生产的服务器,上面运行这生产SQL Server数据库...
(一)事故背景 最近在SQL Server 2012生产数据库上配置完事物复制(发布订阅)后,生产数据库业务出现了...
(一)测试目的 目前公司使用的SQL SERVER 2012高可用环境为主备模式,其中主库可执行读写操作,备库既...
(一)背景个人在使用sql server时,用到了sql server的发布订阅来做主从同步,类似MySQL的异步复制。在...
UNION和OR谓词 找出 product 和 product2 中售价高于 500 的商品的基本信息. select * from product wh...
datawhale组队学习task03