Mysqlで銀行口座のような出入金管理

このQ&Aのポイント
  • PerlとMysqlを使用して銀行口座のような出入金管理を行うWebアプリケーションを構築しています。入金・出金・残高・日付・摘要の項目があり、ポイントを管理します。
  • フィールド設計に関して、入ポイントと出ポイントの2つのフィールドにする方法と、入ポイントと出ポイント、残高ポイントの3つのフィールドにする方法の比較をお願いします。
  • 会員用のシステムにおいて、銀行口座のような出入金管理を行う際、2つのフィールドにするか3つのフィールドにするか、効率的な方法についてご教示ください。
回答を見る
  • ベストアンサー

Mysqlで銀行口座のような出入金管理

PerlとMysqlでWebアプリケーションを構築しています。 その中で銀行口座のような入金・出金・残高・日付・摘要のような項目があります。 実際はお金ではなく、ポイントなので 入ポイント・出ポイント・残高ポイント・摘要です。 (日付・摘要はここでは問題ではありません) そこで本題なのですが、こういったDBを設計する際にフィールドは 入ポイント・出ポイントの2つにして、残高は出力する際に計算するのがいいのか それとも 入ポイント・出ポイント・残高ポイントの3つにして、インサートするさいに 毎回前残高を取得して、計算後インサートするのがいいのでしょうか? ※ちなみに会員用のシステムなのでその他にIDフィールドなどがあるのはここでは割愛しております。 不明な点や不足情報があればご指摘ください。 恐れ入りますがよろしくお願いいたします。

  • MySQL
  • 回答数4
  • ありがとう数4

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

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

>ここでおっしゃっている源泉というのはどういった解釈をすればいいのでしょうか? 源泉は、そのデータが発生したそもそもの要因と考えていました。 >ブラウザ上で表示したい内容は~~ 失礼しました。 売上の履歴も含めて表示させたいってことですね。 てっきり、1ユーザー1レコードで、出ポイントと入ポイントは それぞれ変動するたびに計算するデータ構造だと思い込んでました。 すみません。(Yahooや楽天の残ポイント表示みたいな感じ) select ( sum( 入ポイント ) - sum( 出ポイント) ) AS 残ポイント from ターゲットのテーブル group by ユーザーID こんなかんじで・・・ 履歴をそのまま表示させるということでしたら、 残ポイントがあったほうがいいかもしれませんねぇ・・・ ちなみに、私が上記設計をすると断見してしまったのは Yahooポイントの獲得情報を真似てのことでした。 Yahooの場合、 ◆合計表示場所 ----------------------------------- 利用可能ポイント:9999 ----------------------------------- ◆履歴 ----------------------------------- 取引日:9/1 1000 取引日:9/2 -500 取引日:9/3 2000 取引日:9/4 -600 取引日:9/5 -200 ----------------------------------- こんな感じで履歴部分と合算部分がわかれてます。 ユーザー数が半端ないので、履歴部分は月単位、合算部分は夜間のストアド等で計算していると 推測します。 画面設計が既に出来上がっていて、エンドユーザーがどうしてもそういった表示をしたい ということでしたら、後々のためにも残ポイント列を持たせておいたら安心ですね。 スタンダードというものを提示できずに申し訳ございません。

bakusui
質問者

お礼

ありがとうございます。 >ちなみに、私が上記設計をすると断見してしまったのは・・・ いえ、目からうろこです。 私が勝手にこういったものは通帳のように毎回残高を表示するものかと 解釈していただけで履歴部分と合算部分をわけて表示すればいいということが 気がつきませんでした。 楽天ポイントの履歴を先ほど確認しましたらまさしく ポイントの+か-しかないですね。 ありがとうございました。 助かりました。 すばらしい回答ですが、締め切らずもう少し他の回答もまってみます。

その他の回答 (3)

  • hogya
  • ベストアンサー率67% (49/73)
回答No.4

