• ベストアンサー
  • 暇なときにでも

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

こんにちは。アべです。 データの処理でリレーショナルデータベースを使用しようとしております。 そこで、台帳(例えば顧客台帳)をマスタ登録して使用するのですが、 下記のことがクエリでは出来ずに困っています。 やり方のヒントでもよろしいので教えていただけないでしょうか? ・過去に戻って、トランザクション処理を再実行する際に過去の その時点の台帳情報を引っ張りたい。 (テーブルに時間指定でクエリを投げる方法がわからない。) ・その台帳の情報を確認したい。 (単純に台帳の過去を知りたい。 トリガで更新処理のログを残す手間なやり方しか思い浮かばない。) 本をみてもリレーショナルデータベースに時間軸の概念がないような 気がしております。 (一応調べて見て、スナップショットデータベースがあり、これだと ある特定の時点しか取れず、しかも事前に用意しておかなければならず、 いまいち今回のパターンだと使えないと考えています。) 環境 SQL Server 2008 Service Pack 1 宜しくお願い致します。

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数450
  • ありがとう数2

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

  • ベストアンサー
  • 回答No.1

リレーショナルデータベースの正式な理論でどうなっているのかは知らないのですが、自分の知っている範囲では"基本的"に時間軸の概念は無いと思います。よく比較されるのが、Googleのビッグテーブルには時間軸があると聞きます。 基本的にを強調した理由は、機能としては過去履歴をデータとしては保持してません。(誤解を生みそうなので補足すると、バックアップ、データ整合性保持機構として、ログに記録されます。でも随時参照用ではありません) 過去に同様の事をするために、プログラムで過去履歴を残すように実装しました。 ・マスターは上書きせず、更新する場合にも新規Insertして別IDとする ・帳票を作成したときのデータをリレーションキーで保持せず生データで保持する などのように、DB設計などで対応しました。 作り込んでの対応ですね。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

norayuniさん、 早速の回答を有難うございます。 RDBにやはり時間軸を持たせる概念はないのですね。 残念です。私も自前での実装で試みます。 データベース自体が現実世界に合わせる際にどうしても タイムラグがあるので、多少の過去に戻って過去の処理を かけたかったのですが、ここは自前で実装することにします。 補足 1)やりたかったのは、例えば お店で営業中に棚卸をして刻々と変る在庫数とある時点の 在庫数で帳簿(論理)在庫の数を調整するなどを実施したかったです。 販売管理だと24時間対応や日中棚卸などはコスト削減で当たり前なので また、障害により、トランザクション処理を再投入する際に 台帳がトランザクション発生時点でひけないと2度目の処理結果が変る。 (でも、台帳の更新も一連のトランザクション群に入れてしまえば 全てリランできるともいえる。) 2)自前の時間軸の対応について 過去を索引する方法は、 1.トリガで情報を残し、その情報をアクセスします。 2.一連のトランザクション群を逆算処理してその時点の情報を採取する があるかと思います。なんとなく1がシンプルかと思っています。 以上 有難うございました。

関連するQ&A

  • データベースの質問です。下記の四択について、どうい

    データベースの質問です。下記の四択について、どういうものか根拠を教えて下さい システム障害発生時には,データベースの整合性を保ち,かつ,最新の データベース状態に復旧する必要がある。このために,DBMSがトランザクション のコミット処理完了とみなすタイミングとして,適切なものはどれか。  ア アプリケーションの更新命令完了時点  イ チェックポイント処理完了時点  ウ ログバッファへのコミット情報書込み完了時点  エ ログファイルへのコミット情報書出し完了時点

  • データベースソフトウェアの共有の方法

    規定のOSがインストールされていないNASに、 リレーショナルデータベースソフトを入れて、そこで、 トランザクション処理を行なわせますと、 ファイルの破損が発生しやすいのでしょうか。 それとも、フォーマット形式とかNASの設定とかで、 それを克服させてもらえるのでしょうか。

  • ファイルメーカーPro 二つのデータベース間のジャンプ

    台帳というデータベースに1000人の基本情報。 Aというデータベースにそのうちの100名の生活情報(カードのように表示)、同様にBというデータベースに100名の職業情報が登録されています。 A,Bの基本情報は台帳からのリレーショナル(ルックアップ)で表示されています。 Aで山田太郎さんが表示されているときに、Bの山田太郎さんのデータに、ボタンひとつでジャンプしたいのです。 今は、Bを開いて、いちいち山田で検索していますが、スクリプトでそれが出来ないでしょうか。

その他の回答 (2)

  • 回答No.3
noname#182251
noname#182251

