Бухгалтерская база данных - хранение транзакции - PullRequest
7 голосов
/ 02 ноября 2010

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

1

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

TRANSACTION
PK_ID1 Cash      - $10 (System)
PK_ID2 Deposit        $10 (System)

TRANSACTION
PK_ID3 Bank Account      - $10 (John)
PK_ID4 Deposit        $10 (John)

2

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

TRANSACTION
PK_ID1 Cash      - $10 (system)
PK_ID2 Deposit        $10 (John)

Есть ли реальное преимущество варианта № 1 перед вариантом № 2 и визой?

РЕДАКТИРОВАТЬ: модифицированный вопрос, удалены CR, DR и заменены знаком.

Ответы [ 2 ]

11 голосов
/ 03 ноября 2010

(Отвечая на ваш вопрос, но также отвечая на некоторые вопросы, поднятые в ответе Паксдиабло.)

Это не имеет ничего общего с бухгалтером, который заглядывает в вашу базу данных. С двойной записью ошибки легко отследить; это требование 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 не имеют этой проблемы.

2 голосов
/ 02 ноября 2010

С точки зрения данных (что вы и просите), нет. Вы должны хранить его как подписанное значение. Двойная бухгалтерия - это не то, что делает моб, поэтому она может скрыть реальную прибыль от IRS: -)

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

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

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

См. Также здесь .

...