mysql - MySQL如何实现时间向上兼容?

标签 mysql database database-design

我想使用mysql实现一个时态数据库。我发现 BerekelyDB 引擎不支持当前的 MySQL 版本。我想存储数据并查询历史记录。 (不想删除任何数据)。例如,假设表 stundet。

Student_ID      Student_Name   Class   Added_Date               Deleted_Date 
1004            ABC             19   2011-02-03:18-24         2011-04-03:20-24
1004            ABC_D           19   2011-04-03:20-24         null

这是我想要的示例表。当我更改一些细节时,将添加一个deleted_date时间戳,并添加一个全新的记录。删除记录时只会添加一个Deleted_Date

那么我是否必须编写整个库,或者是否有任何特定的库或数据库实现来支持我的问题?..

顺便说一句,我发现了这个http://www.cs.arizona.edu/projects/tau/tbdb/但似乎它只适用于旧版本。

最佳答案

当您将非时态表升级为时态表时,您可以通过为时态表创建非时态 View 来实现与旧应用程序的兼容性。该 View 将时间数据缩减为当前有效数据。对于这样的 View ,您可以创建所谓的触发器来对临时表执行正确的操作。

不幸的是,这不适用于 MySQL,因为 MySQL 的功能非常有限。这意味着您有两种可能的解决方案:

  • 将您的数据迁移到功能更强大的数据库中。
  • 修改应用程序。

以下示例显示了第一种替代方案的可能解决方案。我已经使用 Oracle 10gR2 测试了该示例。

为时态数据创建一个表。当前值为 值,其结尾为 NULL。唯一约束 防止表包含多个当前值。这 表没有主键,因为 id 不唯一 时态表,但仅在旧 View 中。

CREATE TABLE temporal (
  id         NUMBER NOT NULL,
  starting   TIMESTAMP NOT NULL,
  ending     TIMESTAMP,
  attribute  CHAR(20),
  UNIQUE (id, ending));

为旧应用程序创建 View 。

CREATE VIEW legacy (id, attribute) AS
  SELECT id, attribute FROM temporal WHERE ending IS NULL;

为旧表创建一个“而不是”触发器来执行 正确插入到临时表中。插入到 旧表也是对时态表的插入。

CREATE TRIGGER legacy_insert
INSTEAD OF INSERT ON legacy
FOR EACH ROW
BEGIN
  INSERT INTO temporal (id, starting, ending, attribute)
  VALUES (:NEW.id, CURRENT_TIMESTAMP, NULL, :NEW.attribute);
END;

创建一个“而不是”触发器来更新旧表。 旧表的更新是对旧表的更新和插入 时态表。当前值已更新并为新值 插入新行的值。

CREATE TRIGGER legacy_update
INSTEAD OF UPDATE ON legacy
FOR EACH ROW
BEGIN
  UPDATE temporal SET ending = CURRENT_TIMESTAMP WHERE id = :NEW.id;
  INSERT INTO temporal (id, starting, ending, attribute)
  VALUES (:NEW.id, CURRENT_TIMESTAMP, NULL, :NEW.attribute);
END;

创建一个“而不是”触发器来删除以下属性: 遗留表。删除旧表就是更新 时态表。

CREATE TRIGGER legacy_delete
INSTEAD OF DELETE ON legacy
FOR EACH ROW
BEGIN
  UPDATE temporal SET ending = CURRENT_TIMESTAMP 
  WHERE id = :OLD.id AND ending IS NULL;
END;

尝试插入。

INSERT INTO legacy (id, attribute) VALUES (1, 'a');
SELECT * FROM legacy;
SELECT * FROM temporal;

尝试更新。

UPDATE legacy SET attribute = 'A' WHERE id = 1;
SELECT * FROM legacy;
SELECT * FROM temporal;

尝试删除。

DELETE FROM legacy WHERE id = 1;
SELECT * FROM legacy;
SELECT * FROM temporal;

关于mysql - MySQL如何实现时间向上兼容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9446408/

相关文章:

mysqldump 之后的 MYSQL latin1 和 utf8

php - 为什么php不在mysql中存储数据?

python - Zenoss ZenPack 开发的典型工作流程是什么?

database-design - 推荐的 OAuth Provider 数据库结构

mysql查询统计列中连续正数

python - SQL 用于组合字段中的数据并提供整理后的数据

python - Django - 有序表

sql-server - 如何以有效的方式覆盖数据库中的重复数据?

mysql:设计实践

database-design - 数据库关系循环