相关疑难解决方法(0)

审计日志的数据库设计

每次我需要设计一个新的数据库时,我都会花一些时间考虑如何设置数据库模式来保存更改的审核日志.

这里已经提出了一些问题,但我不同意所有场景都有一个最好的方法:

我还偶然发现了这篇关于维护数据库更改日志的有趣文章,该文章试图列出每种方法的优缺点.它写得很好并且有很多有趣的信息,但它使我的决定更加困难.

我的问题是:是否有一个我可以使用的参考,可能是一本书或类似决策树的东西,我可以参考决定我应该根据一些输入变量去哪种方式,例如:

  • 数据库模式的成熟度
  • 如何查询日志
  • 需要重新创建记录的概率
  • 更重要的是:写或读性能
  • 正在记录的值的性质(字符串,数字,blob)
  • 存储空间可用

我知道的方法是:

1.为创建和修改的日期和用户添加列

表格示例:

  • ID
  • _1
  • _2
  • VALUE_3
  • 创建日期
  • 修改日期
  • 由...制作
  • modified_by

主要缺点:我们失去了修改的历史.提交后无法回滚.

2.仅插入表格

表格示例:

  • ID
  • _1
  • _2
  • VALUE_3
  • 删除(布尔值)
  • 用户

主要缺点:如何保持外键最新?需要巨大的空间

3.为每个表创建单独的历史记录表

历史表示例:

  • ID
  • _1
  • _2
  • VALUE_3
  • VALUE_4
  • 用户
  • 删除(布尔值)
  • 时间戳

主要缺点:需要复制所有审计表.如果架构发生更改,则还需要迁移所有日志.

4.为所有表创建合并历史记录表

历史表示例:

  • TABLE_NAME
  • 领域
  • 用户
  • NEW_VALUE
  • 删除(布尔值)
  • 时间戳

主要缺点:如果需要,我能否轻松重建记录(回滚)?new_value列需要是一个巨大的字符串,因此它可以支持所有不同的列类型.

audit logging database-design

143
推荐指数
4
解决办法
8万
查看次数

SQL Server中的SYSNAME数据类型是什么?

什么是SQL Server SYSNAME数据类型?BOL说:

sysname数据类型用于存储对象名称的表列,变量和存储过程参数.

但我真的不明白.是否有可以提供的用例?

sql t-sql sql-server types

119
推荐指数
3
解决办法
12万
查看次数

更改日志/审计数据库表的最佳设计?

我需要创建一个数据库表来存储不同的更改日志/审核(当添加,删除,修改等内容时).我不需要存储特别详细的信息,所以我想的是:

  • id(用于活动)
  • 触发它的用户
  • 事件名称
  • 事件描述
  • 事件的时间戳

我在这里错过了什么吗?显然我可以继续改进设计,虽然我不打算让它变得复杂(为事件类型创建其他表格或类似的东西是不可能的,因为它是我需要的复杂因素).

database audit database-design

105
推荐指数
6
解决办法
9万
查看次数

数据库 - 数据版本控制

关于在数据库中对数据进行版本控制,我已经阅读了关于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. 特定人员ID的完整记录
  2. 列出所有人的表格视图(按ID)
  3. 一个视图,显示每个人在每个条目下面的修订信息(每人的修订数量,修订日期,修订注释等),按最新修订排序.

要完成1和2,查询Person表或Audit表会更好吗?

要完成3,所谓的数据库专家是否只需获取所有记录并将其传递给软件进行处理,或按PersonID和受影响日期分组?这通常是在一个查询中处理还是多个?

database versioning database-design

52
推荐指数
2
解决办法
2万
查看次数

版本控制数据库持久化对象,你会怎样?

(与版本化数据库模式无关)

与数据库接口的应用程序通常具有由来自许多表的数据组成的域对象.假设应用程序支持这些域对象的CVS意义上的版本控制.

对于某些仲裁域对象,您将如何设计数据库模式来处理此要求?有经验可以分享吗?

database versioning database-design

42
推荐指数
2
解决办法
6878
查看次数

存储所有数据更改与每个细节(如Stackoverflow)

我有使用Codeigniter编写的系统和使用MySQL的数据库.系统具有用户,具有不同权限的用户组等.拥有许多具有多对多关系的mysql表.

我有一些表:

  • 项目
  • 合同
  • 顾客
  • 制品
  • product_features
  • 命令
  • order_features
  • order_products
  • 等等...

目前,我正在记录用户所做的这些表的数据的每个更改.用户可以根据其权限更改这些数据.存储日志的更改只是简单的形式

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设计以保持各种表的所有数据更改.有没有办法,教程,引擎,插件来做到这一点?只有我能想到制作每张桌子的副本并继续存储它们的变化,但我不认为它的好方法.

php mysql revision-history

21
推荐指数
1
解决办法
8087
查看次数

如何使用修订历史记录设计数据库?

我是为我们的公共站点构建新内容管理系统的团队的一员.我正在尝试找到构建版本控制机制的最简单,最好的方法.对象模型非常基础.我们有一个抽象的"BaseArticle"类,其中包含版本无关/元数据的属性,例如"Heading"和"CreatedBy".许多类继承自此类,例如"DocumentArticle",它具有属性"URL",该属性将是文件的路径."WebArticle"也从"BaseArticle"继承和包括"FurtherInfo"属性和"标签"的对象,其中包括"身体",将持有要显示的HTML(Tab对象不从任何派生)的集合."新闻文章"和"JobArticle"继承自"WebArticle".我们有其他派生类,但这些提供了足够的示例.

我们提出了两种持久化修订控制的方法.我将这些称为"Approach1"和"Approach2".我使用SQL Server来做每个的基本图表:方法数据库图1 方法数据库图2

