リビジョン履歴を保存する「最良の」方法は、特定の目標/制約が何であるかによって異なりますが、これらについては言及していません。
しかし、ここであなたの2つの提案された方法についていくつかの考えがあります:
投稿用に 1 つのテーブルを作成し、投稿履歴用に 1 つ作成します。例:
create table posts (
id int primary key,
userid int
);
create table posthistory (
postid int,
revisionid int,
content varchar(1000),
foreign key (postid) references posts(id),
primary key (postid, revisionid)
);
(明らかに、より多くの列、外部キーなどがあります。)これは実装が簡単で理解しやすい(そしてRDBMSに参照整合性を維持させるのは簡単です)が、あなたが述べたように、posthistory
行が多すぎてすぐに検索できない場合があります足りる。
は(および の PK )postid
の外部キーであることに注意してください。posthistory
posts
- 最新のリビジョンがすべて 1 つのテーブルにあり、以前のリビジョンが別のテーブルにある非正規化スキーマを使用します。これには、プログラム側でより多くのロジックが必要
when I add a new version, replace the post with the same id in the post table, and also add this to the revision table
です。
(これは、 SE Data Explorerのデータ ダンプに基づいて、SE サイトが使用するものである可能性があります。または、そうでない可能性もあります。私にはわかりません。)
このアプローチでpostid
は、 はテーブルの外部キーでもあり、posthistory
テーブルの主キーでもありposts
ます。