每次我需要设计一个新的数据库时,我都会花一些时间考虑如何设置数据库模式来保存更改的审核日志.
这里已经提出了一些问题,但我不同意所有场景都有一个最好的方法:
我还偶然发现了这篇关于维护数据库更改日志的有趣文章,该文章试图列出每种方法的优缺点.它写得很好并且有很多有趣的信息,但它使我的决定更加困难.
我的问题是:是否有一个我可以使用的参考,可能是一本书或类似决策树的东西,我可以参考决定我应该根据一些输入变量去哪种方式,例如:
我知道的方法是:
1.为创建和修改的日期和用户添加列
表格示例:
主要缺点:我们失去了修改的历史.提交后无法回滚.
2.仅插入表格
表格示例:
主要缺点:如何保持外键最新?需要巨大的空间
3.为每个表创建单独的历史记录表
历史表示例:
主要缺点:需要复制所有审计表.如果架构发生更改,则还需要迁移所有日志.
4.为所有表创建合并历史记录表
历史表示例:
主要缺点:如果需要,我能否轻松重建记录(回滚)?new_value列需要是一个巨大的字符串,因此它可以支持所有不同的列类型.
我需要创建一个数据库表来存储不同的更改日志/审核(当添加,删除,修改等内容时).我不需要存储特别详细的信息,所以我想的是:
我在这里错过了什么吗?显然我可以继续改进设计,虽然我不打算让它变得复杂(为事件类型创建其他表格或类似的东西是不可能的,因为它是我需要的复杂因素).
关于在数据库中对数据进行版本控制,我已经阅读了关于SO的一些问题(比如这一个).
我喜欢上面提到的一些建议.我有最长的时间想要(需要)修改我的许多桌子,但从来没有绕过它.作为一个只有简单的数据库工作的程序员,我想知道如何才能真正做到这一点.
我不是要求SQL语法中的实际解决方案.我最终可以为自己解决这个问题(或者在时机成熟时发布).我只是要求人们评论他们将如何进行评论以及如果我要"修改"数亿条记录,可能会出现任何潜在的性能问题.或者任何其他建议,只要它基于以下示例.
举个简单的例子:
Person
------------------------------------------------
ID UINT NOT NULL,
PersonID UINT NOT NULL,
Name VARCHAR(200) NOT NULL,
DOB DATE NOT NULL,
Email VARCHAR(100) NOT NULL
Audit
------------------------------------------------
ID UINT NOT NULL,
UserID UINT NOT NULL, -- Who
TableName VARCHAR(50) NOT NULL, -- What
OldRecID UINT NOT NULL, -- Where
NewRecID UINT NOT NULL,
AffectedOn DATE NOT NULL, -- When
Comment VARCHAR(500) NOT NULL -- Why
Run Code Online (Sandbox Code Playgroud)
如果TableName是一个字符串,我不确定如何将Audit表链接到任何其他表(例如Person)?
另外,假设我有三个GUI来填充:
要完成1和2,查询Person表或Audit表会更好吗?
要完成3,所谓的数据库专家是否只需获取所有记录并将其传递给软件进行处理,或按PersonID和受影响日期分组?这通常是在一个查询中处理还是多个?
(与版本化数据库模式无关)
与数据库接口的应用程序通常具有由来自许多表的数据组成的域对象.假设应用程序支持这些域对象的CVS意义上的版本控制.
对于某些仲裁域对象,您将如何设计数据库模式来处理此要求?有经验可以分享吗?
我有使用Codeigniter编写的系统和使用MySQL的数据库.系统具有用户,具有不同权限的用户组等.拥有许多具有多对多关系的mysql表.
我有一些表:
目前,我正在记录用户所做的这些表的数据的每个更改.用户可以根据其权限更改这些数据.存储日志的更改只是简单的形式
A user changed product features with id of A8767
B user added new customer with id 56
C user edited content of orderlist
A user added new product (id: A8767) to order (id: or67)
...
Run Code Online (Sandbox Code Playgroud)
我希望保留所有对每个细节所做的更改,例如编辑Stackoverflow问题的历史记录.我可以考虑log_table设计以保持各种表的所有数据更改.有没有办法,教程,引擎,插件来做到这一点?只有我能想到制作每张桌子的副本并继续存储它们的变化,但我不认为它的好方法.
我是为我们的公共站点构建新内容管理系统的团队的一员.我正在尝试找到构建版本控制机制的最简单,最好的方法.对象模型非常基础.我们有一个抽象的"BaseArticle"类,其中包含版本无关/元数据的属性,例如"Heading"和"CreatedBy".许多类继承自此类,例如"DocumentArticle",它具有属性"URL",该属性将是文件的路径."WebArticle"也从"BaseArticle"继承和包括"FurtherInfo"属性和"标签"的对象,其中包括"身体",将持有要显示的HTML(Tab对象不从任何派生)的集合."新闻文章"和"JobArticle"继承自"WebArticle".我们有其他派生类,但这些提供了足够的示例.
我们提出了两种持久化修订控制的方法.我将这些称为"Approach1"和"Approach2".我使用SQL Server来做每个的基本图表:

