Какие особые соображения необходимы при разработке баз данных для хранения финансовых отчетов?

15

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

Теперь создать простой отчет о финансовых операциях теоретически легко. Одна таблица базы данных с несколькими столбцами может сделать эту работу. Даже MS Access, Excel или даже простой текстовый файл ASCII можно использовать для хранения дат транзакций, идентификаторов счетов и сумм в долларах. Однако я чувствую, что даже таблица SQL с частым резервным копированием с транзакционной целостностью может оказаться недостаточно надежной для серьезного финансового отслеживания.

Я слышу такие термины, как «учет с двойной записью», и у меня возникает ощущение, что большинство приложений для отслеживания финансовых операций (например, Mint.com или GnuCash) имеют гораздо более сложную структуру или процесс обработки данных, чтобы обеспечить двойную уверенность в том, что все складывается идеально, именно так, как и должно быть, и что никакие данные никогда не будут потеряны или повреждены.

Мой вопрос: при разработке приложения для отслеживания финансовых транзакций, какие особые соображения дизайна должны быть сделаны? Кажется, что может быть так много потенциальных проблем ... проблемы с точностью округления, проверками четности, каким-то процессом аудита, специальным резервным копированием, безопасностью / шифрованием, дополнительными способами защиты данных в случае сбоя в процессе ввода данных. ... Я не знаю, о чем конкретно должен спрашивать, но у меня возникает ощущение, что в индустрии программирования есть набор лучших практик, о которых я ничего не знаю. Кто они такие?

Редактировать:

Похоже, я открыл большую банку с червями, чем ожидал. Чтобы уточнить, я имею в виду конкретно два типа приложений:

  1. Приложения типа «Проверка реестра», такие как GnuCash или Quicken, которые ведут учет транзакций отдельных лиц для собственного использования.
  2. Приложения, которые отслеживают выставление счетов / кредит / или «баллы» для поставщиков и клиентов, которые имеют дело с компанией.

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

Джошуа Кармоди
источник
4
Каждый раз, когда я вижу этот вопрос, я получаю всплеск "Позвольте мне положиться на вас!" и затем он уходит, потому что объем данных настолько велик, что я не могу понять, с чего начать. Я бы сказал, что это зависит от типа бизнеса, объема бизнеса и количества нолей, с которыми вы будете иметь дело. В последних двух случаях, если вы много имеете дело, найдите бухгалтера.
Satanicpuppy
3
Чтобы немного ослабить ваши страхи, «учет двойной записи» не имеет ничего общего с тем, насколько надежным должно быть приложение. Этот термин - просто практика бухгалтерского учета, которая гласит, что всякий раз, когда вы проводите дебетовую транзакцию по одному счету (скажем, наличными), он должен совпадать с кредитной транзакцией по другому счету (например, инвентаризация).
Майк Кларк
@Satanicpuppy - Ну, предположим, я хотел создать новый GnuCash? Я думаю о базовой транзакции или выставлении счетов в реестре. Ничего подобного приложение для выставления счетов CC или приложение для торговли акциями.
Джошуа Кармоди
@Joshua: пожалуйста, отредактируйте это в своем вопросе: «Я имею в виду основную транзакцию или реестр выставления счетов. Ничего подобного приложению для выставления счетов CC или приложению для торговли акциями». (Вы упомянули «финансовые услуги» в конце вашего вопроса. Бухгалтерские и финансовые услуги не совсем совпадают.)
rwong
2
@Joshua: финансовые услуги регулируются в большей степени государственными нормативами, поэтому будет много «особых соображений», например, о программном обеспечении для торговли акциями, чем о бухгалтерской системе. Налоговое программное обеспечение также может регулироваться налоговым законодательством.
Rwong

Ответы:

10

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

Вы уже рассмотрели большинство вопросов.

Точность округления обычно не является большой проблемой в моем опыте. Большинство крупных финансовых организаций, которые не выросли в одночасье (то есть все, кроме хедж-фондов), имеют огромный спектр унаследованных приложений, которые делятся из-за разного топлива. Они имеют тенденцию не делать точность округления последовательно; Как правило, определенная ошибка прибыли и убытка просто принимается за округление. Действительно, много человеко-часов проведено в тех местах, где я работал, где люди, где выбирают «да, это достаточно близко», когда дело доходит до сопоставления точных / ожидаемых сумм. Помните, это ответ, основанный на реальности, а не на том, что должно произойти.

