标签: temporal-database

如何将实体重新保存为Doctrine 2中的另一行

假设我有实体$e.有没有通用的方法将它存储为另一行,它将具有相同的实体数据但是另一个主键?

为什么我需要这个:我正在实现某种时态数据库模式,而不是更新行我只需要创建另一个.

php doctrine temporal-database doctrine-orm

71
推荐指数
1
解决办法
4万
查看次数

为什么我们需要时态数据库?

我正在阅读有关时态数据库的内容,看起来它们已经建立了时间方面.我想知道为什么我们需要这样的模型?

它与普通的RDBMS有何不同?我们不能有一个普通的数据库,即RDBMS,并说有一个触发器,它将时间戳与发生的每个事务相关联吗?可能会有性能损失.但我仍然对在市场上具有强大案例的时态数据库持怀疑态度.

目前的任何数据库都支持这样的功能吗?

database temporal-database

48
推荐指数
5
解决办法
3万
查看次数

如何使用JPA实现时态表?

我想知道如何使用EclipseLink在JPA 2中实现时态表.时间上我指的是定义有效期的表.

我面临的一个问题是引用表不再具有对引用表(时态表)的外键约束,因为引用表的性质现在它们的主键包括有效期.

  • 我如何映射我的实体的关系?
  • 这是否意味着我的实体不再与那些有效时间实体建立关系?
  • 我是否应该在某种服务或专门的DAO中手动执行初始化这些关系的责任?

我发现的唯一一件事就是一个名为DAO Fusion的框架来处理这个问题.

  • 有没有其他方法可以解决这个问题?
  • 您能否提供有关此主题的示例或资源(带有时态数据库的JPA)?

这是一个数据模型及其类的虚构示例.它起初是一个简单的模型,不需要处理时间方面:

第一种情景:非时间模型

数据模型: 非时态数据模型

团队:

@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)

java temporal-database eclipselink jpa-2.0

25
推荐指数
1
解决办法
1万
查看次数

Anchor Modeling的优点和缺点是什么?

我目前正在尝试创建一个数据库,其中很大一部分数据是暂时的.在阅读了许多这样做的技术(大多数涉及6nf标准化)后,我遇到了锚点建模.

我正在开发的模式非常类似于Anchor Modeling模型,特别是因为用例(Temporal Data + Known Unknowns)是如此相似,我很想完全接受它.

我遇到的两个最大的问题是,我找不到任何详细说明这种方法的负面影响的内容,而且我找不到任何对生产中用于战争故事和陷阱的组织的引用,这些都是我需要注意的.

我想知道这里是否有人熟悉,可以简要地阐述一些否定因素(因为积极因素在研究论文及其网站上得到了很好的宣传),以及在生产环境中使用它的任何经验.

sql database-design temporal-database database-normalization anchor-modeling

15
推荐指数
3
解决办法
5613
查看次数

实体框架不使用时态表

我正在使用数据库第一实体框架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

14
推荐指数
2
解决办法
5321
查看次数

历史/可审计数据库

这个问题与我在其他问题中可以找到的架构有关. 基本上在我的数据库中,我存储用户,位置,传感器等.所有这些都可以由用户在系统中编辑,并且可以删除.

但是 - 当编辑或删除项目时,我需要存储旧数据; 我需要能够在变更之前看到数据是什么.

数据库中还有不可编辑的项目,例如"读数".他们真的更像是一个日志.读数记录在传感器上,因为它是特定传感器的读数.

如果我生成一个读数报告,我需要能够看到读取时位置或传感器的属性.

基本上我应该能够重建任何时间点的数据.

现在,我之前已经完成了这项工作,并通过在每个可编辑表中添加以下列来使其运行良好:

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字段.这允许跟踪所有更改,以便我们始终可以看到谁更改了记录.不确定可能会有多大差异.

谢谢.

sql database database-design temporal-database

13
推荐指数
1
解决办法
4014
查看次数

在实体上存储更改:MySQL是否是正确的解决方案?

我想存储我在"实体"表上所做的更改.这应该像一个日志.目前它在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.

现在,有两件事我不喜欢:

  1. 所有数据都存储为TEXT- 虽然大多数(小于1%)不是真正的文本,但就我而言,大多数值都是DOUBLE.这是一个大问题吗? …

mysql database-design temporal-database database-partitioning entity-attribute-value

11
推荐指数
2
解决办法
2926
查看次数

双时态NoSQL数据库是否有任何设计模式?

我很好奇是否有人已经实现甚至知道在NoSQL平台上构建的任何双时态数据库(例如,riak).

database database-design temporal-database temporal nosql

10
推荐指数
1
解决办法
3572
查看次数

数据库行快照/修订

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

以电子商务平台为例 -

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

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

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

重复的表

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

好处

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

缺点

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

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

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

好处

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

缺点

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

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

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

好处

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

缺点

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

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

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

database temporal-database

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

如何通过保存数据将存在表更改为SQL Temporal表?

我有很多数据表,我想转换为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

8
推荐指数
3
解决办法
933
查看次数