2017-10-05 4 views
0

私は、変化する関係で定期的に更新されるデータベースを持っています。私は新しいデータと古いデータを保存し、必要なときに新しいデータを引き出すことができます。例:期限切れの関係を処理し、削除しないのに最適な方法は?

商品と価格。商品の価格は変更される可能性がありますが、現在の価格だけを引き出しながら、古い価格を書き留めておきたいと思います。

これを行うには、有効な開始日と終了日を設定することをお勧めします。だから、もしあなたが望むなら、まだ満了していない関係のみを引き出すように私は質問することができます。これを行うより効率的な方法がありますか?

+0

有効期限と終了日は、タイプ2のディメンション情報を格納する標準的な方法です。これが、あなたが記述しているものです。 –

+0

SQL Server 2014以降を使用している場合は、まったく同じ目的のTEMPORALテーブルを使用できます。 – FLICKER

答えて

0

私が考えることができる最高のものは、トリガーを作成することです。

  1. テーブルに「new」か「old」かを示すflagという名前の列を追加します。一度に1つのグループ/リレーションシップに対して新しい行を1つだけ作成します。
  2. 更新日という名前の列を追加します。更新日は更新日です。テーブル

    1. アップデートすべてのために「古い」フラグに新しい行を挿入するにトリガーするトリガーを作成します

    (あなたは、最新の古いデータを知ることに興味を持っている場合)特定の商品と価格の組み合わせに対して '新しい'フラグが付いた行。

  3. ので、あなたは組み合わせのために新しい1行を持つことになります

をsysdateが更新された日付を更新します。新しいデータが必要なときは、flag = 'new'と記述します。古い行にはすべて旧価格になった日付が表示されます

+0

開始日と終了日がはるかに優れています。あなたのソリューションのメリットは何か分かりません。明確にすることはできますか? – FLICKER

+0

'new'と 'old'の2つの値を持つことができるフラグをテーブルに含めることができます。 新たに挿入された行については、フラグ列に「new」と表示されます テーブル上にトリガーが挿入されます(項目 'Abc'の行が挿入されています)、既存の行がすべて更新されますアイテム 'Abc'に対して 'old'というフラグを設定し、updated_dateカラムを現在の日付に設定します(現在更新されています)。新しいレコードが必要なときは、条件フラグ= 'new'でフェッチできます。また、古いレコードを参照してupdated_dateを使用して、それがどれほど古いかを知ることができます – Valli

+0

フラグは現在の行が何であるかを示し、行の有効期限が切れたときの各行の日付列があります。この例では、特定の日付のアクティブな行を探したい場合、特定の日付のアクティブな行を検索する場合は、テーブルを結合するときにクエリが直接前方に移動しないようにします。 – FLICKER

0

市場にあるERPのように価格履歴の表を作成することができます。

PRICE_HIST

この表は、これまで は、システム内で適用されたすべての価格変更の履歴が含まれています。このテーブルの履歴は、 SKU /ストアの組み合わせによって永遠に保持されます。

Column    Nulls ?  Type 
------    -------  ---- 
TRAN_TYPE    NOT NULL  NUMBER (2, 0) 
REASON    NULL   NUMBER (2, 0) 
EVENT     NULL   VARCHAR2 (6) 
ITEM     NOT NULL  VARCHAR2 (25) 
LOC     NOT NULL  NUMBER (10, 0) 
LOC_TYPE    NULL   VARCHAR2 (1) 
UNIT_COST    NULL   NUMBER (20, 4) 
UNIT_RETAIL   NULL   NUMBER (20, 4) 
SELLING_UNIT_RETAIL NULL   NUMBER (20, 4) 
SELLING_UOM   NULL   VARCHAR2 (4) 
ACTION_DATE   NOT NULL  DATE 
MULTI_UNITS   NULL   NUMBER (12, 4) 
MULTI_UNIT_RETAIL  NULL   NUMBER (20, 4) 
MULTI_SELLING_UOM  NULL   VARCHAR2 (4) 
POST_DATE    NULL   DATE 

ACTION_DATEは価格変動が影響を行った日を含みます。

関連する問題