使用Approach1,计划将通过数据库更新来保留新版本的文章.将为更新设置触发器,并将旧数据插入xxx_Versions表中.我认为需要在每个表上配置触发器.这种方法确实具有以下优点:每个文章的唯一"头部"版本保存在主表中,旧版本被放弃.这样可以轻松地将文章的头版本从开发/登台数据库复制到Live文件.

使用Approach2,计划将用于插入数据库的新版本的文章.文章的头版将通过视图确定.这似乎具有更少的表和更少的代码(例如,不是触发器)的优点.

请注意,使用这两种方法,计划是为映射到相关对象的表调用Upsert存储过程(我们必须记住处理添加新文章的情况).这个upsert存储过程将为它派生的类调用它,例如upsert_NewsArticle将调用upsert_WebArticle等.

我们正在使用SQL Server 2005,虽然我认为这个问题与数据库风格无关.我做了一些广泛的互联网拖网,并找到了两种方法的参考.但我没有发现任何比较两者的东西,并表明其中一个更好.我认为,对于世界上所有的数据库书籍,这种方法的选择必须先出现.

我的问题是:哪种方法最好,为什么?

sql database version-control database-design content-management-system

20
推荐指数
1
解决办法
7424
查看次数

django生产的数据库迁移

对于在非平凡的生产环境中拥有django应用程序的人,您如何处理数据库迁移?我知道有south,但如果涉及任何实质性的事情,似乎会错过很多.

另外两个选项(我能想到或已经使用过)是在测试数据库上进行更改,然后(使用应用程序脱机)并导入该sql导出.或者,也许是一个风险更高的选择,实时对生产数据库进行必要的更改,如果出现任何问题,还原为备份.

您通常如何处理数据库迁移和架构更改?

python mysql migration django django-south

17
推荐指数
1
解决办法
7684
查看次数

福勒时态表达的关系模式

Martin Fowler 在这里为定期任务的调度定义了一个优雅的对象模型,它非常好地映射到OO代码.但是,将此映射到关系数据库模式以实现持久性是很棘手的.

任何人都可以建议一个模式+ SQL组合来封装他描述的所有功能,特别是在第11页的图像中.相交和联合是相当明显的 - 复杂性在于表示'时态表达式',它采用可变参数并且必须被解释不同的,然后将它们组合成'时间集'.

需要说明的是,有很多方法可以表示关系数据库中重复事件的概念.我希望大家输入的是如何映射这个特定的模型.

一些可能的选择:

  • 'Meta'表定义参数的数量和使用.丑陋,但可能有效.但是,只有极少数的"时间表达"形式,因此它提供的极大灵活性可能太多了.
  • 某种形式的表继承,由Postgres(以及可能是其他)RBMS支持.

序列化参数列表并将结果存储在varchar()中不是解决方案,因为该方法会阻止基于集合的查询:)

sql orm recurrence scheduling

16
推荐指数
2
解决办法
4872
查看次数

数据库行快照/修订

我正在寻找一个合适的过程来保存数据库中的行(及其关系)的修订或快照.

以电子商务平台为例 -

  • 客户创建订单.订单与帐单邮寄地址和送货地址相关联.
  • 然后,所述客户在其简档中更改其地址簿中的地址.
  • 原始订单的地址不应更改.

我看了几个概念,一个是重复的表,另一个是临时数据库,另一个是保留修订版ID和活动标志.

虽然我很欣赏没有人能真正告诉我最适合我应用的解决方案,因为这是一个容易接受意见的问题,我希望有人可能通过比较来证明优势/劣势.我已经阅读了很多关于SO的问题,以及关于各种实现的一些文章,但没有一个真正比较每个想法或指出它们最适合的地方.下面我概述了我对每个概念的理解.

重复的表

将信息存储在与需要快照的数据相关的行中.即在一个在线商店的订单表中的列中保留一个地址.

好处

  • 数据被分段为明确相关的表,不需要连接等.
  • 无需按照以下概念中的要求仅选择活动行.
  • 假设行有时间戳,则保留时态数据库的大部分好处

缺点

  • 复制
    • 模式(当多个表修订时特别有问题)
    • 使用ORM时的模型
    • 如果快照片段数据未更改并且已重新使用,则为数据.即如果订单10次,地址存储11次(订单+当前)
  • 处理相关表中插入所需的额外代码.

时间数据库/活动或当前行标志

"时间感知"的数据库行,即它们的上下文是两个日期时间之间的时间.数据可以在时间表位于时间表的上下文之间加入.

好处

  • 没有重复的架构或模型.在一个地方进行的更改.
  • ORM模型可以处理新行的创建,无缝标记为活动等.
  • 没有复制没有进行任何更改的行.即10个订单到1个地址存储地址一次.

缺点

  • 查询变得更复杂,因为连接/ where子句需要选择"活动"行.
  • 表格被历史数据堵塞,这些数据未经常选择/调用.

仅存储已更改的列,时间.

有一个表来跟踪所有表的更改并记下它所涉及的行以及它在时间方面何时有效.

好处

  • 在未经复制的未更改数据的情况下,在修订方面优化存储.

缺点

  • 将列版本与其他数据相结合,查询要复杂得多.

我已经在这里查看了以下有关SO和其他资源的问题

编辑:我没有用特定的DBMS标记这篇文章的原因,因为我希望这个概念尽可能多地与平台一起工作,目前是DBMS独立的,抽象层允许它与MySQL一起工作MSSQL但希望将来能够支持其他人.

database temporal-database

9
推荐指数
1
解决办法
1018
查看次数