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