使用Approach1,计划将通过数据库更新来保留新版本的文章.将为更新设置触发器,并将旧数据插入xxx_Versions表中.我认为需要在每个表上配置触发器.这种方法确实具有以下优点:每个文章的唯一"头部"版本保存在主表中,旧版本被放弃.这样可以轻松地将文章的头版本从开发/登台数据库复制到Live文件.
使用Approach2,计划将用于插入数据库的新版本的文章.文章的头版将通过视图确定.这似乎具有更少的表和更少的代码(例如,不是触发器)的优点.
请注意,使用这两种方法,计划是为映射到相关对象的表调用Upsert存储过程(我们必须记住处理添加新文章的情况).这个upsert存储过程将为它派生的类调用它,例如upsert_NewsArticle将调用upsert_WebArticle等.
我们正在使用SQL Server 2005,虽然我认为这个问题与数据库风格无关.我做了一些广泛的互联网拖网,并找到了两种方法的参考.但我没有发现任何比较两者的东西,并表明其中一个更好.我认为,对于世界上所有的数据库书籍,这种方法的选择必须先出现.
我的问题是:哪种方法最好,为什么?
sql database version-control database-design content-management-system
对于在非平凡的生产环境中拥有django应用程序的人,您如何处理数据库迁移?我知道有south,但如果涉及任何实质性的事情,似乎会错过很多.
另外两个选项(我能想到或已经使用过)是在测试数据库上进行更改,然后(使用应用程序脱机)并导入该sql导出.或者,也许是一个风险更高的选择,实时对生产数据库进行必要的更改,如果出现任何问题,还原为备份.
您通常如何处理数据库迁移和架构更改?
Martin Fowler 在这里为定期任务的调度定义了一个优雅的对象模型,它非常好地映射到OO代码.但是,将此映射到关系数据库模式以实现持久性是很棘手的.
任何人都可以建议一个模式+ SQL组合来封装他描述的所有功能,特别是在第11页的图像中.相交和联合是相当明显的 - 复杂性在于表示'时态表达式',它采用可变参数并且必须被解释不同的,然后将它们组合成'时间集'.
需要说明的是,有很多方法可以表示关系数据库中重复事件的概念.我希望大家输入的是如何映射这个特定的模型.
一些可能的选择:
序列化参数列表并将结果存储在varchar()中不是解决方案,因为该方法会阻止基于集合的查询:)
我正在寻找一个合适的过程来保存数据库中的行(及其关系)的修订或快照.
以电子商务平台为例 -
我看了几个概念,一个是重复的表,另一个是临时数据库,另一个是保留修订版ID和活动标志.
虽然我很欣赏没有人能真正告诉我最适合我应用的解决方案,因为这是一个容易接受意见的问题,我希望有人可能通过比较来证明优势/劣势.我已经阅读了很多关于SO的问题,以及关于各种实现的一些文章,但没有一个真正比较每个想法或指出它们最适合的地方.下面我概述了我对每个概念的理解.
将信息存储在与需要快照的数据相关的行中.即在一个在线商店的订单表中的列中保留一个地址.
"时间感知"的数据库行,即它们的上下文是两个日期时间之间的时间.数据可以在时间表位于时间表的上下文之间加入.
有一个表来跟踪所有表的更改并记下它所涉及的行以及它在时间方面何时有效.
我已经在这里查看了以下有关SO和其他资源的问题
编辑:我没有用特定的DBMS标记这篇文章的原因,因为我希望这个概念尽可能多地与平台一起工作,目前是DBMS独立的,抽象层允许它与MySQL一起工作MSSQL但希望将来能够支持其他人.
database ×5
sql ×3
audit ×2
mysql ×2
versioning ×2
django ×1
django-south ×1
logging ×1
migration ×1
orm ×1
php ×1
python ×1
recurrence ×1
scheduling ×1
sql-server ×1
t-sql ×1
types ×1