2012-08-28 5 views
0

개인 금융 추적 프로그램을 개발 중입니다 (재미 있습니다!) 나는 카테고리 테이블을 가지고 있습니다. 각 카테고리는 테이블의 항목이며 월말에 모든 관련 카테고리가 복제되어 새 달에 대한 월간 독서의 시작으로 재설정됩니다.여러 달의 여러 데이터베이스 테이블 항목 연결하기

이 범주는 '저축'유형 일 수 있으므로 누적 합계가 있습니다. 카테고리를 검색하거나 업데이트하려면 category_id 필드를 사용하고 현재 작업중인 달에는 제대로 작동하지만 월을 함께 연결하면 내 뇌가 손상됩니다. 저축 카테고리의 경우 지난 6 개월 동안 running_total이 어떻게 증가했는지 보여주고 싶지만 현재의 DB 디자인에서는 카테고리가 매월 초에 새로운 카테고리로 생성되므로 이전 카테고리에 대해 "알지 못합니다."

나는 현재 running_total의 저축의 마지막 6 개월을 검색 할 수있는 유일한 방법은 카테고리 이름으로 검색하는 것이지만, 이것은 잠재적으로 신뢰할 만하지 않습니다.

"previous_month_category_id"인 필드를 추가하는 것을 고려해 보았습니다.이 필드는 카테고리를 연결하는 방법으로 작동하지만 구현할 때마다 "previous_month_category_id"를 가져올 때마다 6 회의 MSQL 작업이 필요합니다. 결과를 확인한 다음 쿼리를 다시 실행하십시오.

MYSQL이 일종의 재귀를 수행 할 수 있다면 어쩌면 작동 할 수도 있지만 얼굴을 응시하는 좀 더 분명한 대답이있는 것처럼 느껴집니다.

Codeigniter와 MYSQL을 사용하고 있지만 필요하면 바닐라 PHP를 두려워하지 않습니다.

이 작업을 수행하는 방법에 대한 도움말은 유용 할 것입니다.

UPDATE 1 : 아래

다른 범주 사이의 혼합처럼 저축 범주가 어떻게 보일지에서 샘플입니다. 매월 말에 항목은 동일한 category_name, type, buget, year 및 users_id로 중복되지만 category_id는 자동으로 증가하고 월은 새 달 번호로 업데이트되며 누적 합계는 이전 running_total + 예산입니다. category_name을 사용하지 않고 이들을 검색하려면 어떻게 하나의 데이터베이스 쿼리를 수행합니까? 잘 나는거야 그래서

나는 나 자신을 설명하고있어 확실하지 않다 : 변경 될 수이이기 때문에 사용자 년 7 월

의 끝
+-------------+--------------+------+--------+---------------+------+-------+----------+ 
| 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에서 "더 큰 TV를"을 발신자로 결정 앱이 작동하는 방식에 대해 더 자세히 설명하고 도움이되는지 확인하십시오.

"categories", "transactions"및 "users"라는 테이블이 있습니다. 카테고리는 1 : 현금, 2 : 정기 지불, 3 : 저축의 세 가지 유형 중 하나 일 수 있습니다. 현금 및 일반 지불 유형을 버킷으로 생각해보십시오. 매월 초마다 각 버킷이 가득차 있으며 목표는 돈을 버려서 월말에 조금 남았는지 확인하는 것입니다. 부정).

이것은 한 달 단위로 잘 작동하며 잘 작동합니다 (저에게는이 시스템을 2 년 동안 사용했습니다). 여행은 월별로 연결되어있어 저축과 함께 제공되며 과도한 가격에 도달 할 때까지 (예산 증액과 함께) 매월 추가되는 큰 양동이와 비슷합니다 (큰 TV가 구매할 때와 같이). 그것), 또는 여기 저기 조금에서 가져온 목표는 비상 자금을 구축하는 것입니다 ("내 차가 부서지는 때"와 같이).

