【发布时间】:2009-12-19 19:35:46
【问题描述】:
我正在尝试弄清楚如何为帖子和其他内容设置修订系统。我认为这意味着它需要使用基本的 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;
能够及时回到以前的修订版并删除修订版也会有很大帮助。
无论如何,这些只是我认为某种历史跟踪将如何工作的想法。我对任何形式的跟踪持开放态度,我只想知道最佳实践是什么。
:编辑:
似乎向前看,两张桌子似乎最有意义。由于我计划存储两份 text,这也将有助于节省空间。第一个表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 ;
【问题讨论】:
-
要弄清楚你到底想知道什么并不容易:)