Разработка базы данных приложений для личных финансов - PullRequest
13 голосов
/ 24 февраля 2011

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

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

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

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

Спасибо

РЕДАКТИРОВАТЬ: Извините, возможно, я не был ясен, я понимаю, как реализовать любой из методов создания баланса счета. Я больше интересовался преимуществами / недостатками любого из этих методов, а также тем, что было бы «лучшей практикой». Большое спасибо за ответы!

Ответы [ 5 ]

19 голосов
/ 24 февраля 2011

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

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 может быть балансом счета в начале (или конце) дня, а идентификатор 0001 и выше - другие транзакции.

В столбце trans_type будут храниться коды транзакций, такие как "DEB" (дебет), "CRE" (кредит), "TRA" (перевод) и "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

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

2 голосов
/ 09 октября 2011

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

1 голос
/ 24 февраля 2011

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

1 голос
/ 24 февраля 2011

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

TABLE account
    id
    account_name
    current_balance

TABLE transaction
    id
    account_id
    payee
    date
    amount
    category

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

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

0 голосов
/ 21 февраля 2016

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

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