Дизайн базы данных приложений для личных финансов
После поиска минималистичного приложения для отслеживания денег/бюджетирования я решил построить его для личного использования.
Однако я не уверен в части дизайна базы данных. В основном на данный момент у меня есть таблица записей, в которой, очевидно, хранятся данные о каждой транзакции, будь то кредит или долг и т.д.
Дилемма, которая у меня есть, я не знаю, следует ли мне создать другую таблицу для хранения текущего баланса каждой учетной записи или если я буду динамически ее заполнять, вычитая дебеты из кредитов.
Часть меня говорит, что по мере роста таблицы записей способность генерировать баланс для каждой учетной записи будет медленнее (да, преждевременная оптимизация, предположительно, зла), но также представляется излишним добавить другую таблицу, когда я могу вычислить данные из существующих таблиц.
Спасибо
РЕДАКТИРОВАТЬ: Извините, я, возможно, не был ясен, я понимаю, как реализовать любой способ создания баланса аккаунта. Я больше рассматривал преимущества/недостатки любого метода, а также то, что было бы "лучшей практикой". Большое спасибо за ответы!
Ответы
Ответ 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
Не сохраняйте вычисленные значения в таблицах, если вам не нужны по соображениям производительности.
Я бы использовал представление, чтобы выставлять вычисленные значения.