• 締切済み

DBのテーブル構成について

テーブルA:承認が必要なデータが保存されます。 テーブルB:承認が完了したデータが保存されます。 承認処理はWebからオンライン処理で行います。 承認完了後、バッチ処理でテーブルBに内容をコピーします。 承認完了時の処理として、以下の2パターンのどちらにするかで悩んでいます。 1.テーブルAの完了フラグをONにする。   バッチ処理は、テーブルAの完了フラグがONのデータを対象とする。 2.新たにテーブルCを設け、承認完了したデータをコピーする。   バッチ処理は、テーブルCに存在するデータを対象とする。 1は、完了・未完了が混在するデータの中から完了データを抽出しますが テーブルAの完了フラグに索引をつけておけば気にする必要がないのでしょうか? 2は、存在するデータ全てが処理対象となる為、データの抽出は用意ですが その為だけのテーブルCを作るのもありなのでしょうか? なお、データ件数は最大で50万件程度を想定しています。

  • Oracle
  • 回答数3
  • ありがとう数3

みんなの回答

  • entree
  • ベストアンサー率55% (405/735)
回答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をするのが良いように見えます。

  • Siegrune
  • ベストアンサー率35% (316/895)
回答No.2

オンラインの処理で、 >2.新たにテーブルCを設け、承認完了したデータをコピーする。 >  バッチ処理は、テーブルCに存在するデータを対象とする をするなら、 バッチ処理なしで、オンライン処理で、テーブルBに内容をコピーしたらどうなのだろう。 だめな理由が、質問文から読み取れませんけど。 まあ、明示されていない理由(承認した後日次処理で反映してリアルタイムでは反映してはいけないとか)があるとして。 >1は、完了・未完了が混在するデータの中から完了データを抽出しますが >テーブルAの完了フラグに索引をつけておけば気にする必要がないのでしょうか? サーバの性能や資源にもよりますが、50万件程度の件数で、インデックスなしとありで どれくらい性能に差がでるのかな、というところは気になります。 (一般論ですが、1sが1msへと1000倍早くなったところで・・・。) 遅ければ、テーブルAの完了フラグに索引を付けると考えておけばいいと思います。 >2は、存在するデータ全てが処理対象となる為、データの抽出は用意ですが >その為だけのテーブルCを作るのもありなのでしょうか? 冒頭の話は置いておくと、ないわけではないのですが、 ・承認を取消しするときにテーブルCの削除をする必要がある ・未承認一覧を出すときに「テーブルCになくテーブルAにあるレコード」を抽出する必要がある ・既に承認済みのものを承認しようとしたときにエラー対策が必要。  (同じ人のIDでクライアント2台で同時に同じレコードに対する承認画面を上げておいて  順番に実行してみると・・・) ## そもそも、テーブルCを作って二重にデータを持っているのは資源のムダと思いますし、 ## バッチ処理は楽(?)かもしれませんが、最終承認の取消し処理は面倒な上に、 ## 未承認の一覧を出すのも手間かかるので、私なら、1しか選択しません。

  • naoiz
  • ベストアンサー率40% (59/144)
回答No.1

懸念点がよく理解しかねますが、普通は1の方でしょうね。

