标签: temporal-database

数据库设计能够保存随时间变化的人的信息吗?

我们使用第三方产品来管理我们的体育中心会员资格.我们有几种会员类型(例如,初级,学生,员工,社区)和几种会员身份(例如,年度,活动,非活动,暂停).不幸的是,该产品仅记录会员当前的会员类型和状态.我希望能够跟踪我们的会员类型和状态随时间变化的方式.

目前,我们可以访问产品的数据库设计.它在SQL Server上运行,我们定期针对产品表运行自己的SQL查询,以生成我们自己的表.然后,我们将表格链接到Excel中的数据透视表以生成图表.所以我们熟悉数据库设计和SQL.但是,我们仍然坚持如何最好地解决这个问题.

该产品记录会员的会员购买情况以及他们的开始和到期日期.因此,我们可以回过头来确定会员在任何时间点的类型和状态.举例来说,如果他们买了在2007年1月1日,一个初级会员,并于2007年12月31日到期,那么他们买了2008年6月1日,一个学生会员,我们可以看到他们的状态,从主动去激活到激活(于扬分别于2008年1月和2008年6月1日),他们的类型从初中到学生(2008年6月1日).

基本上我们希望将成员的类型和状态属性转换为时间属性有效性 a-la Fowler(或其他随时间变化的事物).

我们的问题(最后:) - 鉴于上述情况:您建议我们使用什么数据库表设计来保存此成员信息.我想它会有一个MemberID列,所以我们可以键入现有的Member表.它还需要存储成员的状态和类型以及他们所持有的日期范围.我们希望能够轻松地针对此表编写查询,以确定在给定时间点我们拥有的每种类型和状态的成员数量.

更新2009-08-25:已经进行了侧面跟踪,并且还没有机会尝试提出的解决方案.希望尽快这样做,并根据结果选择答案.

sql sql-server database-design temporal-database

8
推荐指数
1
解决办法
1033
查看次数

如何通过保存数据将存在表更改为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
查看次数

7
推荐指数
1
解决办法
490
查看次数

使用SQL Server 2016时态表查询已删除记录的最佳方法是什么?

我正在查看SQL Server 2016时态表,找不到任何有效的方法来查询现在删除的所有历史记录.

我不喜欢软删除或移动到'已删除的项目表',因为我觉得时态表是多余的.

这可以通过时态表以有效的方式实现吗?

temporal-database sql-server-2016

7
推荐指数
1
解决办法
2047
查看次数

种子数据与临时表中的旧日期 - SQL Server

我需要在下面的Temporal Table中为我的本地开发目的播种数据,开始日期应该是旧的.给定的表架构是

