(Отвечая на ваш вопрос, но также отвечая на некоторые вопросы, поднятые в ответе Паксдиабло.)
Это не имеет ничего общего с бухгалтером, который заглядывает в вашу базу данных. С двойной записью ошибки легко отследить; это требование IRS для учета и , поэтому на самом деле у вас нет выбора, вам нужна двойная запись для любой системы, которая работает с государственными средствами.
(Пожалуйста, не пытайтесь сказать мне, что такое "двойная запись"; я написал системы двойной записи для банков, для требований аудита.) Двойная запись - это метод учета, основанный на наборе счетов. Каждая финансовая операция - это запись в журнале; если бы все транзакции были повторно применены с самого начала, все счета находились бы на том же балансе, что и сегодня.
Двойной ввод означает, что каждая транзакция имеет счет «Кому» и «От»; деньги никогда не покидают систему и не входят в систему. К каждому кредиту прикреплен дебет.
Поэтому (1) не является версией (2) «двойной записи», их нельзя легко сравнить. Версия транзакции Джона с двойной записью - (одна финансовая транзакция) в логических терминах учета:
От: JohnAccount
До: SystemAccount
Сумма: 10.00
(доллары)
Это могут быть две строки таблицы, одна кредитная, а другая дебетовая, две вставки, заключенные в транзакцию SQL.
То есть для системы учета, которая является внутренней и имеет дело с деньгами. Мы сделали.
Но вы дополнительно объединяете систему учета с системой покупки / продажи (без явного объявления). Конечно, за десять баксов, которые вы взяли у Джона, вы должны дать ему все, что он купил для него, и записать это. Джон купил игровые кредиты на десять баксов, если вы отслеживаете это, тогда да, вам также нужно:
- От:
SystemGamingAccount
До: JohnGamingAccount
Сумма: 100
(кредиты)
или, в долларах:
От: SystemGamingAccount
До: JohnGamingAccount
Сумма: 10.00
(долларов)
Это тоже вполне может быть две строки в таблице, одна кредитная, а другая дебетовая, четыре вставки, заключенные в транзакцию SQL.
Для ясности, если бы вы продавали виджеты вместо игровых кредитов, вторая транзакция (отслеживание виджетов) была бы:
От: Warehouse
До: PublicSale
Сумма: 1
(виджеты)
и так как вы отслеживаете единицы на складе, но не сколько виджетов у Джона Q Public в кармане, то есть две вставки плюс одно обновление (UPDATE Part SET QtInStock = QtyInStock - 1 WHERE PartCode = "Widget"
), все они заключены в транзакцию SQL.
И для каждого пользователя ЕСТЬ Учетная запись, верно. Виртуальный, эзотерический или физический, это юридическое лицо, с которым совершаются сделки. Так что давайте не будем притворяться, что он не существует, потому что он виртуален. Для игр один долларовый счет плюс один игровой (кредитный) счет.
Кредитные / дебетовые
Я бы поставил CR / DB обратно; не CHAR (2), но логическое. Это поможет вам позже, когда стол большой,
WHERE IsCredit = 1
намного быстрее, чем
WHERE Amount >= 0.
Обратите внимание, что с "> =" вы должны гарантировать, что каждый сегмент кода кодируется одинаково, а не ">" иногда. Boolean или char не имеют этой проблемы.