こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

過去データに対するデータベースのクエリの実行の仕方

こんにちは。アべです。

データの処理でリレーショナルデータベースを使用しようとしております。

そこで、台帳(例えば顧客台帳)をマスタ登録して使用するのですが、
下記のことがクエリでは出来ずに困っています。

やり方のヒントでもよろしいので教えていただけないでしょうか?

・過去に戻って、トランザクション処理を再実行する際に過去の
その時点の台帳情報を引っ張りたい。
(テーブルに時間指定でクエリを投げる方法がわからない。)

・その台帳の情報を確認したい。
(単純に台帳の過去を知りたい。
トリガで更新処理のログを残す手間なやり方しか思い浮かばない。)

本をみてもリレーショナルデータベースに時間軸の概念がないような
気がしております。

(一応調べて見て、スナップショットデータベースがあり、これだと
ある特定の時点しか取れず、しかも事前に用意しておかなければならず、
いまいち今回のパターンだと使えないと考えています。)

環境
SQL Server 2008 Service Pack 1

宜しくお願い致します。

投稿日時 - 2009-05-02 13:10:02

QNo.4925384

暇なときに回答ください

質問者が選んだベストアンサー

リレーショナルデータベースの正式な理論でどうなっているのかは知らないのですが、自分の知っている範囲では"基本的"に時間軸の概念は無いと思います。よく比較されるのが、Googleのビッグテーブルには時間軸があると聞きます。

基本的にを強調した理由は、機能としては過去履歴をデータとしては保持してません。(誤解を生みそうなので補足すると、バックアップ、データ整合性保持機構として、ログに記録されます。でも随時参照用ではありません)

過去に同様の事をするために、プログラムで過去履歴を残すように実装しました。

・マスターは上書きせず、更新する場合にも新規Insertして別IDとする
・帳票を作成したときのデータをリレーションキーで保持せず生データで保持する

などのように、DB設計などで対応しました。
作り込んでの対応ですね。

投稿日時 - 2009-05-02 14:27:28

お礼

norayuniさん、
早速の回答を有難うございます。

RDBにやはり時間軸を持たせる概念はないのですね。

残念です。私も自前での実装で試みます。

データベース自体が現実世界に合わせる際にどうしても
タイムラグがあるので、多少の過去に戻って過去の処理を
かけたかったのですが、ここは自前で実装することにします。

補足

1)やりたかったのは、例えば

お店で営業中に棚卸をして刻々と変る在庫数とある時点の
在庫数で帳簿(論理)在庫の数を調整するなどを実施したかったです。

販売管理だと24時間対応や日中棚卸などはコスト削減で当たり前なので

また、障害により、トランザクション処理を再投入する際に
台帳がトランザクション発生時点でひけないと2度目の処理結果が変る。
(でも、台帳の更新も一連のトランザクション群に入れてしまえば
全てリランできるともいえる。)

2)自前の時間軸の対応について

過去を索引する方法は、

1.トリガで情報を残し、その情報をアクセスします。

2.一連のトランザクション群を逆算処理してその時点の情報を採取する

があるかと思います。なんとなく1がシンプルかと思っています。


以上 有難うございました。

投稿日時 - 2009-05-02 16:44:55

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(3)

「時間軸の概念」が無くてもご希望のことはできそうに思います。
例えば在庫数を「在庫数データ」として持ち、それが変動してしまうと「時間軸の概念」が必要になりますが「総入庫数」-「総出庫数」として求め「入庫記録テーブル」「出庫記録テーブル」のフィールドを
品物ID
個数
入出庫日時
とすれば、ある品物に対し、ある時点での個数を計算できます。棚卸しも、ある種の入出庫と考えて処理すれば良さそうです。

>1.トリガで情報を残し、その情報をアクセスします。
>2.一連のトランザクション群を逆算処理してその時点の情報を採取する

このように難しいことをする必要が、本当にあるのでしょうか?

投稿日時 - 2009-05-05 08:45:52

ANo.2

>RDBにやはり時間軸を持たせる概念はないのですね。

SQL Server 2008をお使いということなので、参考までにコメントしますが、
最新版のRDMSでは、質問者さんのいう時系列の概念を導入する試みが行われています。

先に対応したのはOracleで、11gでFlashback Data Archive(Total Recall)という機能が追加され、オブジェクトを特定して長期間の更新履歴を保持することが可能になりました。
それを意識してか、SQL Server 2008でも変更データキャプチャ(CDC)という機能が追加されています。

特定のテーブルに関して自動的に更新履歴が記録されていきますが、トリガによるログ記録との違いは以下の通りです。
・SQL Serverの機能として履歴の記録がサポートされている点
・トリガではなく、トランザクションログから記録される点(トリガは無効にしてしまえば動きませんが、CDCはエージェントが起動している間記録され、エージェントを停止しても再開したときにまとめて記録されます)
・履歴データを検索する関数がいくつか提供されている点

SQL Server 2008 Enterpriseをお使いならば、使ってみてもいいかと思いますが、個人的には積極的にお勧めするものではありません。
以下の点の通り、まだ監査用の意味合いの方が強いためです。次バージョン(Kilimanjaro)で、もう少し使いやすくなってくれるといいと思いますが。。

・OracleのFlashback Data Archiveは、AS OF句のサポートにより、過去の特定時点のデータの検索が抵抗なく行えますが、
 SQL ServerのCDCは「特定期間の変更内容」を検索する機能があっても、「過去の特定時点のデータ」を検索するする機能は提供されていないため、ラッパー関数を自作する必要があります。

投稿日時 - 2009-05-03 19:14:01

あなたにオススメの質問