回答というより補足なので、参考までに読んでください。 >もちろんさかのぼって修正ということもありえますね。 そうしたシステムもあるかと思いますが、事実の記録に基づいたシステムでは基本的にはありません。 (データが確定する処理が何段階もあるような場合は途中修正ができるものもあります) 事実の訂正も訂正のデータを入力することによって記録します。 銀行の取引でもそうなっていますよね?(実際に紙に記録した通帳の訂正はできないので) そうすることで、正確な事実の記録やデータ改竄の防止だけでなく、計算がシンプルになるというメリットもあります。

bakusui
質問者

お礼

>事実の記録に基づいたシステムでは基本的にはありません。 おっしゃるとおりですね。 勉強になりました。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

システム上の残高というのは最初からの積み上げです。 1/1 入:5000 2/1 出:500 3/1 入:1000 だとして、電算上さかのぼって処理をする可能性は十分あります 1/15 出:2000とあとから入れた場合、2/1の残高4500は2500に 3/1の残高5500は3500に更新されなくてはいけません。 そのような連鎖的な更新が起こらないよう、入出データのみで処理します ただし、ご指摘の通りシステムの運用期間がながくなると相応の負荷がかかります そこで、システム的にある期間以前には遡って処理できないような締め処理をいれます そうすることで締めデータの残高とその後の入出データのみで現在の残高を表示できます

bakusui
質問者

お礼

回答ありがとうございます。 なるほどですね。 もちろんさかのぼって修正ということもありえますね。 そのたびに全データを更新かけていたらたいへんですね。 一定の期間がきたら締めるという処理についてはたいへん勉強になりました。 参考にさせていただきます。

回答No.1

はじめまして。 いわゆる「ポイント残高」というのは計算によって導き出される数値ですよね。 源泉ではないので、基幹データとして扱う場合は不要だと思います。 残高の重要度によってかわると思いますが、 ポイントの残高をユーザーに指し示すだけの目的でつかうのであれば 入ポイント、出ポイントのテーブルをView化して 残ポイント込のテーブルを参照するようなアプリケーション設計に、私ならします。 わざわざ計算して入れるのも面倒だし、 源泉としてのデータじゃないものも使いたくない という理由からです。 ただ、View設計が絡んでくる(このテーブルだけVIEWというのも反発のもとかと。)ので、そのへんの兼ね合いも含めて頑張ってください。

bakusui
質問者

お礼

早速の回答ありがとうございます。 >いわゆる「ポイント残高」というのは計算によって導き出される数値ですよね。 はい、そのとおりです。 >源泉ではないので、基幹データとして扱う場合は不要だと思います。 すみません。 ここでおっしゃっている源泉というのはどういった解釈をすればいいのでしょうか? >ポイントの残高をユーザーに指し示すだけの目的でつかうのであれば >入ポイント、出ポイントのテーブルをView化して >残ポイント込のテーブルを参照するようなアプリケーション設計に、私ならします。 ブラウザ上で表示したい内容は 入ポイント | 出ポイント | 残高ポイント 5000   |      |  5000       | 500   | 4500 1000   |       | 5500 のようになります。 いわゆるwhileで limit 0,50のように数を制限しながら出力しようかと思います。 会員一人あたりのレコードが数千とか膨大になったときに最初のレコードから数千行目のレコードを ひとつひとつ計算しないと残高の表示はできないのでは? わかりにくい説明かもしれません・・・

