Операции высокого уровня с государствами в двойной системе учета - PullRequest
3 голосов
/ 29 января 2020

Предположим, что существует система с двойным учетом:

Я предпочитаю последнюю модель с нормализованным Transaction.

Есть длительные сложные операции со многими состояниями. Одна большая транзакция влияет на многие доп. учетные записи (или даже многие бухгалтерские книги), вы можете сторнировать (публиковать напротив Transaction s), добавлять новые транзакции, такие как комиссия, штраф или перераспределять деньги из всех участвующих доп. транзакции по счетам / бухгалтерским книгам при изменении состояния. Должны хранить ссылки на Transactions и не дублировать Amount в этих таблицах процессов c. enter image description here

Дополнительные примеры:

enter image description here

Простой пример ApplicationTransaction - это Bet которые состоят из нескольких Pledge с, когда вы берете некоторое обеспечение от каждого участника. Каждый участник даже имеет различные активы на карту, и House может взять многие из них, чтобы удовлетворить некоторые требования. Я имею в виду обобщенную таблицу c ApplicationTransaction с D iscriminator и многими определенными c таблицами.

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

A Lottery (что является наиболее вымышленным вариантом использования здесь) может быть примером ApplicationTransaction, который затрагивает многие аккаунты, он начинается и заканчивается массивным «сбросом» выигрышей. Каждый экземпляр имеет свои собственные значения атрибута, свойства которого следующие: stati c.

Другой вариант использования - Trade между двумя доп. счета, где Хаус может быть посредником, должны брать активы с каждой стороны, перемещать их на специальные LedgerAccount|XYZ|AL|Escrow|, по одному на ApplicationTransaction.Type, а не на экземпляр. Сохраняйте записи о передачах, связанных с указанным c Trade экземпляром, может длиться некоторое время, иметь несколько состояний, атрибутов, разные результаты для доп. Владельцы счетов, которые могут быть штрафом для одной стороны и погашением для другой. Без книги заказов или соответствующего двигателя. Такой процесс обмена имеет несколько состояний, и в разрешении спора может быть задействован другой контрагент, если произойдет такой State переход. Оба участника должны пометить Trade чем-то вроде Payment Received (при условии, что оплата производится вне системы). Это состояние перехода. Система может взимать плату с каждого участника.

Это не одна запись Transaction. Группа из них. Например, если мне нужно внести определенную сумму в условное депонирование, я могу положить X * Emeralds и X * Diamonds, чтобы встречаться с принцессой. Таким образом, он не только публикует много (AssetType, Amount, AccountNo) (N * активов * 2 участников), но и публикует в Income LedgerAccount. Предположим, что мы совершаем сделку за интервал Assets.

. Можно также добавить таблицу, которая ограничивает возможные переходы для каждого типа операции, чтобы мы могли добавлять ограничения. Я рассматриваю его как копию таблицы поиска состояний с дополнительными ссылками на столбцы NextState, таким образом, он определяет набор доступных состояний. Однако за рамками этого вопроса.

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

Возможно с моей стороны все еще есть недоразумение, но я не думаю, что каждый экземпляр варианта использования приложения должен производить одноразовые LedgerAccounts, потому что мы не создаем новые HouseCash для каждого варианта использования Deposit и Withdrawal. Депозит / Снятие также относится к категории ApplicationTransaction, с несколькими переходами между состояниями (например, отклонено обработчиком платежей). В реальном приложении у вас есть специальные таблицы для обработки, есть способ оплаты и сумма и т. Д. c.

В противном случае такой подход приведет к сотням тысяч одноразовых LedgerAccounts. Вопрос не в том, чтобы сделать универсальную модель системы общего назначения для Вселенной, а в том, правильное ли направление. Не уверен, что мы должны вести разовые счета, как я уже говорил, я вижу Account и LedgerAccount как нечто, необходимое для получения отчетов House, ведения учетных записей клиентов, иначе это выглядит так же глупо, как определение учетной записи для каждого ядра ЦП в AWS EC2.

1 Ответ

2 голосов
/ 29 января 2020

Модель справочных данных

Я предпочитаю последнюю модель с нормализованной транзакцией.

В соответствии с рекомендациями SO, каждый ответ ограничивается вопросом. Модель данных в первом Ответе удовлетворяет Вопросу и предполагает понимание Главной книги. Второй вопрос не предполагает понимания Главной книги, поэтому второй Ответ дает полное объяснение Главной книги и требует еще более подробной модели данных.

Безусловно, мы будем использовать вторую модель данных .


Задача • Подход

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

