2016-07-28 12 views
0

私は小規模企業向けのデータ層アプリケーションを管理しています。私のSWは、部品原価計算の情報を歴史的に取り出すことができないという批判を受けています。したがって、例えば、彼らが望むのは、ある時点で、6ヶ月前と同じように部品のコストを回収できることです。SQLテーブルのデータを毎日保存する

これまではスプレッドシートを使用していました。彼らは毎日パーツテーブルを.xlsxファイルにコピーし、「昨年の1月20日の費用はどうだった?」と知りたがったときはいつでも、彼らはそれを上手く引き出すことができました。

SQLで同じことをやり始めました。これまでの計画では、部品コストが更新されるたびに新しいテーブルを作成し、今日の日付でテーブルに名前を付け、アーカイブされた情報のためのデータベース。次に、タイムスタンプに応じて必要なテーブルを取得する予定です。

これは非常に乱雑になるだろうと私は助けることはできませんが、考えることはできません。これはデータをアーカイブするための悪いアプローチですか?できるだけ少ない頭痛でこの問題を解決するために私が遵守できる業界標準はありますか?

+1

ここをクリックしてください:http://stackoverflow.com/questions/3874199/how-to-store-historical-data – cha

+2

あなたは正しい、それは悪いアプローチです。動的に名前が付けられたテーブルは、クエリの作成を困難にします。代わりに、関連するテーブルにdatestampカラムを追加するだけで済みます。あなたは現在の値と以前の値のために別々のテーブルを持つことができます(ただし、それまでのすべての値のテーブルは1つだけです)。 – Blorgbeard

答えて

1

だから、私たちはSQLで同じことをやって始めて、そして計画は、これまでのところ、我々は新しいテーブルに部品コストが更新されるたびに作成されます で、 名今日の日付を持つテーブル、およびアーカイブされた情報 のデータベースに保存します。次に、タイムスタンプに従ってテーブル が必要なテーブルを引き出す予定です。

これは非常に乱雑になるだろうと私は助けることはできませんが、考えることはできません。これは悪いデータですか? データをアーカイブする方法ですか?できるだけ少ない頭痛でこの問題を解決するために、 が遵守できる業界標準はありますか?

あなたはそうです...この解決法は面倒です。

最も簡単なことは、履歴テーブルsay Parts_Historyを作成して、すべての列をメインのパーツテーブルとして追加のタイムスタンプ列を追加して更新を追跡することです。 (私はストアドプロシージャを介して行われることを望む)新しい価格が存在するたびに、既存の価格が新しいテーブルに移動され、メインテーブルが更新されますALL 1つのトランザクション内。あなたが更新を処理する単一のSPを持っていなければ、トリガーの中でそれを行うことができます。

いい例があるかどうか試してみます。

+0

したがって、更新が行われるたびにテーブルをコピーするのではなく、古いバージョンのパーツをPart_Historyにコピーし、アクティブなレコードを新しい値で上書きします。履歴データは、作成時にレコードに適用されたタイムスタンプによって照会することができます。私はそれを考えなかったとは信じられません。ありがとうございました。 – Jace

+1

@Jaceようこそ。 SQL 2016で利用可能な追跡/監査のための豊かな人を見てください:)オプション:https://msdn.microsoft.com/en-us/library/dn935015.aspx – objectNotFound

+0

私は夢を見ることができます.... – Jace

1

今のところ私は標準はありませんが、アプローチは明らかです。あなたはテーブルがpart(partid int primary key, price decimal)と言う。監査テーブルpart_audit(auditId int identity(1,1) primary key, partId int, price decimal, dateChange datetime default getdate())を作成し、part after update, deleteにトリガーを作成します。トリガーチェックでupdate(price)がある場合は、part_auditdeletedから挿入してください。過去の価格を検索するには、最寄りのdateChangeを選択してください。

関連する問題