30日分の売り上げを登録するシステムをつくっています。
登録先はDBで、日付を主キーとして1レコードずつ増えていく感じですが、既に登録があるものについてはレコード有無の判断をして上書きにする必要があります。
処理を考えたところ、2パターンのどちらが高速か負荷が少ないのかで迷っており、助言をいただきたいと思い投稿しました。
<1>
(1)DB接続
(2)既に登録されている日付を把握するため、レコードから日付を全て取得(select all)
(3)登録しようとしている1日目の日付とDBから取得した日付を全て照合し、同一があれば上書き(update)、なければ登録(insert)で処理をする。
(これを30日分繰り返す)
(4)DB切断
<2>
(1)DB接続
(2)登録しようとしている1日目の日付をキーにDBに同一日での登録がないか参照(select)し、同一があれば上書き(update)、なければ登録(insert)で処理をする。
(これを30日分繰り返す)
(3)DB切断
<1>はDB参照が一度で終わるので高速かなと思うのですが、参照結果を一度格納し、再度1つづつを比較としてひっぱってくるためあまり効率が良くないのかと悩んでいます。
アドバイスお願いいたします。
No.2ベストアンサー
- 回答日時:
補足内容を見て、なんとなくイメージはつかめました。
確かに、<1>の場合は2回selectをかけるのに対し、<2>の場合はselectは1回で済みますからね。ただ、<2>の場合、「登録しようとする日の日付をキーにDBに同一日での登録がないか参照」する必要はない気がします。直接その日付でinsert処理を行い、エラーが返ってきたら、すでに登録済みということでupdate処理を行う、というロジックでもよいのではないでしょうか。
ちなみに、このシステム自体についての質問なのですが、1日に何度も処理を行うシステムなのでしょうか。もし1日に1回と決まっているなら、もっとシンプルになると思いますし、1日に複数個のデータを入れるような処理なら集計処理の追加を検討するなど、システムそのものの設計を見直した方がよいかもしれません。余計なお世話ですが、念のため・・・
再度のご回答ありがとうございます。
>直接その日付でinsert処理を行い、エラーが返ってきたら、すでに登録済みということでupdate処理を行う
これが一番シンプルだと思いましたのでこの方法でやってみます!
>システム自体
アドバイスありがとうございます。
厳密には1日1回の登録のみなのですが、システムを使っていない今現在においても一回報告した後に修正が複数回きたり、数日分まとめて報告などという状況があるので、締め日までの間は自由に修正できるようにできた方がいいかと思ってこんなややこしい仕組みになりました。
1日の売上高なので1回でいいはずなんですけど・・・(汗)
集計処理は、個人的に使うのに便利そうですので、ぜひ取り入れさせていただこうと思います。
ありがとうございました。
No.1
- 回答日時:
どちらにしても「30日分繰り返す」のであれば、DB操作の観点からすると、ほとんど変わらないような気がします。
個人的には<2>がよいと思います。for文で30回回して、検索対象の日付のデータの有無(mysql_fetch_arrayの結果で判定)によりinsertかupdateかを決める形でしょうか(insert用、update用関数は別途用意しておいた方が楽です)。
# というより、<1>の(2)の処理の意味がよく理解できないのですが・・・
この回答への補足
回答ありがとうございます。質問を略しすぎて重要な部分がぬけていました;申し訳ありません。
<1>と<2>は参照の方法が違います。
<1>は一度のselectで全レコードを取得して配列に格納し、その後PHP側で登録日と重複がないか確認します。
<2>は登録日をキーに30回か31回selectします。
<1>
(1)DB接続
(2)既に登録されている日付を把握するため、全レコードの日付を取得
(3)登録しようとしている1日目の日付とDBから取得した日付を全て照合し、同一があれば上書き(update)、なければ登録(insert)でSQLを作成。
(これを30日分繰り返し、SQLを作成する)
(4)SQL実行
(5)DB切断
<2>
(1)DB接続
(2)登録しようとする日の日付をキーにDBに同一日での登録がないか参照(select)し、同一があれば上書き(update)、なければ登録(insert)でSQLを作成する。
(これを30日分繰り返し、SQLを作成する)
(3)SQL実行
(4)DB切断
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server DBのテーブルの設計ができず困っています。 2 2023/06/29 16:43
- PHP 重複を防ぐ記述について教えて下さい。 3 2023/04/03 14:35
- MySQL SQLで日付別のIDを生成するには 3 2022/10/09 10:34
- IT・エンジニアリング ドメイン駆動設計の値オブジェクトについて質問 1 2023/05/13 02:50
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- 政治 マイナンバーのトラブル、人為的ミスが大半と言う事は、マイナンバーが必要だと言う事ですよね? 8 2023/06/22 15:28
- Oracle sqlで質問です。 Aテーブルの登録番号をキーにBテーブルから確認番号を取得したいのですが、Bテーブ 4 2023/05/18 13:08
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- ドライブ・ストレージ 登録店舗数に差がある理由 1 2023/01/30 20:09
- 数学 登録番号と年月日と時間から作成した数字列を出来る限り小さくする方法 7 2022/06/03 16:10
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
携帯サイトの構築について
-
CakePHPでのemptyの 0 判定に関...
-
APIで出てきたXMLをPHPで表示さ...
-
アドレスに[?****]と入れると、...
-
画像アップロードのファイル名...
-
リンク先を隠す方法はないでし...
-
TCPDFについて
-
centos6のlogにscript not foun...
-
.phpファイルが、表示されない
-
別ファイルの変数を呼び出した...
-
掲示板作成を目的とした初心者...
-
tex についての質問です。 割り...
-
apacheで拡張子を省略してアク...
-
ユーザーに入力してもらった値...
-
PHP(.php)及びJavascrpit(.j...
-
PHPで新しいウインドウで開く命...
-
ディレクトリ削除
-
Apacheでhttp://localhost/が表...
-
MkDir関数
-
HTTP_Clientが利用できるレンタ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PHPのif文でその処理を途中で抜...
-
インスタンス化に伴うメモリ消...
-
PHPが処理を途中でやめる。原因...
-
PHPExcel処理速度が遅い
-
phpの処理中に画面表示ををする...
-
関数の前にアットマークが付く場合
-
Cronで同じ処理を複数同時に実...
-
PHPで偶数と奇数を判断するには
-
3の倍数の和
-
includeしたファイルに変数を持...
-
タイムアウト処理?となる
-
プログラム内で処理中断後も継...
-
入れ子になっているHTMLタグも...
-
条件分岐 if(elseif) switchの...
-
Smartyにて、文字検索
-
アクセスクライアントごとにタ...
-
VBAからPHPを実行(キック)したい
-
【PHP】URLがドメイン名...
-
DBへの書き込みとメール送信を...
-
GETリクエストでURLを渡す時
おすすめ情報