向MySQL单元格添加时间维度

时间:2009-08-10 01:14:36

标签: mysql version-control bigtable hypertable

有没有办法在MySQL表的每一行的每一列中保留每次更改的带时间戳的记录?这样我就不会丢失任何数据并保留过渡的历史记录。行删除可能只是将“已删除”列设置为true,但可以恢复。

我正在查看HyperTable,这是Google BigTable的一个开源实现,这个功能真的让我大吃一惊。如果可以在MySQL中使用它会很棒,因为我的应用程序无法处理大量数据,这些数据证明部署HyperTable是合理的。有关其工作原理的更多详细信息,请参见here

是否有任何配置,插件,分支或任何可以将这一功能添加到MySQL的内容?

4 个答案:

答案 0 :(得分:3)

我过去在一个类似于混沌描述的php模型中实现了这个。

如果你正在使用mysql 5,你也可以使用一个存储过程来实现这一点,该存储过程可以挂钩到表的更新和删除事件。

http://dev.mysql.com/doc/refman/5.0/en/stored-routines.html

答案 1 :(得分:2)

我在自定义框架中执行此操作。每个表定义还生成与主表多对一关联的Log表,当框架对主表中的行进行任何更新时,它会将行的当前状态插入到Log表中。所以我对表的状态有一个完整的审计跟踪。 (我有时间记录,因为我的所有表都有LoggedAt列。)

没有插件,我担心,更多的做事方法需要融入整个数据库交互方法。

答案 2 :(得分:2)

创建一个存储以下信息的表...

CREATE TABLE MyData (
    ID INT IDENTITY,
    DataID INT )

CREATE TABLE Data (
    ID INT IDENTITY,
    MyID INT,
    Name VARCHAR(50),
    Timestamp DATETIME DEFAULT CURRENT_TIMESTAMP)

现在创建一个执行此操作的sproc ......

INSERT Data (MyID, Name)
VALUES(@MyID,@Name)

UPDATE MyData SET DataID = @@IDENTITY
WHERE ID = @MyID

通常,MyData表只是一个关键表。然后,将其指向Data表中最新的记录。无论何时需要更改数据,只需调用将新数据插入数据表的sproc,然后更新MyData以指向最新记录。全部,如果系统中的其他表将自己从MyData.ID键入以用于外键目的。

这种安排避免了对第二个日志表的需求(并且在架构更改时保持它们同步),但是在创建新记录时需要额外的连接和一些开销。

答案 3 :(得分:0)

您是否需要它以保持可查询性,或者这只是为了从错误的编辑中恢复?如果是后者,您可以设置一个cron作业来备份MySQL存储数据的实际文件并将其发送到版本控制服务器。