関連するQ&A

  • perlからmysqlに接続できない

    #! c:/perl/bin/perl  use DBI; $user = 'root'; $passwd = 'パスワード'; $db = DBI->connect('DBI:mysql:db1:localhost', $user, $passwd); $sth = $db->prepare("INSERT INTO bunrui VALUES (1,'1st','memo')"); $sth->execute; $sth->finish; $db->disconnect; perlからmysql二接続するためDBIをインストールして、上のようなサンプルコードを実行してみたのですが Internal Server Error になってしまいます。どこかコードが違っているのでしょうか?

    • ベストアンサー
    • Perl
  • エクセルで出納帖を作成

    エクセルを利用して出納帖を作成したいのです。項目は日付、摘要、入金、出金、残高です。残高欄に計算式を入れたいのです。前残高に入金額をプラス、出金額をマイナスして残高が自動的に計算できるようにしたいのです。仮に、繰越残高があると、先のほうまで残高の数字が表示されますね。入金があった時点、出金があった時点で始めて残高が出るようにしたい。IF関数を使うそうですが、具体的に関数を教えてください。

  • PHP/mySQLでインサートができません。

    PHPとmySQLを勉強中の初心者ですが、よろしくお願いします。 PHPで簡単なインサート文を作ってそれをmySQLに保存しようとしているのですが、以下のエラーが出てしまいます。 Warning: mysql_query(): supplied argument is not a valid MySQL-Link resource プログラムは以下の通りです。HOSTNAME,USERNAME,DBPWDは別のところで定義していますが、mysql_connect, mysql_select_dbではエラーにならないので、データベースの選択まではうまく行っていると思うのですが。 $conn = mysql_connect(HOSTNAME, USERNAME, DBPWD); if(!$conn){ die("Logon Failure to mysql Server."); } $db = mysql_select_db(DBNAME, $conn); if(!$db){ die("Cannot access to the DB"); } foreach($csv_ary as $a => $b) { $query = "INSERT INTO TEST field_a VALUES $a"; if (!mysql_query($query, $db)){ echo "更新失敗: SQL=$query<br>"; } } mysql_close($conn); field_aはvarchar(10)でPrimary_key, NOT NULLの設定です。 Foreachで展開した配列の値はちゃんと長さ10の文字列が入っています。 PHP 4.3.11は mySQL 4.0.27です。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • MySQLに格納できない

    INSERT INTOの構文が間違っていると、エラーが出ます。 DB接続はできています。 テーブル名:db_touroku フィールド: id mailaddress created(登録日) としています。 ユーザーにはテキストのフォームにメールアドレスのみを入力してもらい、「submit」でtouroku.phpのページへ移動。 idにはDBでauto_increment をつけています。 //touroku.php $sql = sprintf('INSERT INTO db_touroku VALUE("%d" ,"%s" ,"%s"', 0,mysql_real_escape_string($_SESSION['join']['mailaddress']),date('Y-m-d H:i:s')); mysql_query($sql,$link) or die(mysql_error()); 構文が間違っているでしょうか? どなたかご教授お願いします。

    • ベストアンサー
    • PHP
  • MySQL 文字化けについて(PHP)

    いつもお世話になっております。 PHPを使用してMySQLからデータを出し入れする際に文字化けが発生し原因がわからず、大変困っております。 MySQL 4.1.18(クライアント 4.1.21) MySQL文字セット UTF-8 Unicode (utf8) 様々なHPを検索して、下記のような一文を入れれば大丈夫と思ったのですが、それでも文字化けは改善されませんでした。 mysql_query("SET NAMES ujis"); 上記文はmysql_connectの直後に記述しております。 INSERT文、SELECT文どちらに不備があるのかわかりません。 ご教授お願い致します。 記述プログラム:(INSERT文) /********************************* * MySQL接続 ********************************/ // DB Connect $db = db_connect(); // DB Select select_db($db); // Set Names mysql_query("SET NAMES ujis"); /********************************* * INSERT文 ********************************/ $sql = "insert into T_YOYAKU values ('1','A','1','あいうえお')"; mysql_query($sql) 省略・・・ 記述プログラム:(SELECT文) /********************************* * MySQL接続 ********************************/ // DB Connect $db = db_connect(); // DB Select select_db($db); // Set Names mysql_query("SET NAMES ujis"); /********************************* * INSERT文 ********************************/ $sql = "select * from T_YOYAKU"; if ( $rs = mysql_query($sql) ) {

    • ベストアンサー
    • MySQL
  • PHPとMySQLを使ったフォームを作っていますが、うまくできないこと

    PHPとMySQLを使ったフォームを作っていますが、うまくできないことがあり書き込みさせていただきます。 わかる方、ご助力願えれば幸いです。 フォームから、送信されたデータを受け取って、MySQLに登録する際に、フォーム内に空欄があると、うまくMySQLのデータベースに追加ができなかったり、変更ができなかったりします。 コードを簡単に書くと… <?php //フォームからデータを取得 $name = $_POST['name']; $address = $_POST['address']; $age = $_POST['age']; //データベース接続処理 $db = mysql_connect("localhost","user","password"); mysql_select_db("db_name",$db); $rs = mysql_query("select * from tablename order by my_id desc",$db); //データベースへの登録 $rs = mysql_query("INSERT INTO tablename(name,address,age)VALUES('$name','$address','$age')",$db); ?> このような感じになります。 フォームには、名前、住所、年齢を入力しているわけですが、年齢が必須でないため、空欄として送られてくることもあります。 年齢に数値が入っている場合は、うまく登録されますが、空欄であった場合、特にエラーが出るわけでもなく、単に「登録されない」という状況がおきます。 データベースのテーブルのフィールドでは、ageは int(11)でNULLはYes、defaultはNULLになっております。 自分なりに調べてみたつもりですが、知りたい情報に出合うことができませんでした。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • MYSQLのINSERT記述をもっと分かりやすくしたい

    MYSQLで、DB更新の時の記述の基本はこんな感じですよね。         UPDATE             テーブル名         SET             `フィールド名`  =   "データ名",             `フィールド名`  =   "データ名",             `フィールド名`  =   "データ名",             `フィールド名`  =   "データ名" 「フィールド」と、「値」が横に並んでて実に見やすい、分かりやすい。 ところが新規挿入の時は         INSERT         INTO             テーブル名         (             `フィールド名`,             `フィールド名`,             `フィールド名`         ) values (             `データ`,             `データ`,             `データ`         ) と、「フィールド」と「値」が縦にならんでて、 どれがどれに対応しているのか実に分かりにくい。 フィールドが20個も30個もなると だんだん分けがわからなくなってくる。 そこで、みなさんは、インサートする時の記述はどのように工夫して 分かりやすくしているでしょうか。 今まで、行番号の下一桁を揃えたり、/*10行目*/ /*20行目*/ 等のコメント文を入れたりしていましたが、 根本的解決にならず分かりにくいままでした。

    • ベストアンサー
    • MySQL
  • 取り出した日付の表示

    phpにてDBに格納されている日付データを取り出した際にデフォルトで "2007-06-04"のように表示されてしまいますが、これを "07/06/04"や"07.06.04"のように表示するにはどうすればよいのでしょうか? MySQLのフィールドタイプはdateに設定しています。 print date(Y/m/d,"$row["日付フィールド"]");とやるとなぜか、 "1970/01/01"と表示されてしまいます。 普通に、print $row["日付フィールド"]");とやると 2007-06-04と出てしまいます。 どうぞ宜しくお願いします。

    • ベストアンサー
    • PHP
  • MySQLのtimestamp型について

    MySQLのtimestamp型で質問があるのですが、not nullの指定はできるのでしょうか? また、代入方法はPerlの場合、現在の日時をYYYYMMDDHHMMSS形式の文字列を簡単に作成したいのですが、どのような方法があるのでしょうか? あと、私は日付の場合はint(11)として、日付のシリアル値(1970年からの経過秒)をよく利用していました。理由は、後で足し引きなど計算しやすい為です。それで、日付型というものは使ったことがありません。 みなさんは、この日付関数利用する目的や必要性などありましたら、教えてください。

    • ベストアンサー
    • MySQL
  • MySQLで日記を作成

    MySQLのDBに簡単な日記を保存したいのですが、 データのレコード方法のアドバイスをお願いします。 記録する項目は、日付、題名、本文としたときを想定します。 DBに既に8/1の日記、8/3の日記、という順にデータがレコードされているとします。 今、8/2の日記をレコードしようとします。 このときの考えられる記録の処理で、 1.DBの末尾に8/2のデータを記録する。  出力の際に、日付でソートする。 2.DBに既に登録してあるデータを日付でソートし、8/1、8/2、8/3の順で記録する。  出力はデータの順番通り。 どっちの方がスマートでしょうか。 アドバイス、お願いします。

    • ベストアンサー
    • MySQL