Шифрование - не полагайтесь на это честно. Храните идентифицирующие данные в физической и логически отдельной системе, чем не идентифицированные данные (т. Е. Код учетной записи везде, личные данные отдельно).

Как правило, в то время как резервные копии требуются, автономные резервные копии используются редко - в этот момент все пошло не так, как надо. Обычно требуются теплые производственные копии - однако это будет зависеть от ваших конкретных потребностей. В общем, у нас есть рабочая копия всех систем на месте и сайт аварийного восстановления с собственным производством и горячими копиями. Теплые копии, как правило, отстают в репликации на несколько минут и т. Д.

Аудит - это ключ к каждой финансовой системе, над которой я когда-либо работал. У вас есть 2 основных требования: A) Можете ли вы отслеживать каждое изменение данных, кем, когда и почему? Б) Можете ли вы доказать историческое состояние ваших данных? Что это не было подделано?

A) требуется для рабочих групп - ваша система будет использоваться 100 способами, которых вы никогда не ожидали, и эта информация имеет жизненно важное значение для расширения, специальных отчетов, юридических причин и отладки.

Б) См. Дело AMEX против Ви Винни - где AMEX не смогли собрать задолженность в размере 40 тысяч, поскольку они не смогли доказать, что их записи не были составлены. Решение, обычно используемое для этого, является надежной отметкой времени. Крупные финансовые компании имеют банки-гаранты, которые гарантируют транзакции и, таким образом, обеспечивают надежную отметку времени. Есть коммерческие провайдеры для этого для других слоев общества / сценариев.

Jonno
источник
6

Соображения в основном правовые . Если вы просто посмотрите на это с точки зрения безопасности / надежности, лист Excel не может быть по своей природе менее безопасным, чем лист бумаги в каком-либо ящике. Целостность транзакций Access может быть лучше, чем у клерка, который прерывается вызовом.

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

  • Форматы документов для хранения имеют значение , потому что существуют законы, согласно которым предприятия должны хранить свои документы в течение 10 лет. Возможно, через 10 лет ваша программа больше не будет доступна. Следовательно, вы должны хранить документы в соответствии с DIN / ISO-стандартом (.pdf в Германии кажется достаточным)
  • Часто требуются контрольные журналы , например, вам может потребоваться представить разные версии одного и того же документа с датами изменения.
  • Расположение хранилища имеет значение из-за «Datenschutz» (конфиденциальность), которая может отличаться в стране хранения. Это делает облачные сервисы немного сложнее.
  • Некоторые документы должны храниться в неизменяемом виде . как именно это достигается, зависит, главным образом, от легалистического придирчивости (бумага неизменна, диск изменчив, диск подписан работником - нет)

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

keppla
источник
3

Факторы надежности становятся удивительно важными, когда вы имеете дело с деньгами людей. Если Twitter теряет твит, это не так уж важно; если вы снимаете деньги с чьей-то кредитной карты, но теряете их заказ, кто-то в вашей организации получит кредит от недовольного клиента. Итак, две вещи: 1. Вы не хотите, чтобы это произошло в первую очередь, но 2. это произойдет в конце концов, независимо от того, насколько вы осторожны, поэтому вы хотите приложить МНОГО энергии к таким механизмам регистрации и отслеживания. это поможет вам вернуться и найти «потерянный» заказ и исправить ситуацию.

Абсолютно худшая вещь - это, например, взимать плату с кредитной карты, но НЕТ записи о том, для чего она предназначена, кому она принадлежит и т. Д.

Что касается финансовых вопросов, вам действительно нужно продумать даже невероятно невероятные сценарии и спланировать, как с ними справиться: «Мы сняли средства с кредитной карты, но сервер базы данных не работает, прежде чем мы сможем обновить соответствующую запись». Хорошо что теперь? Аннулировать заряд? Записать транзакцию в файл, чтобы человек мог исправить это позже? Хорошо, что, если диск заполнен и вы не можете записать в файл? И т. Д.

Mindcrime
источник
3

[1] Используйте таблицы безопасности (не путайте с внутренними пользователями БД) для пользователей и для вашего приложения. модули, формы, веб-страницы:

User = {userID, username, pwd, email1, email2}
Modules = {moduleID, moduleTitle, moduledescription}
ModulesPerUser = {modulesperuser, userID, moduleID}

