2009-05-03 7 views
3

私はLAMP上のMVCベースのWebアプリケーションで作業していますが、これは "上位の"ユーザーの承認を得て変更する必要があるレコードがいくつか必要です。あり「ソフト」セーブまたは変更のワークフローを実装する最良の方法は何ですか?

が、これは、場所を取る「イベント」と言っていると思われるだけのテーブルである(通常のユーザーが変更を提出することができますが、彼らはこの承認後に適用されます): - ID

EVENTS を - 「これからの改正(および可能承認)がありますまで、ゲストINTEGER

イベントの属性の一つが「通常」のユーザによって変更されるたび、これらの変更が行われていない公式 - START_DATE DATETIME - VARCHAR に名前を付けますスーパー "ユーザ。次のオプションの最初で

私も:

  • にidを除き、各列の複製は、保留中の承認の変更を保持するために、「名前」のname_tempを言います。
  • 重複した構造を持つ別のテーブルを作成し、すべての保留中の承認の変更を保持します。

以前にこれを実装しましたか?これを行うには最高の/あなたの方法は何だと思いますか?そしてまた:この種の問題のパターンはありますか?

ありがとうございます!

PD:IsApprovedという名前の1以上の列を追加しないのはなぜ私は

+0

タイトルを修正できますか? –

+0

ups、申し訳ありません。 – Guillermo

答えて

0

「2番目のテーブル」アプローチの投票を追加してみましょう。他の2人の回答者は、「提案された変更」をマスターテーブルに振り回そうとしていますそれなど)。

補助テーブルにすべての変更を書き込んで処理する(特定の条件が満たされた場合にそれらをマスターテーブルに適用する)ことは、実際には共通のパターンであり、マスターテーブルのみを変更する必要がある一定の時間に、提案された変更がいつでも来ることができる一方、他の条件でもマスターテーブルへの書き込みに非常にコストがかかる(ロック競合など)が、N個の変更を書くことはコストを上げることにはならず、提案された変更を検証するのは非常に時間がかかる(あなたのユースケースを後者のカテゴリでは、あなたのケースでは、検証では、人間が提案された変更を見なければならないので、非常に遅いです。

0

...新しいものが承認されるまで、それは、だった「古い」レコードを保持する必要がありますか? boolまたはtinyint(1)タイプですか?今すぐ承認されたイベントを表示しますか?

編集:すべての属性が承認されました。その後、2番目のテーブルは私の選択 と同じ構造かid + changeableプロパティだけでPendingEventChangesと命名され、aprovalの "super"ユーザは元のデータを更新し、etriesを保留から削除します。

最初の選択は、データベースの正規化に対して非常に大変です。したがって、今後さらにプロパティを追加すると問題が発生します。

+0

新しい変更が承認されない場合は、現在のレコードを保持する必要があります。 – Guillermo

0

新しいイベントを追加する権限がある場合は、is_approvedなどのブール型列を1つ追加します。

私の意見では、同じテーブルのすべての列を複製して一時的な値を格納するのは大変です。 2人のユーザーが同じイベントに変更を投稿したときにどうなるか想像してみてください。

オプション番号2、つまり別のテーブルが適しています。各試行をそこに保存し、それに応じてメインテーブルを更新することができます。

このアプローチでは、何らかの形のロールバック変更も可能です。それぞれにタイムスタンプを保存し、承認された編集を削除しないでください。

0

履歴やバージョン管理が重要で、承認と組み合わせれば、私は単一のテーブルに行きます。あなたは、あなたの既存のプライマリキーで動作し、各リビジョンで増分できるリビジョン番号を追加します。次に、現在のバージョン、期限切れのバージョン、および承認バージョンが必要であることを示すための状態フィールドを追加できます。状態とキーフィールドの素敵なインデックスはあなたにすてきな結果をもたらします。これが多くのフィールドの1つ、2つまたは3つのフィールドである場合、これらの未承認の編集を処理するための特定のテーブルが、上記のように優れている可能性があります。

関連する問題