2011-02-24 3 views
13

После поиска минималистичного приложения для отслеживания денег/бюджетирования я решил построить его для личного использования.Дизайн базы данных приложений для личных финансов

Однако я не уверен в части дизайна базы данных. В основном на данный момент у меня есть таблица записей, в которой, очевидно, хранятся данные о каждой транзакции, будь то кредит или задолженность и т. Д.

Дилемма, которая у меня есть, я не знаю, следует ли мне создать другую таблицу для хранения текущий баланс каждой учетной записи или если я буду динамически заполнять ее, вычитая дебетовые ссуды.

Часть меня говорит, что по мере того, как таблица записей возрастает, способность генерировать баланс для каждой учетной записи будет медленнее (да, преждевременная оптимизация - это зло), но также нет необходимости добавлять другую таблицу, когда я могу вычислить данные из существующих таблиц.

Благодаря

EDIT: Жаль, что я, возможно, не было ясно, насколько я понимаю, как реализовать любой метод создания баланса счета. Я больше рассматривал преимущества/недостатки любого метода, а также то, что было бы «лучшей практикой». Большое спасибо за ответы!

+0

Если вы живете в США или Канаде, есть Mint.com ... –

+0

Нет, я не хочу, кроме того, я сказал, что хочу что-то минималистичное и легкое – Stoosh

+0

Если вы на маке, вы можете попробовать Белку. Мой опыт был в том, что он был быстрым и легким. (http://www.squirrelapp.com/) – KyleWpppd

ответ

16

Если бы я был разработать минималистичный приложение учета, я бы, вероятно, сделать что-то вроде

ledger 
------------- 
    key   INT(12) PRIMARY KEY 
    account_id INT(10) 
    category_id INT(10) 
    trans_type CHAR(3) 
    amount  NUMERIC(10,2) 

account 
------------ 
    account_id INT(10) PRIMARY KEY 
    created  DATETIME 
    name   VARCHAR(32) 
    ... 

category 
------------ 
    category_id INT(10) 
    name   VARCHAR(32) 
    ... 

Колонна key будет состоять из даты и нулями в числовом (т.е. 201102230000), где последние 4 цифры будут ежедневным идентификатором транзакции. Это было бы полезно для отслеживания транзакций и возврата диапазона и т. Д. Ежедневным идентификатором транзакции 0000 может быть остаток на счете в начале (или конце) дня, а id 0001 и другие - другие транзакции.

В столбце trans_type будет проводить коды транзакций, такие как "DEB" (дебетовая), "КРР" (кредит), "ТР" (передача) и "BAL" (баланс) и т.д.

с таким образом вы можете выполнить любой запрос, от получения всех «кредитных» транзакций между какой-либо датой до только остатка на счете в любую заданную дату или диапазон дат.

Пример: получать все кредитные и дебетовые операции между 2011-01-01 и 2011-02-23

SELECT ledger.*, account.name, category.name 
    FROM ledger 
    JOIN account 
    ON ledger.account_id = account.account_id 
    JOIN category 
    ON ledger.category_id = category.category_id 
WHERE (ledger.trans_type = "CRE" 
    OR ledger.trans_type = "DEB") 
    AND ledger.key BETWEEN 201101010000 AND 201102239999 
ORDER BY ledger.key ASC 

Пример: получать все операции (кроме остатков) между 2011-01-01 и 2011-02-23 за счет # 1 (например: ипотека)

SELECT ledger.*, account.name, category.name 
    FROM ledger 
    JOIN account 
    ON ledger.account_id = account.account_id 
    JOIN category 
    ON ledger.category_id = category.category_id 
WHERE ledger.trans_type <> "BAL" 
    AND ledger.key BETWEEN 201101010000 AND 201102239999 
    AND account.id = 1 
ORDER BY ledger.key ASC 

Итак, вы идете, гибкость и расширяемость.

+1

Любая причина, по которой у вас не было бы лишнего «созданного» поля в таблице? – Stoosh

+0

@Stoosh, я просто показываю базовый дизайн базы данных. У вас может быть любое поле, которое вы хотите, я просто сосредоточусь на проблеме вашего вопроса здесь. –

+0

там, я добавил колонку 'created' :) –

1

Я на самом деле работает только на этот сайт идею прямо сейчас, и как я установки моя база данных:

TABLE account 
    id 
    account_name 
    current_balance 

TABLE transaction 
    id 
    account_id 
    payee 
    date 
    amount 
    category 

И всякий раз, когда добавляется новая транзакция обновляю текущий баланс аккаунта.

FYI, я надеюсь завести свой сайт в течение месяца, и если вы заинтересованы в использовании сайта человека, просто просмотрите мой профиль.

1

Я бы подумал, что один прочитанный стол будет лучше и позволит более гибко в будущем. В конечном итоге вы можете отслеживать средние значения для баланса, кредитов и дебетов.

2

Для Персональные Финансовые базы данных Сегодняшние системы реляционных баз данных достаточно быстры, чтобы рассчитать баланс нескольких учетных записей динамически. Для хранения текущего баланса вам не нужен столбец. Даже Microsoft Access достаточно быстр. Я знаю это, потому что я создал и использовал личную финансовую базу данных в Access. Возможно, это даже то, из чего вы первоначально искали. Вы можете прочитать об этом и загрузить его по адресу http://maiaco.com/software/ledger/index.php

0

Не храните рассчитанные значения в таблицах, если это не требуется по соображениям производительности. Я бы использовал View, чтобы выставлять рассчитанные значения.

Смежные вопросы