[2] Не удаляйте записи в вашем приложении. Используйте поле состояния, может быть, целое число, может быть логическое значение или бит, которые указывают, что запись считается «удаленной». Сделай свое приложение. показать записи, которые не были удалены (помечены как удаленные, этим полем), и сделать несколько особых случаев формы, где приложение. показывает записи, помеченные как удаленные.

anytable = {anytableID, anytablefield1, anytablefield2, ..., bool anytableisdeleted }

Эта функция называется «виртуальное удаление». Реальное удаление часто называют «физическим удалением».

[3] Используйте поля во всех таблицах, которые относятся к доступу, сохраните (одного) пользователя, который создал запись, и (последнего) пользователя, который изменил запись, и дату и время, если это возможно, добавьте модуль или параметр, где каждая запись была изменение:

AnyTable = {anytableID, anytablecreateuserID, anytablecreatedatetime,
anytableupdateuserID, anytableupdatedatetime,
moduleID, anytablefield1, anytablefield2, ..., anytableisdeleted }

[4] В некоторых случаях денежные или денежные значения могут влиять на результаты, когда используются несколько записей в деталях и добавляются в одно значение в записи заголовка.

Большинство брендов баз данных в настоящее время поддерживают поле данных о валюте или деньгах. Используй это.

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

Эти техники это обоюдоострый меч. Если ваше приложение требует такого рода рекомендаций, поищите в Интернете учебник о том, как правильно его реализовать.

Приветствия. [не забудьте дать котенку открытую банку тунца или отпустить голос]

umlcat
источник
2

Вы пометили свой вопрос, securityно вы в основном говорите о последовательности и надежности, поэтому я попытаюсь ответить на эту часть уравнения:

  • Используйте транзакции базы данных для обеспечения целостности пакетных операций. Самый простой пример - это перевод между двумя счетами: с одного счета вычитается сумма, а с другого зачисляется. Используйте транзакции, чтобы частичный перевод никогда не происходил (изменяется только одна сторона).
  • Для точности используйте DECIMALтип вместо float. Расчеты намного медленнее, но вы не должны это чувствовать, так как большинство финансовых расчетов очень просты
  • Используйте репликацию для бесперебойной работы и горячие копии для резервного копирования. Вы также должны посмотреть на снимки LVM для восстановления
Эран Гальперин
источник
2

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

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

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

Я бы не стал разбираться с финансовыми приложениями любого вида без тщательного изучения GAAP (в США, в других странах существуют свои собственные стандарты бухгалтерского учета) и без использования CPA в качестве консультанта, поскольку неправильная практика бухгалтерского учета может привести к тюремному заключению. Это очень техническая область, и кто-то, не имеющий необходимых знаний, не имеет никакого дела, пытаясь создать программное обеспечение в этой области.

HLGEM
источник
1

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

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

Total Debits == Total Credits, это верно, говорите ли вы о ВСЕХ наборах счетов или только об одной транзакции в изоляции. Если это не так, вы пропустили хотя бы одну публикацию. Именно так уравновешивает себя Главная книга.

Дебиторская задолженность (чистые дебеты на контрольный счет) == Общая сумма счета (общая сумма всех подлежащих оплате сумм) - Общая сумма полученных (общая сумма всех полученных платежей). Это пример того, как итоги транзакций в фактических ФИЗИЧЕСКИХ и материальных условиях документа должны сопоставляться с Главной книгой (двойная запись).

Банковский баланс (согласно вашей банковской выписке) == Общая сумма вашей Главной книги для этого счета + все полученные чеки, которые не были депонированы - все выпущенные чеки, которые не были внесены в банк. Это пример того, как банковские / денежные счета соотносятся с Генеральной Леджер.

Как видите, каждая транзакция, вспомогательная книга, даже акция, напрямую связана с Главной книгой.

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

Конечно, есть больше балансов для проверки / подсчета, но вы должны получить суть требуемой работы. По сути, все уравновешивается со всем остальным, будь то физические документы, статьи Главной книги, банковские выписки. Это должен быть идеальный баланс, или в тех случаях, когда вам лень иметь дело с округлением, близким к идеальному.

Чем больше проверок вы сможете выполнить во время разработки, тем меньше вероятность, что вы что-то не так сделаете.

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

Permas
источник