Определенно, абсолютно, нет. Пожалуйста, забудьте о мышлении в терминах IT или CS. Думайте только в терминах учета (а затем, при реализации, реализуйте требования учета).

  • Каждая учетная запись или бизнес транзакция является единственной, немедленной. Он включает в себя один номер счета ГК LedgerNo на одной стороне, а другой LedgerNo или номер внешнего счета AccountNo на другой стороне.

  • Ожидания нет, нет состояния, без прогрессии.

  • Не существует такой вещи, как бизнес или бухгалтерия транзакция , которая затрагивает «многие внешние счета» (или многие другие учетные записи в Главной книге). Такое восприятие не бухгалтерское.

    • Если вы реализуете что-либо в соответствии с этими принципами, у вас не будет системы учета, у вас будет система анти-учета (с или без DEA), которая не в состоянии бухгалтерии, не в бухгалтерии и не в аудите.
  • У вас может быть процедура , которая влияет на многие учетные записи (Ledger-Ledger или Ledger- [External] Account). Но эта процедура выполняет отдельные бизнес-операции. Примеры в другом ответе :

    • § 5/2 Ежемесячная плата (псевдокод)
      Представьте себе BEGIN TRAN/COMMIT TRAN брекетинг, который INSERT
    • § 6.5. SQL Пакетное задание • Конец месяца счета
      В частности, SQL Транзакции должны выполняться в партиях . Это означает `COMMIT TRAN / BEGIN TRAN каждые 100 или 200 бизнес-транзакций. Обычно можно было бы перезапустить контроль, и т. Д. c. (Если вы этого не понимаете, пожалуйста, спросите.)

Я имею в виду универсальный c Операционный стол с OperationType Discriminator и многими определенными c таблицами для каждой операции. Тип.

(Нет комментариев к таблице операций.)

Обычный кластер эксклюзивных подтипов в терминах реляционного или IDEF1X.

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

  • Никогда не размещайте ограничения или что-либо, что ограничивает логику c (непротиворечивость) данных где-либо, кроме как в база данных.

  • База данных представляет собой единицу восстановления. Он должен содержать

    • все ограничения (логического ограничения нет; все и вся в реляционной базе данных может быть объявлено с точки зрения предикатов FOP C) и
    • все транзакции в хранимых процессах.
  • Все таблицы имеют GRANTED SELECT разрешение только, никогда GRANTED INSERT, UPDATE, DELETE. Это означает, что нет прямой записи в таблицы.

  • Транзакции (список сохраненных процедур) являются API базы данных . GRANT EXEC разрешение для тщательно выбранного Roles и, таким образом, для указания c Users.

  • Весь код приложения, который либо в клиенте, либо в некотором промежуточном программном обеспечении Уровень, выполняет только транзакции. Все еще только разрешено Users

В противном случае у вас нет базы данных, у вас будет незащищенный беспорядок данных. См. Стандарты открытой архитектуры . (Это простое определение для потребления c.)


Проблема • Применение

Простым примером операции является ставка, состоящая из нескольких залогов, когда Вы берете некоторое обеспечение от каждого участника. Каждый участник даже имеет различные активы на карту, и Хаус может взять многие из них, чтобы удовлетворить некоторые требования.

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

  1. У каждого участника пари будет отдельный внешний Account.

  2. Будет таблица AssetType, которая определяет различные типы активов, которые вы называете "залог". Думайте с точки зрения «денег» в разных «валютах» (следовательно, DEA возможен).

  3. Account будет квалифицироваться как AssetType, давая таблицу AccountAsset. AccountAsset (а не Account) будет проведено против. Мы проводим операции с активами по AccountAsset, а не по деньгам, а не по общей стоимости в Account.

  4. На стороне Главной книги сначала будет Suspense или Pending Account.

  5. Далее, то, что вы называете "состоянием", является записью в Главной книге в Suspense. Но тогда даже ваше понятие «состояние» должно быть ужесточено, чтобы соответствовать понятию приостановленного или ожидающего аккаунта. Поэтому я не могу использовать ваши примеры напрямую, я дам то, что я могу определить (не стесняйтесь уточнить или добавить больше). Ориентировочно я назову это SuspenseState. Значения:

    • Открытая ставка (в ожидании, не закрыто)

    • Недостаточно средств (ставка закрыта, актив не получен)

      • Существует дальнейшее усовершенствование, чтобы предотвратить это. После правильного определения SuspenseStates, а не до этого, это можно обсудить.
  6. Далее под каждым SuspenseState будет быть одна запись на AssetType. Это LedgerAccounts, совершающие сделки со всеми внешними Accounts. [4] [5] не являются транзакционными, они агрегированы LedgerIntermediates.

Ваша модель данных

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

Я отвечал выше в соответствии с приведенными мною требованиями, которые я понимаю несколько. Я не могу понять, как это относится к модели данных (требование: залог против модели данных: лотерея). И я не могу понять, что делает Operation. Вы глубоко в понимаете, как делать то, что вам нужно, но мы пока не понимаем , что нам нужно. Порядок: сначала определите что , затем определите как .

  1. Пожалуйста, объясните в технических терминах на английском языке sh ( измените ваш вопрос), Лотерея и торговля (я понимаю, что это эквивалентно переводу денег между внешними банковскими счетами ... но почему задержка, а не немедленная?).

  2. Пожалуйста, объясните, что означает каждое из "состояний" (одно предложение, обозначающее предпринятые действия, и каждую сторону):

    • AAA: Новый ; Завершено; Отменено

    • BBB: Ожидание; Конфликт; Решено

    • CCC: Новое; Заполните; Откат

  3. Почему ваша модель не имеет "сопутствующие" типы (my AssetType)?

  4. Предостережение. Отпечатывание поля ID на каждом файле серьезно нарушит процесс моделирования. Почему ? Потому что вы предполагаете, что файл правильный, но это не так. Вы исправляете «сущность», а «сущность» еще не смоделирована. Целью моделирования является моделирование данных, только данных и ничего, кроме данных (поле ID - это не данные, а дополнение) ... таким образом, что «сущности» обнажаются, перегоняются, определяются.

    Поэтому, чтобы выполнить какое-либо моделирование подлинных данных, удалите поля ID. Это означает, что вы должны выбрать логический идентификатор для каждого исправленного файла, и это действие повысит его до статуса таблицы. реляционная модель требует, чтобы ключ был «составлен из данных».

    Если поля ID остаются, существуют дополнительные предостережения, которые я не буду детализировать, потому что если они удаляются, предостережения тоже исчезнут. (Это общие проблемы. Если вам интересно, вы можете прочитать некоторые из моих других Ответов, в которых я подробно описываю каждую проблему и даю решение.)

...