関連するQ&A

  • プログラムの考え方と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と何も変わらないようなものがもう一つできてしまいます。 どういうのがスマートというか良い考え方なのでしょうか。

  • Access、Aテーブルにあって、Bテーブルにない

    Access初心者です。 Aテーブルに存在するレコードかつBテーブルに存在しないレコードを抽出したい。 例えば、 Aテーブル 100 300 Bテーブル 100 200 の場合、300のみ抽出したい。 どのようにすれば抽出できますか。 よろしくお願いします。

  • テーブル構成について

    Perl + PostgreSQL でWEBシステムを作成しております。 まず例を記載致します。 テーブル例: [ 顧客情報 ] 名前,携帯電話キャリア区分,情報A,情報B,・・・ 上記のようなテーブルが存在していたとします。 「携帯電話キャリア区分」のカラムには、'1'か'2'か'3'が入力されます。 1はDoCoMo、 2はKDDI、 3はVodafone と云う風に決めておきます。 以下質問 キャリア区分に1~3が存在し、数字がそれぞれのキャリア名と結びついています。この携帯キャリア管理をDB上に被参照テーブルを作成しそこで行うか、この程度の項目数とデータ数であれば、テキストデータとして作成し管理しておくか、どちらで行おうか非常に悩んでおります。 そこで皆さんのご意見を参考とさせて頂きたく投稿させて頂きました。 ちなみに私の考えたそれぞれのメリット・デメリットは以下の通りです。 ■DB上での管理 全データを一元的に管理できる 柔軟性が乏しい(仮に運用途中でテーブル項目が増えたりしたら面倒) ■テキストデータの管理 バックエンドとの通信がない為処理が早い DBとテキストでデータ管理が分かれる 柔軟性が高い(オープンソースなんで・・・) 以上です。 よろしくお願い致します。

  • Accessでテーブルのリンクを新規テーブルに保存

    ExcelのデータをAccessのテーブルでリンクしています。 そのデータをクエリで必要なレコードだけを抽出します。 抽出したデータのみを新規テーブルとして保存したいんですが、保存の仕方がわかりません。 Access2000です。 どうかよろしくお願いします。

  • ACCESSパススルークエリでオラクルDB接続

    パススルークエリを用いてオラクルDBの「売上明細」テーブルのデータを抽出する。 抽出の対象はLOCALのテーブル「対象年月」で指定した月のデータに絞る。 上記の抽出をする場合、選択クエリのSQLでは Select * From 売上明細 Where Exists (Select * From 対象年月 Where 売上明細.YM=対象年月.YM); で抽出出来るのですが、パススルーだと#942「表またはビューが存在しません。」 のエラーが出ます。  年月の条件を付けずにすべてのデータを抽出することは出来るのですが 構文教えていただけるとありがたいのですが

  • テーブルのどちらかにデータがない事があるテーブル結合について

    ■table a のテーブル構成 date a_id b_id c_id a_count ■table b のテーブル構成 date a_id b_id c_id b_count value 上記の2つのテーブル構成から、 ■date a_id b_id c_id毎の集計データ date a_id b_id c_id a_count b_count value を抽出するSQLが知りたいです。 table aにあって、table bに存在しない。又は逆もある為、 union しかないと思うのですが、思いつきません。。

    • ベストアンサー
    • MySQL
  • 抽出条件に応じてテーブルを作り分ける方法

    抽出条件テーブル(a)があり、抽出条件が参照するテーブル(b)がある。(a)には複数の抽出条件が登録され、(a)を参照しつつ、(b)から抽出されるテーブル(c)を抽出条件に応じて複数作成したい。つまり、(a)に登録された抽出条件の数だけテーブル(c)が作成される。 これをクエリで実行できる方法をご教示願いたい。 なお、(b)からデータを抽出する場合、上記の抽出条件テーブル(a)に代えて、クエリ内に抽出条件を20~30個記述する方法でも可。 Access2010を使用しています。VBAは使用しません。

  • テーブルコピー処理

    早速質問させていただきます。 VB2005+MSDE2000でWindowsアプリを作成しています。 Aテーブル(本番テーブル)とBテーブル(ミラーテーブル)がありまして、 BテーブルはAテーブルと同列を持っており最終列に更新時刻が追加されています。そしてAとBともに年月列(200610等)を持っています。 実現したい処理は、年月度の売上データをミラーテーブルにコピーする処理です。 1.年月を元にAテーブルからデータを抽出する。 2.Bテーブルに対してトランザクションをかける。 3.年月を元にBテーブルから削除する。 4.1で取得したデータをBテーブルに追加する。  (この時、Bテーブルの最終列に更新時刻を入れる。) このような処理を行う際に、処理1は単純にセレクトなのでSqlDataAdapterでDataTableに流し込むのが最適かなと思います。 処理2についてもSqlTransactionを開始すればOK。 処理3はトランザクション内で削除を実施。 最後の処理4をどのように実装すればよいのか不明です。 SqlDataAdapterを使って処理1で取得したDataTableをBテーブルに追加したいのですが可能でしょうか? このあたりを具体的にご教授のほどお願い致します。

  • DAOでSQLServerに接続し、LeftJoinで別DBのテーブル

    DAOでSQLServerに接続し、LeftJoinで別DBのテーブルを参照したい。 いつもお世話になっております。 標題についてなのですが、 VB6.0、SQLServer2008Expressで開発を行なっております。 接続にはDAOを利用しています。 その際に、AというDBのT1というテーブルとBというDBのT2というテーブルのデータを結合して抽出したいのですが、エラーが出てしまいます。 ソースは以下の通りです。 Dim DBR As Database Dim T_TEST As Recordset Set DBR = Workspaces(0).OpenDatabase("", False, False,         "ODBC;Driver={SQL Server};SERVER=hoge;DATABASE=A;UID=sa;PWD=admin") Set T_TEST = DBR.OpenRecordset("select * from T1 left join B.dbo.T2 on T1.AAA = T2.AAA") で実行すると、T_TESTをOPENするところで、実行エラー3024が発生します。 エラー内容は「ファイル C:\*******\B.dboが見つかりません」と、ソースが保存されているフォルダにB.dboがありませんといった内容です。 クエリは、ManagementStudioでは問題なく抽出できました。 DBRでAを開いて、Bが開けていないからだとは思うのですが、どのようにすれば複数のDBに存在するテーブルのデータを結合して取得できるでしょうか。 ご教授お願いいたします。

  • 複数テーブルの結合

    テーブルA  a_id id a_data a_date ----------- テーブルB id b_data b_date テーブルC id c_data c_date ----------- テーブルAとテーブルBは「id」がキーで1:N(Nは0も含む) テーブルAとテーブルCは「id」がキーで1:N(Nは0も含む) このような3のテーブルで a_idを検索キーにして次のフィールドのデータを抽出したいのですが。。。 ※テーブルCのc_dateを降順で先頭の1レコードのみ ※テーブルBのidをカウントする selectの結果(イメージ) id a_data a_date count(B.id) c_date ------------------------------------- 001 AAAA 2007/02/01 20 2007/02/14 005 BBBB 2007/02/02 0 2007/02/10 006 CCCC 2007/02/02 0 2007/01/08 003 DDDD 2007/02/01 100 002 EEEE 2007/02/01 9 004 FFFF 2007/02/01 0 よろしくお願いします