gpt4 book ai didi

mysql - 如何在 MySQL 中实现 Temporal Upward Compatibility?

转载 作者:搜寻专家 更新时间:2023-10-30 20:30:40 28 4
gpt4 key购买 nike

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

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_datetime 戳记并添加一个全新的记录。删除记录时,它只会添加一个 Deleted_Date

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

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

最佳答案

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

不幸的是,这不适用于 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 中实现 Temporal Upward Compatibility?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9446408/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com