2010-12-11 4 views
15

Сохранение записи транзакции в базе данных учета двойных записей.Дизайн базы данных: таблица бухгалтерских операций

Я пришел с двумя вариантами решения 1 и вариантом 2, мне сказали, что большинство банковских пакетов выбирает вариант 2 для своего дизайна базы данных. Однако я предпочитаю вариант 1 над вариантом 2, потому что он просто имеет смысл, и он более эффективен!

I.e Для 2-х перемещений средств вариант 1 требует 2 записи по сравнению с вариантом 2, требуется 4 записи.

Хотелось бы знать, почему банк выбрал вариант 2 над вариантом 1? Что является причиной этого?

Option 1) 
TRANSACTION 
Credit_AccountId 
Debit_AccountId 
Amount 
... 

Option 2) 
TRANSACTION 
AccountId 
Amount 
... 

ответ

17

Вариант 1 потенциально может быть более эффективным с точки зрения вставки. Но поскольку многие учетные транзакции будут влиять на более чем два счета, это преимущество, вероятно, будет значительно меньше 2: 1.

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

  • Дебет A $ 100
  • Кредит B $ 60
  • Кредит C $ 40

более ясно, чем два ряда

  • дебит $ 60 Кредит B $ 60
  • Дебет A $ 40 Кредит C $ 40

Если у вас несколько учетных записей с обеих сторон, было бы также неясно, как сопоставить дебет и кредиты с одной учетной записью. То есть,

  • дебит $ 100
  • дебет B $ 30
  • Кредит C $ 60
  • Кредит D $ 70

может быть представлена ​​в виде

  • дебит $ 60 Кредит C $ 60
  • Дебет A $ 40 Кредит D $ 40
  • дебетовых B $ 30 Кредиты D $ 30

, но есть и другие возможные способы построения данных для модели данных 2.

Кроме того, вариант 2 будет более эффективным, если вы пытаетесь определить текущий баланс определенной учетной записи путем агрегирования транзакций.

+0

спасибо, я вижу вашу точку там о сложных транзакциях. – 001

+0

Спасибо за ваш ответ @ Justin Cave, не могли бы вы помочь мне в текущем поле баланса ответа, мы использовали модель 2 для транзакций, а также имели таблицу счетов с полем баланса. поле баланса обновляется после каждой транзакции, для проблем параллелизма мы использовали блокировку уровня строки в таблице учетных записей. все было хорошо, пока нам не понадобилось использовать двухфазную фиксацию из-за многоплатформенной java и .Net и ... Мы столкнулись со многими заблокированными блокировками по таблице Account. Специально «Транзакция, ожидающая блокировки». DBA убивает сеанс вручную и удаляет блокировки. Неверный дизайн? –

+0

@ M.Heydari - похоже, это лучше подходит для нового вопроса - комментарии не являются подходящим местом для расширенных обсуждений. Я не буду поддерживать общую стоимость транзакционной системы. Если вы действительно обнаружите, что совокупность абсолютно необходима, используйте материализованное представление. –

5

В общем дизайне базы данных бухгалтерского учета логично и эффективно хранить ваши списания и кредиты в одном поле (например, вариант 2), поскольку это упростило бы агрегацию, числовые манипуляции и отчетность.Для каждого дебетового и кредитного транзакций должно быть поле даты и времени, чтобы отфильтровать определенный период. Получите книгу от Smashwords, озаглавленной, дизайн базы данных учета. Он предоставляет несколько хороших образцов по дизайну системы учета и некоторый интересный запрос sql для финансовой отчетности.

+0

Это хороший подход, но он недостаточен, поскольку модель бухгалтерского учета не является стандартной. – B4NZ41

Смежные вопросы