1

プロジェクトを開始したばかりですが、バージョン管理機能を備えた小さなコンテンツマネージャーが必要です。ただし、データベースをモデル化するための最良の方法はわかりません。

次のフィールドを含むコンテンツテーブルがあります:id主キーシリアル、content_id int(異なるコンテンツを識別するフィールド)、title varchar、content longtext、version int default '1'、create_date date、

一部のCMSが実際のリビジョンとは別のテーブルでリビジョンを分離しているのを見ましたが、最善の方法は何ですか?最適化された方法はありますか?

ありがとう!

4

2 に答える 2

1

これは、データベースなしで既に存在します。

  • gitit (Haskell で書かれ、バックエンドとして git または darcs を使用)
  • ikiwiki (Perl で書かれており、さまざまなバージョン管理システムをバックエンドとして使用できます)

どちらもオープン ソースであり、どちらもプラグイン アーキテクチャを備えているため、特定のニーズに合わせてカスタマイズできます。(ただし、私は gitit しか使用していません。)

ただし、git は大きなバイナリ ファイルのバージョン管理には完全ではなく、darcs はひどいことに注意してください。注意すべきこと。

于 2011-04-21T15:57:36.263 に答える
1

私はこのようなものを設計しました。これがその要点です。

  1. 行レベルのバージョン管理が必要なすべてのテーブルのミラー テーブルを作成します。CUSTOMER テーブルがあるとします。ミラーのバージョン管理テーブルは VER_CUSTOMER になります
  2. 行レベルのバージョン管理が必要なすべてのテーブルには、RECORD_ID (GUID) という列があります。
  3. そのテーブルにレコードが挿入されると、新しい GUID を生成してそのフィールドに入力します。テーブルの自然な PK に追加された RECORD_ID を使用して、新しいレコードも VER_CUSTOMER テーブルに挿入されます。
  4. レコードが更新されると、新しい GUID を再度生成します。この新しい GUID を RECORD_ID に入力します。更新されたレコードは、VER_CUSTOMER テーブルにも移動します。
  5. レコードが削除されると、CUSTOMER テーブルのレコードを DELETED としてマークします (レコードを物理的に削除しません)。すべてのテーブルに IS_DELETED 列があります。レコードを削除しようとすると、その列を TRUE に設定します。再び、削除されたレコードのコピーも VER_CUSTOMER テーブルに入ります。

したがって、そのテーブルにあるすべてのトランザクションには、RECORD_ID を持つ VER_CUSTOMER テーブルに対応するレコードがあり、PK としてテーブルの自然な PK があります。たとえば、CUSTOMER テーブルの PK が CUST_ID の場合。VER_CUSTOMER の PK は、複合 CUST_ID と RECORD_ID になります。

お役に立てれば...

于 2011-04-21T14:50:06.073 に答える