我想使用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/