投稿やその他のコンテンツのリビジョン システムをセットアップする方法を理解しようとしています。これは、基本的な belongs_to/has_one/has_many/has_many_through 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;
以前のリビジョンにさかのぼり、リビジョンを削除する機能も大きな助けになるでしょう。
いずれにせよ、これらは、ある種の履歴追跡がどのように機能すると私が考えるかについてのアイデアにすぎません。私は、ベストプラクティスが何であるかを知りたいだけです。
:編集:
今後は、2 つのテーブルが最も理にかなっているようです。テキストのコピーを 2 つ保存する予定なので、スペースの節約にもなります。最初のテーブルposts
には、結合なしで高速に読み取るための現在のリビジョンのデータが格納されます。投稿body
は、一致するリビジョンのtext
フィールドの値になりますが、markdown/bbcode/tidy/etc によって処理されます。これにより、元のテキストを 1 つのリビジョン行に 2 回保存する (または表示するたびに再解析する) ことなく、(次の編集のために) 元のテキストを保持できます。
したがって、フェッチは ORM フレンドリーになります。次に、作成/更新のために、リビジョンを個別に処理し、新しい現在のリビジョン値で投稿オブジェクトを更新する必要があります。
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 ;