假设我有实体$e.有没有通用的方法将它存储为另一行,它将具有相同的实体数据但是另一个主键?
为什么我需要这个:我正在实现某种时态数据库模式,而不是更新行我只需要创建另一个.
我正在阅读有关时态数据库的内容,看起来它们已经建立了时间方面.我想知道为什么我们需要这样的模型?
它与普通的RDBMS有何不同?我们不能有一个普通的数据库,即RDBMS,并说有一个触发器,它将时间戳与发生的每个事务相关联吗?可能会有性能损失.但我仍然对在市场上具有强大案例的时态数据库持怀疑态度.
目前的任何数据库都支持这样的功能吗?
我想知道如何使用EclipseLink在JPA 2中实现时态表.时间上我指的是定义有效期的表.
我面临的一个问题是引用表不再具有对引用表(时态表)的外键约束,因为引用表的性质现在它们的主键包括有效期.
我发现的唯一一件事就是一个名为DAO Fusion的框架来处理这个问题.
这是一个数据模型及其类的虚构示例.它起初是一个简单的模型,不需要处理时间方面:
第一种情景:非时间模型
数据模型:

团队:
@Entity
public class Team implements Serializable {
private Long id;
private String name;
private Integer wins = 0;
private Integer losses = 0;
private Integer draws = 0;
private List<Player> players = new ArrayList<Player>();
public Team() {
}
public Team(String name) {
this.name = name;
}
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SEQTEAMID")
@SequenceGenerator(name="SEQTEAMID", sequenceName="SEQTEAMID", allocationSize=1)
public Long getId() {
return id;
}
public …Run Code Online (Sandbox Code Playgroud) 我目前正在尝试创建一个数据库,其中很大一部分数据是暂时的.在阅读了许多这样做的技术(大多数涉及6nf标准化)后,我遇到了锚点建模.
我正在开发的模式非常类似于Anchor Modeling模型,特别是因为用例(Temporal Data + Known Unknowns)是如此相似,我很想完全接受它.
我遇到的两个最大的问题是,我找不到任何详细说明这种方法的负面影响的内容,而且我找不到任何对生产中用于战争故事和陷阱的组织的引用,这些都是我需要注意的.
我想知道这里是否有人熟悉,可以简要地阐述一些否定因素(因为积极因素在研究论文及其网站上得到了很好的宣传),以及在生产环境中使用它的任何经验.
sql database-design temporal-database database-normalization anchor-modeling
我正在使用数据库第一实体框架6.在将我的模式中的一些表更改为临时表后,我在尝试插入新数据时开始收到以下错误:
Cannot insert an explicit value into a GENERATED ALWAYS column in table '<MyDatabase>.dbo.<MyTableName>. Use INSERT with a column list to exclude the GENERATED ALWAYS column, or insert a DEFAULT into GENERATED ALWAYS column.
看起来EF正在尝试更新PERIOD由系统管理的列的值.
从EDMX文件中删除列似乎可以解决问题,但这不是一个可行的解决方案,因为每次从数据库重新生成模型时都会重新添加列.
c# sql-server temporal-database entity-framework-6 sql-server-2016
这个问题与我在其他问题中可以找到的架构有关. 基本上在我的数据库中,我存储用户,位置,传感器等.所有这些都可以由用户在系统中编辑,并且可以删除.
但是 - 当编辑或删除项目时,我需要存储旧数据; 我需要能够在变更之前看到数据是什么.
数据库中还有不可编辑的项目,例如"读数".他们真的更像是一个日志.读数记录在传感器上,因为它是特定传感器的读数.
如果我生成一个读数报告,我需要能够看到读取时位置或传感器的属性.
基本上我应该能够重建任何时间点的数据.
现在,我之前已经完成了这项工作,并通过在每个可编辑表中添加以下列来使其运行良好:
valid_from
valid_to
edited_by
Run Code Online (Sandbox Code Playgroud)
如果valid_to = 9999-12-31 23:59:59则那是当前记录.如果valid_to等于valid_from,则删除记录.
但是,我对我需要用来强制执行外键一致性的触发器感到满意.
我可以通过使用"PostgreSQL"数据库的扩展来避免触发器.这提供了一个名为"period"的列类型,它允许您存储两个日期之间的一段时间,然后允许您执行CHECK约束以防止重叠周期.这可能是一个答案.
我想知道是否有另一种方式.
我见过人们提到使用特殊的历史表,但我真的不喜欢几乎每1个表维护2个表的想法(尽管它仍然可能).
也许我可以砍掉我的初步实施,以不打扰检查不属于"当前"记录的一致性 - 即只懒得去查制约记录中,其中的失效日期9999-12-31 23:59:59.毕竟,使用历史表的人似乎没有对这些表进行约束检查(出于同样的原因,你需要触发器).
有没有人对此有任何想法?
PS - 标题还提到了可审计的数据库.在我之前提到的系统中,总是有edited_by字段.这允许跟踪所有更改,以便我们始终可以看到谁更改了记录.不确定可能会有多大差异.
谢谢.
我想存储我在"实体"表上所做的更改.这应该像一个日志.目前它在MySQL中使用此表实现:
CREATE TABLE `entitychange` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`entity_id` int(10) unsigned NOT NULL,
`entitytype` enum('STRING_1','STRING_2','SOMEBOOL','SOMEDOUBLE','SOMETIMESTAMP') NOT NULL DEFAULT 'STRING_1',
`when` TIMESTAMP NOT NULL,
`value` TEXT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Run Code Online (Sandbox Code Playgroud)
entity_id=我entity桌子的主键.entitytype= entity表中更改的字段.有时只改变一个字段,有时多个.一个变化=一排.value =字段"新值"的字符串表示形式.将Field entity.somedouble从3 更改为2 时的示例,我运行这些查询:
UPDATE entity SET somedouble = 2 WHERE entity_id = 123;
INSERT INTO entitychange (entity_id,entitytype,value) VALUES (123,'SOMEDOUBLE',2);
Run Code Online (Sandbox Code Playgroud)
我需要select更改过去15天的特定实体和实体类型.例如:最后15天内最后一次更改SOMEDOUBLE为entity_id 123.
现在,有两件事我不喜欢:
TEXT- 虽然大多数(小于1%)不是真正的文本,但就我而言,大多数值都是DOUBLE.这是一个大问题吗? …mysql database-design temporal-database database-partitioning entity-attribute-value
我很好奇是否有人已经实现甚至知道在NoSQL平台上构建的任何双时态数据库(例如,riak).
我正在寻找一个合适的过程来保存数据库中的行(及其关系)的修订或快照.
以电子商务平台为例 -
我看了几个概念,一个是重复的表,另一个是临时数据库,另一个是保留修订版ID和活动标志.
虽然我很欣赏没有人能真正告诉我最适合我应用的解决方案,因为这是一个容易接受意见的问题,我希望有人可能通过比较来证明优势/劣势.我已经阅读了很多关于SO的问题,以及关于各种实现的一些文章,但没有一个真正比较每个想法或指出它们最适合的地方.下面我概述了我对每个概念的理解.
将信息存储在与需要快照的数据相关的行中.即在一个在线商店的订单表中的列中保留一个地址.
"时间感知"的数据库行,即它们的上下文是两个日期时间之间的时间.数据可以在时间表位于时间表的上下文之间加入.
有一个表来跟踪所有表的更改并记下它所涉及的行以及它在时间方面何时有效.
我已经在这里查看了以下有关SO和其他资源的问题
编辑:我没有用特定的DBMS标记这篇文章的原因,因为我希望这个概念尽可能多地与平台一起工作,目前是DBMS独立的,抽象层允许它与MySQL一起工作MSSQL但希望将来能够支持其他人.
我有很多数据表,我想转换为Microsoft Temporal表,但是当我想转换时态表导致丢失我的数据.我的代码是:
Alter TABLE dbo.Employee
(
[EmployeeID] int NOT NULL PRIMARY KEY CLUSTERED
, [Name] nvarchar(100) NOT NULL
, [Position] varchar(100) NOT NULL
, [Department] varchar(100) NOT NULL
, [Address] nvarchar(1024) NOT NULL
, [AnnualSalary] decimal (10,2) NOT NULL
, [ValidFrom] datetime2 (2) GENERATED ALWAYS AS ROW START
, [ValidTo] datetime2 (2) GENERATED ALWAYS AS ROW END
, PERIOD FOR SYSTEM_TIME (ValidFrom, ValidTo)
)
WITH (SYSTEM_VERSIONING = ON (HISTORY_TABLE = dbo.EmployeeHistory));
Run Code Online (Sandbox Code Playgroud)
如何通过保存数据将存在表改为Sql时态表?
sql sql-server temporal-database sql-server-2016 temporal-tables
database ×4
sql ×3
sql-server ×2
c# ×1
doctrine ×1
doctrine-orm ×1
eclipselink ×1
java ×1
jpa-2.0 ×1
mysql ×1
nosql ×1
php ×1
temporal ×1