プログラムの考え方とDBの扱いかたについて
- プログラムの考え方とDBの扱い方について相談です。バッチプログラムでデータリストの取得と特定処理を行い、結果をDBに格納するという処理を考えています。しかし、データリストの取得元が複数あり、取得データの確定タイミングも異なるため、どのように実装すれば良いか迷っています。適切なバッチ分けやデータの管理方法についてアドバイスをお願いします。
- プログラムの考え方とDBの扱い方について質問です。データリストの取得元が複数あり、取得データの確定タイミングも異なるため、適切なバッチ分けやデータの管理方法に悩んでいます。毎日1か月分のデータを取得する負担や、確定データと未確定データの混在も問題です。スマートな実装方法や良い考え方があれば教えてください。
- プログラムの考え方とDBの扱い方について相談です。データリストの取得元が複数あり、取得データの確定タイミングも異なるため、適切なバッチ分けやデータの管理方法に悩んでいます。複数のバッチ案を考えましたが、どれが最もスマートな実装方法か迷っています。データの取得と抽出処理、キャンセルデータの管理方法についてアドバイスをお願いします。
- ベストアンサー
プログラムの考え方とDBの扱いかたについて
技術的な質問ではなく、考え方についての質問です。 こっちを立てるとあっちが立たずのような状態で困ってます。 どのカテゴリで質問するか悩んだのですが、直近の投稿数が多いのでC言語のところで質問させて頂きます。 ご教示ください。 現在こういうバッチプログラムがあります。 バッチA > (1)外部から前日分の確定データリストを取得 > (2)データリストに基づいて特定処理の実施 > (3)特定処理の対象になったものをDB(テーブルA)に格納 ※1つのプログラムで3つの処理を行ってます 今度、データリストの取得先に外部2が追加されます。 仕様が同じであれば、バッチAと同様のものを作ればいいのですが、 外部2の場合、1か月の間データが確定されないという仕様があります。 前日分のデータが確定するのは、 1カ月後までの間に取得するデータリストにキャンセルデータが無かった場合です。 1.そこでこのように考えました。 バッチA > 外部2から1カ月分のデータリストを取得 > 取得データから、1か月前のデータを対象に1ヶ月間キャンセルデータが無いものを抽出する > (2)データリストに基づいて特定処理の実施 > (3)特定処理の対象になったものをDBに格納 2.でも、毎日1か月分のデータを取得して抽出処理を行うのは負担になるし、 毎日ほぼ同じデータを取得するのはあほらしいと思い、以下のように考えました。 バッチA > 外部2から前日分のデータリストをDB(テーブルB)に格納 > DBから1か月前のデータを対象に1ヶ月間キャンセルデータが無いものを抽出する > (2)データリストに基づいて特定処理の実施 > (3)特定処理の対象になったものをDB(テーブルA)に格納 3.今度はそもそもバッチ分けた方がいいんじゃないかと思い、以下のように考えました。 バッチ1 > 外部2から前日分のデータリストをDB(テーブルB)に格納 バッチA > DBから1か月前のデータを対象に1ヶ月間キャンセルデータが無いものを抽出する > (2)抽出したデータリストに基づいて特定処理の実施 > (3)特定処理の対象になったものをDB(テーブルA)に格納 4.さらに、キャンセルデータの処理も別バッチにすれば、 バッチAでの処理がわかりやすくなるじゃないかと思い、以下のように考えました。 バッチ1 > 外部2から前日分のデータリストをDB(テーブルB)に格納 バッチ2 > DB(テーブルB)から1か月前のデータを対象に1ヶ月間キャンセルデータが無いものを抽出する > 抽出したデータのキャンセルデータのレコードをDB(テーブルB)から削除 バッチA > (1)DB(テーブルB)から前日分のデータリストを取得 > (2)データリストに基づいて特定処理の実施 > (3)特定処理の対象になったものをDB(テーブルA)に格納 ここまで考えてどうするのがスマートなのかよくわからなくなってきてしまいました。 3か4でいこうと思うのですが、3の時にバッチAで抽出処理をするのはいまいちって思ってます。 それで4にしようと思ったのですが、 テーブルBは取得データをそのままの状態で入れておくって当初考えてたので、 それをあとからレコード削除したりするのもどうなんだろうと思ってます。 確定したデータと未確定のデータが混在するのもなんだか腑に落ちません。 それだったら、新たにテーブルCを作って、確定データを突っ込んでおくってことも考えたのですが、 そうなると、バッチA最後に格納しているテーブルAと何も変わらないようなものがもう一つできてしまいます。 どういうのがスマートというか良い考え方なのでしょうか。
- karace
- お礼率57% (134/234)
- C・C++・C#
- 回答数2
- ありがとう数1
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
ああ、 1.データを取得する 1a.処理候補を選別する の部分の無駄を削りたいという質問内容なんでしょうか? データの取得に1か月分毎回取るのがあほらしいということであれば、 差分だけ取得して、過去にとったものとマージすればいいと思うけど。 処理候補の選別については、何らかのアルゴリズムを適用すれば 速くなると思うけれども、それだけ複雑になるわけで、 まずはシンプルなアルゴリズムで要求仕様を満たせるかどうか、 測定してみたらいいのではないでしょうか。 無駄は多いと思っても、シンプルな実装で要求仕様を満たせれば、あとあとのメンテが楽ですよ。
その他の回答 (1)
- hidebun
- ベストアンサー率50% (92/181)
説明が冗長で、現場の人(もしくは本人)しか理解できないような文章になってるよ。 ちょっと機能について簡単に整理すると、 1.データを外部から取得する 2.データを処理する 3.処理結果をデータベースに格納する の3つなのでしょ? で、1.の取得先が外部1と外部2からなるのかな。 2と3は取得先によらない処理?なら、そこは共通化してくくり出し、 手をつける必要がないようにしておく。 1.は取得先が増える可能性もあるので、そこだけ独立してメンテを行えるようにしておく。 パフォーマンスが問題になれば、1・2・3を1つずつチューニングする。 そうすれば、バグが起きても対応が容易。 というわけで、私なら、まずはメンテナンス性を重視します。
関連するQ&A
- DBのテーブル構成について
テーブルA:承認が必要なデータが保存されます。 テーブルB:承認が完了したデータが保存されます。 承認処理はWebからオンライン処理で行います。 承認完了後、バッチ処理でテーブルBに内容をコピーします。 承認完了時の処理として、以下の2パターンのどちらにするかで悩んでいます。 1.テーブルAの完了フラグをONにする。 バッチ処理は、テーブルAの完了フラグがONのデータを対象とする。 2.新たにテーブルCを設け、承認完了したデータをコピーする。 バッチ処理は、テーブルCに存在するデータを対象とする。 1は、完了・未完了が混在するデータの中から完了データを抽出しますが テーブルAの完了フラグに索引をつけておけば気にする必要がないのでしょうか? 2は、存在するデータ全てが処理対象となる為、データの抽出は用意ですが その為だけのテーブルCを作るのもありなのでしょうか? なお、データ件数は最大で50万件程度を想定しています。
- 締切済み
- Oracle
- バッチファイルから直接db2コマンドに引数を持たせて実行したい
バッチファイルより、得たデータを引数としてdb2コマンドに私、実行したいのですが、そのようなことはできるでしょうか。 (詳細) バッチファイルで、日付&時間を変数に格納します。これを、db2のテーブルにインポートしたい。 稚拙な質問で申し訳ありません。
- ベストアンサー
- その他(データベース)
- バッチプログラムでSQLSever2008を操作
教えてください。 (1) SQLSever2008内にあるデータベース1のテーブルAのデータを削除 (2) 同じインスタンス内にあるデータベース2のテーブルAのデータを、DB1のテーブルAにコピー (3) (2)の処理が失敗したらロールバック 上記のことを、バッチプログラムで行いたいと思っております。 単にコマンドプロンプトで入力するというのであれば(1)も(2)もできるのですが、 バッチプログラムで行うとなると、どうやっていいのか見当もつきません。 さらに(3)は、(2)でSQLを実行した戻り値も見なければならないと思います。 データベース1のテーブルAとデータベース2のテーブルAはまったく同じ構成です。 自分なりに色々調べてはいるのですがどうしてもわかりません。 もしどなたかご存知の方がいらっしゃったらぜひ教えてください。 どうぞよろしくお願いいたします。
- 締切済み
- SQL Server
- 毎日DBのデータをCSVに抽出したい
タスクスケジューラで定期的に「SQL」を発行させてデータをCSVファイルにはきだしたいと思っています。 対象のdbがOracle、DB2、MySQLです。 悩んでいることが2か所あります。 抽出条件のSQLはSQLファイルに書いて簡単に実現できるのですが、 ・毎日CSVを作るためファイル名に日付を入れたい ・抽出条件に特定の日付を入れたいのですが対象のテーブルでは日付を日付型でもっておらず文字列です 例:20110206 どのようにすればいいでしょうか? ひとつのSQLファイル内で実現は不可能でしょうか?
- ベストアンサー
- その他(データベース)
- DBとバッチ処理、オンライン処理の関係について
DBの登録や更新や削除をする際に利用するバッチ処理とオンライン処理の使い分けについてについて、お聞きしたいです。 バッチ処理は決められた時間に起動する処理だと認識しています。オンライン処理は求められたらその場でする処理だと認識しています。もしDBに登録や更新、削除する情報がある場合は、なるべくオンライン処理では行わないほうがいいのですか? もしその場合、対象のデータはファイルや更新用のDBなどを用意して一時的に保存しておいてバッチ処理にて行うということでしょうか?
- 締切済み
- その他(データベース)
- アクセスのプログラム
こんにちわ 異動でサーバーとかを扱うようになったのですが まったくわからずにいる状況です。 アクセス95で作ったプログラムを そのうちに2000で作り直さなければならないのですが まったくわかりません。 困り果てています。 ちなみにどういうプログラムかというと、 端末ID、店舗名、棚卸日などのテーブルがあり、 月の20日以降になると、プログラムでホストから 送られてきた棚卸データをバッチ処理し、そのテーブルと ぶつけ、どの店舗が棚卸を行ったかがリストで出るようになっています。 まずはホストからのデータをバッチ処理する方法が わかりません。 ぶつけるのは、端末IDでぶつかったら新たにテーブルを 作るって言う感じはわかるのですが・・・。 どうやったらいいんでしょう?
- ベストアンサー
- その他(データベース)
- DBの表の内容を全取得したい(PDO)
DBおよびPG初心者です。 単語や説明に不備がありましたらご指摘下さい。 DB内の各テーブルをブラウザで視覚的に確認するために 選択したテーブルの内容を取得したいと思っております。 DB各種に汎用的に使えるPDOモジュール(?)を使用。 ■ DBMS上にあるDB数と各々のDB名を取得(配列に格納される?) するにはどのように記述すればよいでしょうか。 ■ DB内のテーブル数と各々のテーブル名を取得(配列に格納される?) するにはどのように記述すればよいでしょうか。 ■ テーブルのカラム数はcolumnCount()で取得することができたのですが、 それぞれのフィールド名はどのように取得すればよいのでしょうか。 ご教示の程よろしくお願い致します。
- 締切済み
- PHP
- DBサーバー(A)とDBサーバー(B)を双方向のバッチ処理で更新させよ
DBサーバー(A)とDBサーバー(B)を双方向のバッチ処理で更新させようと思っています。 ですが、そもそもAのDBからBのDBにデータを送るにはどうしたら良いかがわかりません。 httpプロトコルでバッチ処理をやることになっているのですが、 サーバーが違うしWEB SessionやHTTP リクエストを受け取れるのだろうか? そもそも大量のデータを一括で遅れるのだろうかと疑問があります。 HTTPリクエストだと「アドレス?パラメータ」の形でデータを送信して 受けとるというのがスタンダードなやり方ですが、大量のデータは難しいと思ってしまいます。 こういった形でデータ授受を行う場合、 ロジック的にはどういうふうになるのでしょうか。 またhttpプロトコルで大量のデータを送るにはどうすれば良いのでしょうか。
- ベストアンサー
- Java
- ACCESSパススルークエリでオラクルDB接続
パススルークエリを用いてオラクルDBの「売上明細」テーブルのデータを抽出する。 抽出の対象はLOCALのテーブル「対象年月」で指定した月のデータに絞る。 上記の抽出をする場合、選択クエリのSQLでは Select * From 売上明細 Where Exists (Select * From 対象年月 Where 売上明細.YM=対象年月.YM); で抽出出来るのですが、パススルーだと#942「表またはビューが存在しません。」 のエラーが出ます。 年月の条件を付けずにすべてのデータを抽出することは出来るのですが 構文教えていただけるとありがたいのですが
- ベストアンサー
- Access(アクセス)