각 카테고리에 대한 관련 정보가 표시 될 때 현재 달만 현금으로 표시되고 모든 것이 중요하므로 저축에는 현재 금액도 표시되지만 작은 금액을 표시하는 것이 좋습니다 시간이 지남에 따라 축적 된 (또는 고갈 된) 역사 그래프. 이렇게하려면 그래프를 플로팅 할 수 있도록 카테고리의 월말 이전 상태를 검색하는 방법이 필요하지만 현재는 category_name 이외의 다른 방법으로 모두 링크하는 방법을 찾을 수 없습니다.

나는 약간의 DB 정규화를 구현하려고 시도했지만 이것이 정규화에 대해 알려진 것을 구현 한 첫 번째 스키마이므로 아마도 일부 측면을 놓친 것일 수도 있고 그렇지 않을 수도있는 정상화를 피할 수도 있습니다. 권리. 그들은 categories_category_id에 연결된다

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

거래

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

외래 키

난 항상 떨어져 일한

전제 인

카테고리 : 아래

내 테이블입니다 각 카테고리는 매달 새로운 항목이 필요하지만 T는 코멘트와 답변 아래에서 나는 달에 상관없이 단 하나의 카테고리 항목을 가지고있는 것이 좋을 것입니다.

비록 사용자가 예산을 변경할 수 있으므로 기록 보관을 위해이 항목이 실제로 작동하는지 여부는 확실하지 않습니다. "예금"이 실제로 발생하지는 않습니다. 월말에 카테고리가 복제됩니다. 나는 그것을 처리해야 할 것 같아 .....

이 응용 프로그램의 목적은 항상 은행 계좌에서 발생하는 물리적 거래에서 재무 추적을 분리하고 someones 재정 이상의 계층을 제공하여 사용자 거래 등을 설명하기가 어려우며 모든 현금 포지션에 집중하십시오. 이 시스템이나 은행 계좌에는 "소득"에 대한 개념이 없습니다.

+0

몇 가지 샘플 (코드, 테이블 레이아웃 등)을 게시 할 수 있다면 도움이 될 것입니다. 당신이 여기서하려고하는 것을 묘사하기에는 어려움이 있습니다. – Travesty3

+0

db 예제가 추가되었습니다. – SimonBarker

+0

순수하게 모범 사례 : "category_name"열을 만들지 않고 제거하고이를 통해 테이블과 외부 키를 만듭니다. table1, table2 table1_table2와 연결된 세 번째 테이블을 만들고이 테이블에서 id, table1_id, table2_id를 만듭니다. 추가 테이블에 링크하는 외부 키를 2 개 설정하십시오. – wesside

답변

2

데이터베이스 디자인이 어떤 작업을 할 수있는 것처럼 보입니다. 나는 아직도 당신이하고 싶은 일에 완전히 익숙하지 않지만 초기 생각은 각 트랜잭션을 테이블에 하나의 행으로 저장 한 다음 그 테이블을 다양한 방식으로 쿼리하여 다양한 유형의 보고서를 생성하는 것입니다. 그것. 이런 식으로 뭔가가 :

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

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



시간을 기준으로 범주를 증가시키지 마십시오. 실제로 새 카테고리가있을 때 항목 테이블에 항목을 추가하십시오. 트랜잭션이 여러 범주에 속할 수있는 경우 트랜잭션 (트랜잭션 ID 기반)과 범주 (범주 ID 기반)를 관련시키는 세 번째 (관계형) 테이블을 사용하십시오.

예금 인 경우 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'; 

다른 가능성이 많이 있지만 여기에있는 목적은 데이터를 저장할 수있는 더 좋은 방법을 보여주기위한 것입니다.

+0

와우, 좋아. 그런 일종의 내 머리를 날려 버리지 만, 나는 현재 데이터베이스를 사용하여 당신이 어디에서 왔는지를 알게된다. 나는 현재 가지고있는 구조 중 일부를 대체하기 위해서 .... 나는 내 기본 논리 중 일부를 다시 생각할 필요가있다. 현재 인출 거래 및 예금 만 있습니다. 자세한 내용은 위의 업데이트 2를 참조하십시오. – SimonBarker

관련 문제