2009-06-03 16 views
5

私は、「ライブ」データセットとデータセットをデータベースに保存する最良の方法について検討してきました。ライブバージョンはウェブサイト上に表示され、ドラフトバージョンはライブの準備が整うまで続きます。モデルはリレーショナルであり、多くのテーブルで構成されています。ライブデータとドラフトデータのデータベースモデル

私の現在の方法は、ドラフト用とライブ用の2つのデータベースを持つことです。 データを有効にするようにプロモートすると、SQLはドラフトDBのデータをライブDBにコピーします。

これは問題ありませんが、少し遅くて面倒です。そして、しばしば、SQLは両方のテーブルセットを考慮する必要があります。

もう1つの方法は、各テーブルのキーの一部としてライブインジケータを作成することです。ライブと下書きの両方を同じテーブルに保持し、インジケータを更新してデータを有効にします。 - 私はこのアイディアには本当に売れていません。

  • DBMSはSybaseです。

他の提案がある場合は、私は感謝します。

U.M. =あなたが最初のDataModeで挿入のDataMode IN( 'L'、 'D')--liveまたはドラフト

+0

これまでの回答に感謝します。彼らは私にもう少しアイデアを与えてくれました。 - 同じテーブルにライブと下書きがあるので、偶然データが表示されないようにする必要があります。 - 旗を持ってドラフトの行に設定してライブにする....また、古いライブ行に「古い」とマークすることもできます。アプリケーションは「ライブ」からカットを取り、ドラフトに保存します何か変更があります。そうすれば、データがライブとしてマークされたときに大きな削除を避けることができます。 – sqlchan

答えて

2

1つのテーブル

DataTable 
    DataKey 
    DataMode 
    Data... 

PKがDataKey +のDataMode
チェック制約であるを持っています'D' --draft
INSERT SELECTを使用して同じテーブルにコピーすると、DataMode = 'L'に設定されます
常にDataMode = 'D'を編集し、DataMode = 'L'にプッシュします'それで終わったら。

あなたはモードのデータパスを表示したい、WHERE DataKey = @ XとのDataMode = @モード

は、私はあなたが削除を処理しますかわからない使用(ドラフトはその後、削除生活することをプッシュします?)あなたは、ステータス列を追加することもできます。一つのテーブルでそれをやって

DataStatus --'A'ctive 'D'eleted 

は、いずれかの「L」IVEまたは「D'ラフトのために働くすべてのSQLの一般的な使用を可能にし

0

私は思います。これは有効な日付を記入するための主要な候補です。各表に開始日と終了日を追加します。現在の日付が開始日と終了日の後、または開始日以降にNULLが指定された場合、レコードは生きています。他のものはライブとして表示されず、ドラフトデータを持つことができます。

これにより、データがシーケンシャルであり、以前の値の履歴を保持する場合、複数のドラフトデータセットが許可されます。また、データ量が問題になる場合は、DBの負荷が低いときに実行されるジョブを使用して、終了日が現在の日付よりも小さいレコードを削除してください。

1

状況によっては2つのアイデアがあります。

ドラフト版がロールインしたときにデータが残っていて、新しいデータを一度に有効にしたい場合は、各データ要素のバージョン番号と、現在のアクティブバージョン番号。次に、選択されたレコードがバージョン番号< =現在のバージョン番号(より高いバージョン番号を無視する)を持つようにロジックを書き込みます。これは混乱を最小限に抑え、おそらく両方のバージョンが必要であることを意味するものを処理します。

テーブル全体をスワップしたい場合は、(非常に)簡単に切断することができます。テーブルの名前を変更します。おそらくあなたが説明したオプションよりも破壊的ではなく、同時にアクセスできる可能性があります。

0

すでに使用しているものは何でもキー、および公開する場合はNにデフォルトでブールis_live列を作り、ちょうどこの作品は、すべてのクエリを確認するためにあなたを強制的に持っ

をYにその列を更新あなたが見てはならないときにドラフトを除外するようにしますが、同じフォーマットとすべてのものを持つ2つの並列テーブルを維持する必要がありません。

関連する問題