我试图弄清楚如何为帖子和其他内容设置修订系统。我认为这意味着它需要使用基本的 belongs_to/has_one/has_many/has_many_though ORM(任何好的 ORM 都应该支持这一点)。
我在想我可以有一些表格,比如(有匹配的模型)
[[POST]] (has_many (text) through (revisions)
id
title
[[Revisions]] (belongs_to posts/text)
id
post_id
text_id
date
[[TEXT]]
id
body
user_id
我可以通过修订表加入其中以获取最新的 TEXT 正文。但我对这一切将如何运作有点模糊。有没有人设置这样的东西?
基本上,我需要能够加载一篇文章并请求最新的内容条目。
// Get the post row
$post = new Model_Post($id);
// Get the latest revision (JOIN through revisions to TEXT) and print that body.
$post->text->body;
能够及时回到以前的修订版并删除修订版也将是一个很大的帮助。
无论如何,这些只是我认为某种历史跟踪将如何工作的想法。我对任何形式的跟踪持开放态度,我只想知道最佳实践是什么。
:编辑:
看来,向前看,两张桌子似乎是最有意义的。由于我计划存储两份文本,这也将有助于节省空间。第一个表posts
将存储当前版本的数据,以便快速读取,无需任何连接。帖子body
将是匹配修订text
字段的值 - 但通过 markdown/bbcode/tidy/etc 处理。这将允许我保留原始文本(用于下一次编辑),而不必在一个修订行中将该文本存储两次(或者每次显示时都必须重新解析它)。
所以获取将是 ORM 友好的。然后对于创建/更新,我将不得不单独处理修订,然后使用新的当前修订值更新 post 对象。
CREATE TABLE IF NOT EXISTS `posts` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`published` tinyint(1) unsigned DEFAULT NULL,
`allow_comments` tinyint(1) unsigned DEFAULT NULL,
`user_id` int(11) NOT NULL,
`title` varchar(100) NOT NULL,
`body` text NOT NULL,
`created` datetime NOT NULL,
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `published` (`published`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `postsrevisions` (
`id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
`post_id` int(10) unsigned NOT NULL,
`user_id` int(10) unsigned NOT NULL,
`is_current` tinyint(1) unsigned DEFAULT NULL,
`date` datetime NOT NULL,
`title` varchar(100) NOT NULL,
`text` text NOT NULL,
`image` varchar(200) NOT NULL,
PRIMARY KEY (`id`),
KEY `post_id` (`post_id`),
KEY `user_id` (`user_id`),
KEY `is_current` (`is_current`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;