我想有一种控制/跟踪行修订的方法。我正在努力为这个问题找到最佳解决方案。
首先想到的是让一个带有id的表来标识行和修订号的id。组合的ID将是主键。所以示例数据可能如下所示:
1, 0, "original post"
1, 1, "modified post"
1, 2, "modified again post"
如何使用此行为创建表?或者有更好的解决方案吗?
我喜欢InnoDB,因为它支持MySQL 5.6 +中的事务,外键和全文。
我知道可以通过如何插入数据“强制”这种行为,但我想知道是否有办法让表自动执行此操作。
答案 0 :(得分:1)
考虑表结构:
TABLE posts
post_id INT AUTO_INCREMENT PK
cur_rev_id INT FK(revisions.rev_id)
TABLE revisions
rev_id INT AUTO_INCREMENT PK
orig_post INT FK(posts.post_id)
post_text VARCHAR
posts
表跟踪有关帖子及其当前版本的非版本化信息,revisions
跟踪帖子文本的每个版本,并返回父帖子。由于循环FK约束,您需要在事务中附加新的帖子插入。
有了这个,您应该能够轻松添加,删除,跟踪,回滚和预览帖子的修订。
是的,由于密钥设置为AUTO_INCREMENT
,因此封装在事务中并不完全有用,因此您需要使用LAST_INSERT_ID()
和一些临时NULL索引重新插入PHP。
CREATE TABLE `posts` (
`post_id` INT(10) NOT NULL AUTO_INCREMENT,
`cur_rev_id` INT(10) NULL DEFAULT NULL,
`post_title` VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (`post_id`),
INDEX `FK_posts_revisions` (`cur_rev_id`),
) ENGINE=InnoDB
CREATE TABLE `revisions` (
`rev_id` INT(10) NOT NULL AUTO_INCREMENT,
`orig_post` INT(10) NULL DEFAULT NULL,
`post_text` VARCHAR(32000) NULL DEFAULT NULL,
PRIMARY KEY (`rev_id`),
INDEX `FK_revisions_posts` (`orig_post`),
) ENGINE=InnoDB
ALTER TABLE `posts`
ADD CONSTRAINT `FK_posts_revisions` FOREIGN KEY (`cur_rev_id`) REFERENCES `revisions` (`rev_id`);
ALTER TABLE `revisions`
ADD CONSTRAINT `FK_revisions_posts` FOREIGN KEY (`orig_post`) REFERENCES `posts` (`post_id`);
然后:
$db_engine->query("INSERT INTO posts (cur_rev_id, post_title) VALUES (NULL, 'My post Title!')");
$post_id = $db_engine->last_insert_id();
$db_engine->query("INSERT INTO revisions (orig_post, post_text) VALUES($post_id, 'yadda yadda')");
$rev_id = $db_engine->last_insert_id();
$db_engine->query("UPDATE posts SET cur_rev_id = $rev_id WHERE post_id = $post_id");
答案 1 :(得分:0)
如果我理解正确并且表格没有收到大量的更新/删除,那么您可以查看设置触发器,例如:
DELIMITER $$
CREATE TRIGGER t_table_update BEFORE UPDATE ON table_name
FOR EACH ROW
INSERT INTO table_name_revisions (item_id, data, timestamp)
VALUES(OLD.id, OLD.data, NOW());
END$$
DELIMITER ;
有关详细信息,请参阅trigger syntax