0

私は(楽しみのために)個人の財務トラッカーを開発しており、カテゴリのテーブルがあります。各カテゴリはテーブルのエントリであり、月末にすべて複製され、関連する残高が新しい月の月初にリセットされます。

特に、これらのカテゴリは「貯蓄」のタイプであり、現在の合計があります。カテゴリを取得または更新したい場合は、category_id フィールドを使用しました。これは現在の稼働月では問題なく機能しますが、月をリンクすると頭が痛くなります。貯蓄カテゴリについては、running_total が過去 6 か月間でどのように増加したかを示したいのですが、現在の DB 設計では、カテゴリは毎月の初めに新しく作成されるため、前の月について「認識」していません。

過去 6 か月の節約 running_total を現在取得できる唯一の方法は、カテゴリ名で検索することですが、これは信頼できない可能性があります。

カテゴリをリンクする方法として機能する「previous_month_category_id」であるテーブルにフィールドを追加することを検討しましたが、結果から「previous_month_category_id」を取得するたびに6つのMSQL操作が必要になるため、実装に費用がかかります。クエリを再実行します。

MYSQL が何らかの再帰を実行できる場合、これでうまくいくかもしれませんが、もっと明白な答えが目の前にあるように感じます。

私は Codeigniter と MYSQL を使用していますが、必要に応じてバニラ PHP を恐れていません。

これを行う方法についてのヘルプは素晴らしいでしょう。

更新 1:

以下は、貯蓄カテゴリが他のカテゴリと混在しているように見えるサンプルです。各月の終わりに、エントリは同じ category_name、type、buget、year、および users_id で複製されますが、category_id は自動的にインクリメントされ、月は新しい月番号に更新され、現在の合計は前の running_total + 予算になります。category_name を使用せずにこれらを取得するには、1 つのデータベース クエリをどのように実行すればよいでしょうか? これは変更される可能性があるため、ユーザーは 7 月末に「Bigger TV」と呼ぶことにしました。

+-------------+--------------+------+--------+---------------+------+-------+----------+
| category_id |category_name | type | budget | running_total | year | month | users_id |
+-------------+--------------+------+--------+---------------+------+-------+----------+
|      44     | Big TV       | sav  |   20   |      240      | 2012 |   8   |   77     |

+-------------+--------------+------+--------+---------------+------+-------+----------+
|      32     | Big TV       | sav  |   20   |      220      | 2012 |   7   |   77     |

+-------------+--------------+------+--------+---------------+------+-------+----------+
|      24     | Big TV       | sav  |   20   |      200      | 2012 |   6   |   77     |

更新 2:

私は自分自身をうまく説明できているかどうか確信が持てないので、アプリがどのように機能するかについてもう少し詳しく説明し、それが役立つかどうかを確認します.

「カテゴリ」、「トランザクション」、「ユーザー」というテーブルがあります。カテゴリは、1: 現金、2: 通常の支払い、3: 貯蓄の 3 つのタイプのいずれかになります。現金と通常の支払いタイプをバケツと考えてください。毎月の初めに各バケツがいっぱいになり、その目的はそこからお金を引き出し、月末にまだ少し残っていることを確認することです(または少なくともない)ネガティブ)。

これは月ごとに問題なく、非常にうまく機能します (私にとっては、このシステムを 2 年間使用していると思います)。旅行には貯蓄が伴います。貯蓄は月ごとにリンクされており、毎月追加される大きなバケツのようなものです (予算と呼ばれる設定された増分を使用)。または、あちらこちらから少し借りて、目的は緊急資金を構築することです (「私の車が故障したとき」タイプのものなど)。

関連情報が各カテゴリに表示される場合、現在の月のみが重要であるため、現金と通常の月のみが表示されますが、貯蓄については現在の金額も表示されますが、どのように経過したかを示す小さな履歴グラフを表示すると便利です。時間の経過とともに蓄積(または枯渇)していました。これを行うには、グラフをプロットできるように、これらのカテゴリの前の月末の状態を検索する方法が必要ですが、現在、category_name 以外ですべてをリンクする方法がわかりません。

私はDBの正規化を少し実装しようとしましたが、これは正規化について知って実装した最初のスキーマであるため、おそらくそのいくつかの側面を見逃しており、正常に感じられない過度の正規化を回避した可能性があります.

以下は私のテーブルです:

カテゴリー

 +-------------+--------------+------+--------+---------------+------+-------+----------+
 | category_id |category_name | type | budget | running_total | year | month | users_id |
 +-------------+--------------+------+--------+---------------+------+-------+----------+

取引

+----------------+--------------+--------+------+----------+------------------------+
| transaction_id |  description | amount | date | users_id | categories_category_id |
+----------------+--------------+--------+------+----------+------+-------+---------+

それらは、外部キーであるcategory_idで結合されます

私は常に、各カテゴリには毎月新しいエントリが必要であるという前提で作業してきましたが、以下のコメントと回答から、月に関係なくカテゴリエントリを1つだけにして、その場ですべてを計算する方がよいと思われますか?

ただし、予算はユーザーが変更できるため、記録を維持するために、これが機能するかどうかはわかりませんが、「預金」が実際に発生することはありません。月末にカテゴリが複製されるだけなので、そうなると思います対処する必要があります.....

このアプリの目的は常に、銀行口座で発生する物理的な取引から財務追跡を分離し、誰かの財務にレイヤーを提供することでした。これにより、ユーザーは説明が難しい取引などを回避し、すべての現金ポジションに集中することができます。このシステムや銀行口座には「収入」という概念はありません。

4

1 に答える 1

2

あなたのデータベース設計には多少の手間がかかるように思えます。あなたが実際に何をしようとしているのか、私はまだ完全には理解していませんが、私の最初の考えは、各トランザクションをテーブルの単一の行として保存し、そのテーブルをさまざまな方法でクエリして、さまざまな種類のレポートを生成することです。それ。このようなもの:

transactions:
+----+---------+--------+---------------+-----------+-------------+
| id | user_id | amount | running_total | datestamp | category_id |
+----+---------+--------+---------------+-----------+-------------+

categories:
+----+------+------+
| id | name | type |
+----+------+------+



時間に基づいてカテゴリをインクリメントしないでください。実際に新しいカテゴリがある場合は、カテゴリ テーブルにエントリを追加します。トランザクションが複数のカテゴリに属する​​可能性がある場合は、トランザクション (トランザクション ID に基づく) をカテゴリ (カテゴリ ID に基づく) に関連付ける 3 番目の (リレーショナル) テーブルを使用します。

入金の場合はamountフィールドがプラスになり、出金の場合はマイナスになります。次のようなことを行うことで、現在の実行中の合計を取得できます。

SELECT running_total FROM transactions
WHERE id = (SELECT MAX(id) FROM transactions WHERE user_id = '$userID');

これを行うことで、特定の月の合計差額を見つけることができます。

SELECT SUM(amount) FROM transactions WHERE DATE('%c', datestamp) = '$monthNumber';

これを行うと、特定のカテゴリの合計支出を見つけることができます。

SELECT SUM(t.amount) FROM transactions t
INNER JOIN categories c ON t.category_id = c.id WHERE c.name = 'Big TV';

他にも多くの可能性がありますが、ここでの目的は、データを保存するより良い方法を示すことです。

于 2012-08-28T17:47:59.103 に答える