CREATE TABLE [dbo].[Contact](
    [ContactID] [uniqueidentifier] NOT NULL,
    [ContactNumber] [nvarchar](50) NOT NULL,
    [SequenceID] [int] IDENTITY(1,1) NOT NULL,
    [SysStartTime] [datetime2](0) GENERATED ALWAYS AS ROW START NOT NULL,
    [SysEndTime] [datetime2](0) GENERATED ALWAYS AS ROW END NOT NULL,
 CONSTRAINT [PK_Contact] PRIMARY KEY NONCLUSTERED 
(
    [ContactID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY],
    PERIOD FOR SYSTEM_TIME ([SysStartTime], [SysEndTime])
) ON [PRIMARY]
WITH
(
    SYSTEM_VERSIONING = ON (HISTORY_TABLE = [dbo].[ContactHistory] , DATA_CONSISTENCY_CHECK …
Run Code Online (Sandbox Code Playgroud)

sql sql-server temporal-database temporal sql-insert

7
推荐指数
1
解决办法
2097
查看次数

你会如何在SQL中建立一个时间多对多的关系?

您如何在SQL中表示时间多对多关系?在非时间环境下,人们会使用连接表(也就是链接/桥/地图)来连接双方.

添加时间跟踪就像在联结表上包含ValidStart和ValidEnd列一样简单吗?如果你这样做了,你遇到了什么问题(如果有的话)?在这种关系中,是否有更好的方法来跟踪随时间的变化?

如果它有帮助,在我的情况下,我专门使用SQL 2008,时间数据不是双时态的,因为我只跟踪有效时间.

sql database-design temporal-database temporal sql-server-2008

6
推荐指数
1
解决办法
1321
查看次数

使用SQL检测异常间隔

我的问题很简单:我有一个包含一系列状态和时间戳的表(为了好奇,这些状态表示警报级别),我想查询此表以获得两种状态之间的持续时间.

看起来很简单,但这里有一个棘手的部分:我不能创建查找表,程序,它应该尽可能快,因为这个表是一个拥有超过10亿条记录的小怪物(不开玩笑!)...

架构很简单:

[pk]时间价值

(实际上,还有第二个PK,但这对此无用)

在真实世界的例子之下:

Timestamp          Status
2013-1-1 00:00:00    1
2013-1-1 00:00:05    2
2013-1-1 00:00:10    2
2013-1-1 00:00:15    2
2013-1-1 00:00:20    0
2013-1-1 00:00:25    1
2013-1-1 00:00:30    2
2013-1-1 00:00:35    2
2013-1-1 00:00:40    0

仅考虑2级警报的输出应如下所示,应报告2级警报的开始及其结束时(达到0时):

StartTime          EndTime            Interval
2013-1-1 00:00:05  2013-1-1 00:00:20     15
2013-1-1 00:00:30  2013-1-1 00:00:40     10

我一直在尝试各种各样的内部连接,但是所有这些都引导我进行了一次惊人的笛卡尔爆炸.你能帮助我找到一种方法来实现这个目标吗?

谢谢!

sql sql-server temporal-database sql-server-2008

6
推荐指数
1
解决办法
1105
查看次数

如何在MySQL中实现时态数据

我目前有一个非时间MySQL数据库,需要将其更改为时态MySQL数据库.换句话说,为了报告目的,我需要能够保留随时间对记录所做的更改历史记录.

我实现这一点的第一个想法是简单地在表中插入而不是更新,当我需要选择数据时,只需GROUP BY在某个列上执行并按时间戳排序DESC.

但是,在仔细考虑了一下之后,我意识到这会让事情搞得一团糟,因为每个插入的主键(实际上只是模拟单个记录上的一些更新)会有所不同,从而搞乱任何联系使用主键链接到数据库中的其他记录.

因此,我的下一个想法是继续更新数据库中的主表,但也创建一个新的插入到"审计表"中,它只是更新后的完整记录的副本,然后当我需要报告时时态数据,我可以使用审计表进行查询.

有人可以给我一些指导或链接,如何正确地做到这一点?
谢谢.

mysql database implementation temporal-database

6
推荐指数
1
解决办法
4781
查看次数

为什么FOR子句不能与带有时态表的SQL Server 2016中的别名一起使用?

我有一个带有时态表的SQL Server 2016数据库.一个时态表称为公司.我试图查询它以获取当前记录和所有历史记录.我首先尝试了以下查询:

select *
from Company c
FOR SYSTEM_TIME all
Run Code Online (Sandbox Code Playgroud)

并得到以下错误: 'FOR'附近的语法不正确.

但是,如果我在没有别名的情况下尝试它,它可以正常工作:

select *
from Company
FOR SYSTEM_TIME all
Run Code Online (Sandbox Code Playgroud)

我找不到任何关于此的文档 - 它是合法约束,已知问题还是其他什么?

sql-server temporal-database sql-server-2016

6
推荐指数
1
解决办法
411
查看次数

具有时态数据库的实体框架

考虑从当前数据库(仅存储在当前时间被认为是真实的事实)移动到时间数据库(可以支持处理涉及时间的数据).

我目前使用Entity Framework与数据库进行通信,但是将后续数据库作为后端继续使用Entity Framework是否容易?我没有从Web上找到很多针对此类数据库运行查询的示例.

.net entity-framework temporal-database

5
推荐指数
1
解决办法
855
查看次数