首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数据库记录关于n-m关系变化的信息

数据库记录关于n-m关系变化的信息
EN

Stack Overflow用户
提问于 2014-10-31 07:55:28
回答 1查看 91关注 0票数 0

我有一个(SQL Server)数据库,在该数据库中,我正在跟踪表上的更改;客户的要求是能够看到任何时间点的“图片”,指定请求的日期。到目前为止,我所做的是按照HistoryTable的思想,使用数据库触发器来存储历史数据,从而实现一个日志触发器

现在,需求发生了变化,我需要在原始表中添加一个多到多(n-m)关系。当然,链接的数据集(n关系)也应该是“版本化”的,随着时间的推移而改变为原始表。

我的第一个想法是用主表中的“假ID”引用not关系,即:一个普通(int)字段,而不是主键(它不会随时间变化)。通过这种方式,我可以随着时间的推移更改ID,例如:

第1版:

代码语言:javascript
运行
复制
Version 1
ID  RelID  Data
5   5      Version 1

Version 2
ID  RelID  Data
5   5      Version 2

Version 3
ID  RelID  Data
5   6      Version 3

在本例中,n关系在版本1和版本2之间没有变化,但在版本3中发生了变化。

这很好,但我的问题是:

  • 每当n关系版本发生变化时,如何才能获得表中唯一的新RelID?
  • 另一种选择:我可以将n关系同时引用到ID和RelID (这是唯一的)吗?
  • 有没有比我的更聪明的解决方案?

预先感谢您的帮助

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-10-31 08:19:22

这个场景听起来很容易适应数据仓库的概念,即缓慢变化的维度。通常,2型缓慢变化的尺寸被认为是最有用的.这些记录每个版本的行的开始日期和结束日期,当前行只存储结束日期的NULL

基本上,您将向桥接表中添加其他列,以记录该行版本的开始日期和结束日期。在EndDate是NULL的地方,您知道这是当前的行版本。

所以你的桌子看起来会是:

代码语言:javascript
运行
复制
 ID | RelID | StartDate  | EndDate
----+-------+------------+------------
 05 |   06  | 2014-10-01 | NULL
 05 |   05  | 2014-09-10 | 2014-10-01
 05 |   03  | 2014-09-10 | NULL

从这些数据可以看出,ID 05与RelID 05相关,直到2014-10-01年,然后才与RelID 06相关,并且仍然与RelID 03相关。

然后,当您需要当前的关系数据时,您可以简单地说

代码语言:javascript
运行
复制
SELECT *
FROM Table
WHERE EndDate IS NULL

如果你回顾历史,你可以说

代码语言:javascript
运行
复制
SELECT *
FROM Table
WHERE @selectionDate BETWEEN StartDate AND COALESCE(EndDate,GETDATE())

如果不了解更多关于数据结构的信息,我就无法判断这是否适合您试图解决的问题。但是通常,多到多的关系需要在两个实际记录表之间建立一个桥接表来创建一个正确的关系,而Type-2缓慢变化的维度是数据仓库中对行进行版本控制的一种尝试和真实的方法,同样的概念可以应用于任何需要对记录进行历史版本控制的地方。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26669822

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档