当前位置: 首页 > 面试题库 >

用于修订的数据库设计?

阴英武
2023-03-14
问题内容

我们在项目中要求将实体的所有修订(更改历史记录)存储在数据库中。目前,我们有2个为此设计的提案:

例如,对于“雇员”实体

设计1:

-- Holds Employee Entity
"Employees (EmployeeId, FirstName, LastName, DepartmentId, .., ..)"

-- Holds the Employee Revisions in Xml. The RevisionXML will contain
-- all data of that particular EmployeeId
"EmployeeHistories (EmployeeId, DateModified, RevisionXML)"

设计2:

-- Holds Employee Entity
"Employees (EmployeeId, FirstName, LastName, DepartmentId, .., ..)"

-- In this approach we have basically duplicated all the fields on Employees 
-- in the EmployeeHistories and storing the revision data.
"EmployeeHistories (EmployeeId, RevisionId, DateModified, FirstName, 
      LastName, DepartmentId, .., ..)"

还有其他方法可以做到这一点吗?

“设计1”的问题在于,每次您需要访问数据时,我们都必须解析XML。这将减慢该过程的速度,并增加一些限制,例如我们无法在修订数据字段上添加联接。

“设计2”的问题在于,我们必须在所有实体上重复每个字段(我们有大约70-80个要维护其修订的实体)。


问题答案:

千万不能把它们都放在一个表与IsCurrent鉴别属性。这只会导致一系列问题,需要代理密钥和各种其他问题。
设计2确实存在模式更改问题。如果更改了Employees表,则必须更改EmployeeHistories表以及该表随附的所有相关存储。可能使您的架构更改工作加倍。
设计1运作良好,如果做得好,不会对性能造成太大影响。您可以使用xml模式甚至索引来克服可能的性能问题。您对解析xml的评论是有效的,但是您可以使用xquery轻松创建视图-您可以将其包含在查询中并加入其中。像这样的东西

CREATE VIEW EmployeeHistory
AS
, FirstName, , DepartmentId

SELECT EmployeeId, RevisionXML.value('(/employee/FirstName)[1]', 'varchar(50)') AS FirstName,

  RevisionXML.value('(/employee/LastName)[1]', 'varchar(100)') AS LastName,

  RevisionXML.value('(/employee/DepartmentId)[1]', 'integer') AS DepartmentId,

FROM EmployeeHistories


 类似资料:
  • 问题内容: 我正在进行的一个项目在不久的将来可能会跨越几百万行,所以我正在研究我使用的数据库,因为这肯定会证明是一个问题。据我所读,一旦涉及到表的2,000,000行问题,SQL的所有形式都会出现问题。对于这些大型项目,有没有推荐好的数据库? 我正在谈论的是一个网站,归档旧条目并不理想,但是如果证明这是我无法克服的问题,则可以这样做。 谢谢。 问题答案: 我已经在MS SQL Server中使用了

  • 问题内容: 我的问题是:是否有我可以使用的参考,也许是一本书或诸如决策树之类的东西,我可以参考这些参考来基于一些输入变量来决定应该走的路,例如: 数据库架构的成熟度 如何查询日志 需要重新创建记录的概率 更重要的是:写入或读取性能 所记录的值的性质(字符串,数字,blob) 可用的存储空间 我知道的方法是: 1.添加创建和修改日期及用户的列 表格示例: id value_1 value_2 val

  • 在MySQL 数据库中只能对数据库使用的字符集和校对规则进行修改,数据库的这些特性都储存在 db.opt 文件中。下面我们来介绍一下修改数据库的基本操作。 在 MySQL 中,可以使用 ALTER DATABASE 来修改已经被创建或者存在的数据库的相关参数。修改数据库的语法格式为: 语法说明如下: ALTER DATABASE 用于更改数据库的全局特性。 使用 ALTER DATABASE 需要

  • 数据库是具有不同属性的重要数据模型之一,您可以根据需要修改它们。 以下语句是命令的基本语法。 其中定义了要修改的属性,定义了要为该属性设置的值。 下表定义了用于更改数据库的受支持属性的列表。 编号 属性名称 描述 1 STATUS 定义不同属性之间的数据库状态。 2 IMPORTING 设置导入状态。 3 DEFAULTCLUSTERID 使用ID设置默认群集。 默认情况下是。 4 DATEFOR

  • 要在运行OSV7.1的IBM i(AS/400,iSeries)计算机上使用(DB2)数据库,设置Oracle Data Modeler(4.0.2.840)的正确方法是什么? 在New/Select数据库连接下,我选择了JDBC选项卡,然后选择了“Other ThirdParty Driver”,然后输入: 驱动程序类:com.ibm.as400.access.as400jdbcdriver 数

  • 问题内容: 这可能很简单,但是找不到方法。我试图找到每个实体的最大修订小于或等于给定的修订号。 上面的代码按降序返回同一实体的多个修订。我想获得每个实体的最新不同修订版本,该修订版本应小于或等于给定的修订版本号。 作为一种解决方法,我正在过滤resultSet,如下所示。我希望可以在AuditQuery本身上进行此过滤。 解: 我们需要使用 [https://hibernate.atlassian