Дизайн базы данных приложений для личных финансов

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

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

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

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

Спасибо

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

Ответы

Ответ 1

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

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" (дебет), "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

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

Ответ 3

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

TABLE account
    id
    account_name
    current_balance

TABLE transaction
    id
    account_id
    payee
    date
    amount
    category

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

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

Ответ 4

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

Ответ 5

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