
テーブルA:承認が必要なデータが保存されます。
テーブルB:承認が完了したデータが保存されます。
承認処理はWebからオンライン処理で行います。
承認完了後、バッチ処理でテーブルBに内容をコピーします。
承認完了時の処理として、以下の2パターンのどちらにするかで悩んでいます。
1.テーブルAの完了フラグをONにする。
バッチ処理は、テーブルAの完了フラグがONのデータを対象とする。
2.新たにテーブルCを設け、承認完了したデータをコピーする。
バッチ処理は、テーブルCに存在するデータを対象とする。
1は、完了・未完了が混在するデータの中から完了データを抽出しますが
テーブルAの完了フラグに索引をつけておけば気にする必要がないのでしょうか?
2は、存在するデータ全てが処理対象となる為、データの抽出は用意ですが
その為だけのテーブルCを作るのもありなのでしょうか?
なお、データ件数は最大で50万件程度を想定しています。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
> テーブルA:承認が必要なデータが保存されます。
> テーブルB:承認が完了したデータが保存されます。
> 承認処理はWebからオンライン処理で行います。
> 承認完了後、バッチ処理でテーブルBに内容をコピーします。
一般的な話をすると、テーブルAとテーブルBが1:1で共通の属性を持っているなら、
そもそもテーブルAとテーブルBを分けたりしません。分けることで冗長になるので。
それに、承認済みデータと未承認済みデータはフラグや承認日時列を設定してあげる事で、
SQLで絞り込めますから。性能云々についても、何千万件ならいざしらず、たかが50万件
程度ならチューニング次第でどうにでもなるでしょう。
もちろん、これは一般論であり、そうせざるを得ない理由があるなら話は別です。
なので、まずは、Cテーブル以前にまずBテーブルがなぜ必要なのか明確にしていただかないと。
> 1.テーブルAの完了フラグをONにする。
> バッチ処理は、テーブルAの完了フラグがONのデータを対象とする。
> 2.新たにテーブルCを設け、承認完了したデータをコピーする。
> バッチ処理は、テーブルCに存在するデータを対象とする。
前提条件等にもよりますが、普通はますます冗長になる2案は採用しません。
さらに言えば、1案よりもNo.2様が言われている、承認してAテーブルのデータを削除する際に
Bテーブルにデータを入れる方が良いでしょう。
もっと言えば、データを移動するくらいなら、冒頭で述べたとおり、Bテーブル自体も無くし、
承認された時点で承認日時を入れるためのUPDATEをするのが良いように見えます。
No.2
- 回答日時:
オンラインの処理で、
>2.新たにテーブルCを設け、承認完了したデータをコピーする。
> バッチ処理は、テーブルCに存在するデータを対象とする
をするなら、
バッチ処理なしで、オンライン処理で、テーブルBに内容をコピーしたらどうなのだろう。
だめな理由が、質問文から読み取れませんけど。
まあ、明示されていない理由(承認した後日次処理で反映してリアルタイムでは反映してはいけないとか)があるとして。
>1は、完了・未完了が混在するデータの中から完了データを抽出しますが
>テーブルAの完了フラグに索引をつけておけば気にする必要がないのでしょうか?
サーバの性能や資源にもよりますが、50万件程度の件数で、インデックスなしとありで
どれくらい性能に差がでるのかな、というところは気になります。
(一般論ですが、1sが1msへと1000倍早くなったところで・・・。)
遅ければ、テーブルAの完了フラグに索引を付けると考えておけばいいと思います。
>2は、存在するデータ全てが処理対象となる為、データの抽出は用意ですが
>その為だけのテーブルCを作るのもありなのでしょうか?
冒頭の話は置いておくと、ないわけではないのですが、
・承認を取消しするときにテーブルCの削除をする必要がある
・未承認一覧を出すときに「テーブルCになくテーブルAにあるレコード」を抽出する必要がある
・既に承認済みのものを承認しようとしたときにエラー対策が必要。
(同じ人のIDでクライアント2台で同時に同じレコードに対する承認画面を上げておいて
順番に実行してみると・・・)
## そもそも、テーブルCを作って二重にデータを持っているのは資源のムダと思いますし、
## バッチ処理は楽(?)かもしれませんが、最終承認の取消し処理は面倒な上に、
## 未承認の一覧を出すのも手間かかるので、私なら、1しか選択しません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テーブル名をカラムとして取得...
-
sqlplusで表示が変なので、出力...
-
SQL*LoaderでCSVから指定した列...
-
update文で改行を入れる
-
SQL、2つのテーブルで条件一致...
-
カラム位置変更
-
SQLでSUMなどの関数でデータが...
-
DBからタブ区切りのCSVデータを...
-
SQL(oracle)でご助言いただきた...
-
SQLで違うテーブルの値を比較し...
-
オラクルの条件で時間を指定す...
-
件数とデータを同時に取得する...
-
SQL 複数テーブルのupdate
-
oracle XEのACCESS(OD...
-
INDEX RANGE SCAN とは?
-
ORACLE SQL 複数項目の最大抽出
-
Viewのカラムの長さが不明?
-
UPDATE文
-
半角英数文字の抽出がしたい。
-
特定のカラムが更新されたとき...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
update文で改行を入れる
-
SQL*LoaderでCSVから指定した列...
-
SQL、2つのテーブルで条件一致...
-
SQLでSUMなどの関数でデータが...
-
SQL 複数テーブルのupdate
-
テーブル名をカラムとして取得...
-
sqlplusで表示が変なので、出力...
-
ROWNUMでUPDATEをしたいのです...
-
SQL(oracle)でご助言いただきた...
-
カラム位置変更
-
件数とデータを同時に取得する...
-
OracleのSQLで同テーブルのカラ...
-
LONG型の先頭250バイトを Varch...
-
数値をNUMBER型にするかCHAR型...
-
特定のカラムが更新されたとき...
-
半角英数文字の抽出がしたい。
-
DBからタブ区切りのCSVデータを...
-
sqlで質問です。 aテーブルとb...
-
SQLについて教えて下さい。 主...
-
Oracleのview、synonymをCOMPIL...
おすすめ情報