「時間軸の概念」が無くてもご希望のことはできそうに思います。 例えば在庫数を「在庫数データ」として持ち、それが変動してしまうと「時間軸の概念」が必要になりますが「総入庫数」-「総出庫数」として求め「入庫記録テーブル」「出庫記録テーブル」のフィールドを 品物ID 個数 入出庫日時 とすれば、ある品物に対し、ある時点での個数を計算できます。棚卸しも、ある種の入出庫と考えて処理すれば良さそうです。 >1.トリガで情報を残し、その情報をアクセスします。 >2.一連のトランザクション群を逆算処理してその時点の情報を採取する このように難しいことをする必要が、本当にあるのでしょうか?

共感・感謝の気持ちを伝えよう!

  • 回答No.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は「特定期間の変更内容」を検索する機能があっても、「過去の特定時点のデータ」を検索するする機能は提供されていないため、ラッパー関数を自作する必要があります。

共感・感謝の気持ちを伝えよう!

関連するQ&A

  • 処理しきれないクエリ

    データベースに処理しきれないクエリが溜まってしまいパンクしてしまったらデータベースを使用しているサイトなどのデータが消える事はありますか?

  • access クエリのレコードセットが勝手に変わる

    access 2010を使用しています クエリのレコードセットプロパティを使用者(閲覧者)が変更できないようにするため、「スナップショット」にしていたのですが、「ダイナセット」に勝手に変わってしまいます。 このクエリは外部データベースをそのまま閲覧できるようにしている物です。 (ちなみに外部データベースは他ファイルのアクセスデータベース(mdb)です。) 使用者は社内の一部社員であり、どのような操作を行って変更したかは特定できませんが、 クエリのプロパティを変更できるだけの力量を持った社員はいないので、直接変更したことは ないと思われます。 クエリのプロパティを直接変更せずにレコードセットプロパティが変わることはあるのでしょうか? もし、そのような事があるならば、使用者に変更させないようにする対策は他にあるのでしょうか? Web上を色々検索してみましたが、原因や良い対策方法が見つからないので、どなたかご教示お願い致します。

  • 平成23年 春期 基本情報技術者 午前 問19

    解説にある、「データベースサーバでは、1トランザクション当たり、データベースの 10 データブロックにアクセスする SQL が実行される。データブロックのアクセスに必要なデータベースサーバの CPU 時間は, 0.2 ミリ秒で、CPU 使用率の上限は、80%であるから、処理できるトランザクションの数は 400 件になる。 」で、なぜ400件になるのかがわかりません。 問題文から、1トランザクションにつき、0.2ミリ秒かかる。 ということは、2秒につき、300トランザクション処理する。 ということは、1秒ではその半分で、150トランザクション処理する。 ということは、150トランザクション×0.8(CPU 使用率の上限)=120トランザクションでは?? http://情報処理試験.jp/FE23a-am/k19.html

  • テーブル作成クエリとデータベースの分割

    当方、Accessは全くの素人ですが、急遽Accessにて連絡先台帳を 作ることとなりました。 参考書を片手に、なんとかそれ相応のものになってきましたが、 表題部分にて四苦八苦しております。 どうぞ、ご教授のほどよろしくお願いします。 まず、連絡先テーブルを作成しました。 この中には個人名、会社名、住所などを入力するようにしました。 会社名の中には複数のレコードがあるため、個人向けではなく、会社向けの 送付用のラベルを作成したいと思い、テーブル作成クエリを用いて 会社テーブルを作成しました。 上記テーブルから、ラベル作成までは何とかできるようになりましたが、 複数のユーザーがこのデータベースを使うため、データベースの分割をし 運用したいのです。 また、この会社テーブルを別のデータベースでも使用したいと思っております。 ツールを用いて、データベースの分割はできましたが、新たな連絡先が 追加されたときなど、再度テーブル作成クエリを実行してしまうと、リンクが 外れてしまいます。 外部データからリンクテーブルを作りなおすと、以前のデータのままなので、 分割したデータベースを更新しなければならないことはわかりましたが、 その方法が全くわかりません。 できれば、更新ボタンを押した際に、 テーブル作成クエリを起動して、テーブルを作成し、分割したデータベースを 更新させたいのですが、何か良い方法はございませんでしょうか? 他の方法でも全く問題ありません。 VBAやマクロでも構いません。 ただ、VBAもマクロも殆どわかりませんので、できればコード等を記載して いただけると助かります。 Access2007を用いております。 どうぞよろしくお願いします。

  • データベースがアタッチできません

    SQL Server2000を使用しています。 あるパソコンの作成済みのデータを別のパソコンに移行しようとしているのですが、SQL Server Enterprise Managerのアタッチ機能を使用してアタッチしようとすると、「エラー9004:データベース'KEIKADB01'のログを処理中にエラーが発生しました。」というメッセージが表示されアタッチすることができません。 色々と調べてはみたのですが見当がつきません。 何かご存知の方がいらっしゃいましたらご教授ください。

  • データベース

    基本情報処理のデータベース技術についてなのですが、 次の問題の解答を教えて下さい。できれば簡単な解説もお願いします。 問1.データベースシステムを導入することによって期待できる効果を2つ選べ。   ア コード設計作業の軽減   イ 重複データの削減   ウ データ転送の高速化   エ プログラムとデータの独立性向上 問2.データベースのデータ構造に関係しない用語はどれか。   ア 表構造   イ ネットワーク   ウ 木構造   エ SQL 問3.次のデータベースに関する記述のうち、正しいのはどれか。   ア プログラムとファイルが密接な関係にあるので,プログラムがつくり易い   イ データに重複が無いので,業務によってデータ内容に矛盾が発生しない   ウ 適用業務ごとに専用のファイルがないので、ファイル管理がしにくい   エ データの扱いが標準化されるために、個別の業務処理がしづらい   

  • ACCESSのクエリ内のテーブルが見えない

    今会社でデータベースの管理(というほどでもないが、データがきちんとアップデートされてきているかのチェック係)をやらなければならない立場に追い込まれているのですが、私コンピュータは大の苦手でデータベースを殆ど理解しておりません(リレーショナルの概念くらいは分かってます)。 状況は私のところがA、他にBという会社があって、データが他国Cから送られてきます。Cから生データをBに送り、Bで変換してAのサーバにアップし、Aで私が統計学的な解析を行っています。 うちのAにはLINUXにSYBASEを組み込んでサーバ筐体を構え、私が無線LANのPCでそこからACCESSを使ってデータを引っ張り出していました。もともと某社の技術者の方がそうセットしておいてくれたので、私はPC上のアクセスファイルをダブルクリックするだけでよかったのです。 ところが、最近になって、C国の入力が不十分であり、抜本的に内容を変えることになりました。B社で製作した各テーブルも姿を変えることになり、暫定版がアップされているはずなのですが、もともと存在していた”db1.mdb”ファイルからは見えません。オブジェクトの「クエリ」にのみ20種類くらいのテーブルがあり、それらをクリックすると ODBC--呼び出しが失敗しました。 [INTERSOLV][ODBC SQL Server driver][SQL Server]TABLE_001 not found. Specify owner.objectname or use sp_help to check whether the object exists (sp_help may produce lots of output). (#208) なるメッセージが出ます。これは、アクセス上で開きたいテーブルをサーバ内での名前に合わせて、そこにリンクするようにとアクセスファイルの各テーブルに対して設定しなおさなければならないのでしょうか。 冗長になって申し訳ありません。なんせドシロウトなものですから、教えてもらい方もままならないのです。どなたかお助け下さい・・・

  • SQL VC#での更新クエリの引数について

    Visual C# 2010 Express(WPFアプリケーション)とSQL Server 2012 Expressでツール(データベースアプリケーション)を作成しています。 VC#のデータセットデザイナから更新クエリを作成したのですが,実際にそのクエリを使用する際に引数として「Original_」のつくものと「int? IsNULL_」のつくものがあるのですが,これは何をいれれば良いのでしょうか? ネット上で調べてもわかりませんでした。基本的すぎることなのでしょうか・・・。 詳しい方ご教授お願いいたします。

  • データベースソフトとは・・・

    情報処理の授業でデータベースについてレポートを書くことになりました。 課題の内容は「データベースソフトにはどのようなものがあるか列挙せよ」という漠然としたものなので、何から書けばよいか困っています。 まったくの初心者なので、自分なりに調べてみたのですが、顧客管理用など種類もたくさんあり混乱しています。 Access Oracle ファイルメーカー OpenOffice.org MS SQL Server PostgreSQL MySQL DocuWorks EXCEL 以上が自分で調べたものなのですが、これがすべてデータベースソフトなのかも自信がありません。 Access、Oracleが有名らしいのですが、他にも有名なものって何なのでしょうか。 市販でも、フリーソフトでもかまいません。 どうぞ回答よろしくお願いいたします。

  • Accessのクエリ画面のリクエリーの仕方について

    Access2003です。宜しくお願いします。 VBAでクエリを作成・削除しているのですが、 作成するとデータベースにはまだ表示されず、 F5(ファンクションキー)を押してリロードさせると表示されます。 (削除はVBAで処理するだけでデータベースからも消えています) 作成した時もVBAのみでちゃんと表示されるように リフレッシュ?リクエリー?させたいのですがやり方がわかりません。 ご存知の方宜しくお願いします。