powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Проектирование. Счет. Транзакция
17 сообщений из 17, страница 1 из 1
Проектирование. Счет. Транзакция
    #34012377
as111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Вот такой вот вопрос.
Есть несколько счетов. Есть операция по снятию денег с одного счета на другой. Т.е. здесь расход, там приход. Как примерно проектировать такую схему? Соответсвенно интересует:
1. стоит ли сумму остатков фиксировать в самом счете или пусть всегда расчитывается?
2. На перевод денег с одного счета на другой делать одну запись в операциях или две? Если две то как их связать? Ну т.е. если отменяем, то чтобы отменилось и там и там.

Есть у кого простой пример?
...
Рейтинг: 0 / 0
Проектирование. Счет. Транзакция
    #34012682
Фотография Shtock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.ПРочитать,какие законом регламентируются проводки по счетам и не думать за пользователей.
2. Про остатки просто поискать по форуму.
...
Рейтинг: 0 / 0
Проектирование. Счет. Транзакция
    #34012694
as111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да тут не совсем те счета.
Просто люди попросили сделать небольшой учет: приход/расход
...
Рейтинг: 0 / 0
Проектирование. Счет. Транзакция
    #34014279
cooluser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1. Счет должен быть у тебя отдельной сущность, где в том числе лежит и остаток
2. Должна быть таблица с операциями(проводками), атрибуты примерно следующие: счетИсточник, счетПриемник, сумма

При таком подходе получается:
А) Остаток всегда лежит явно в самом объекте "счет"
Б) Остаток по любому счету можно вычислить пройдясь по таблице с операциями.

Понятно что остаток полученный способом А) и Б) должен всегда совпадать. Для этого необходимо корректировать таблицу со счетами при каждой операции над ними.

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

Примерно где то так

Если сформулируешь более конкретные вопросы - отвечу
...
Рейтинг: 0 / 0
Проектирование. Счет. Транзакция
    #34014341
просто_так
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cooluser1. Счет должен быть у тебя отдельной сущность, где в том числе лежит и остаток
2. Должна быть таблица с операциями(проводками), атрибуты примерно следующие: счетИсточник, счетПриемник, сумма

При таком подходе получается:
А) Остаток всегда лежит явно в самом объекте "счет"
Б) Остаток по любому счету можно вычислить пройдясь по таблице с операциями.

Понятно что остаток полученный способом А) и Б) должен всегда совпадать. Для этого необходимо корректировать таблицу со счетами при каждой операции над ними.

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

Примерно где то так

Если сформулируешь более конкретные вопросы - отвечу
Хранить остатки явно в некоторой таблице и пересчитывать после каждой транзакции - не самый лучший подход. А если надо получать остатки на любую дату? А если надо вести аналитику по счетам?
...
Рейтинг: 0 / 0
Проектирование. Счет. Транзакция
    #34014423
cooluser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если надо получить на любую дату то надо их вычислять по таблице с операциями

Если надо это делать часто и быстро то хранить промежуточные остатки на определенные периоды (например на конец месяца)
...
Рейтинг: 0 / 0
Проектирование. Счет. Транзакция
    #34015045
as111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо.

Что-то примерно такое и надо сделать. Чтобы поменьше было бухгалтерии.
Вот и тоже думаю, где же хранить остаток. Текущий наверное лучше всего в сущности СЧЕТ.

И вот такая вот вещь, во многих системах видел, что показывается сумма операции и рядом столбик ОСТАТОК НА СЧЕТЕ. А как они это делают? Понятно, что если операций 10, то можно делать по всякому, а если 1000?
Это ведь чтобы на экран вывести каждый раз надо пересчитывать ВСЕ значения. Запросом я так понимаю это сделать невозможно...
...
Рейтинг: 0 / 0
Проектирование. Счет. Транзакция
    #34015513
as111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вот еще, чтобы снять деньги с одного счета и положить на другой достаточно одной записи или лучше это делать двумя записями?
...
Рейтинг: 0 / 0
Проектирование. Счет. Транзакция
    #34015592
iamhere
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
as111И вот такая вот вещь, во многих системах видел, что показывается сумма операции и рядом столбик ОСТАТОК НА СЧЕТЕ. А как они это делают? Понятно, что если операций 10, то можно делать по всякому, а если 1000?
Это ведь чтобы на экран вывести каждый раз надо пересчитывать ВСЕ значения. Запросом я так понимаю это сделать невозможно...

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

Насчет запроса - можно, если СУБД поддерживает т.н. аналитические функции (Oracle 9i и выше, MSSQL 2005).
...
Рейтинг: 0 / 0
Проектирование. Счет. Транзакция
    #34015843
as111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Начать с конца? Хм, а это идея. Может действительно так будет проще. Спасибо. А база пока не знаю. Т.к. системка должна быть простой как 5 копеек. Не охота закручивать таких монстров на это дело...
...
Рейтинг: 0 / 0
Проектирование. Счет. Транзакция
    #34015938
просто_так
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ТО as111
для вашей задачи лучше считать остатки каждый раз по требованию. все равно легче, чем писать процедуры обновления остатков при каждом движении (если такое требование не выдвинуто явно). а ведь есть еще удаления и изменения транзакций...
...
Рейтинг: 0 / 0
Проектирование. Счет. Транзакция
    #34016113
as111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да уж, так похоже и придется делать. Тормоза будут...
Не удивительно, что я в банке постоянно в очереди стою.
Не так это оказывается все просто...

Накидаю схему попробую ее здесь разместить...
...
Рейтинг: 0 / 0
Проектирование. Счет. Транзакция
    #34031321
zirconate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
as111Добрый день!

Вот такой вот вопрос.
Есть несколько счетов. Есть операция по снятию денег с одного счета на другой. Т.е. здесь расход, там приход. Как примерно проектировать такую схему? Соответсвенно интересует:
1. стоит ли сумму остатков фиксировать в самом счете или пусть всегда расчитывается?
2. На перевод денег с одного счета на другой делать одну запись в операциях или две? Если две то как их связать? Ну т.е. если отменяем, то чтобы отменилось и там и там.

Есть у кого простой пример?

Как это делал я:

1) сущность "счет" содержит ТЕКУЩИЙ остаток
2) для сущности "счет" определяются типы доступных операций (дебетный, кредитный, кредитно-дебетный)
3) определяется сущность "бухгалтерская проводка", которая содержит поля (в числе прочих)
a) "счет" (ссылается на сущность "счет")
б)"остаток ДО операции"
в) "оборот по дебету"
г) "оборот по кредиту"
д) "остаток ПОСЛЕ операции"
4) определяется сущность "транзакция", которая содержит ссылки (2 шт) на сущность "бухгалтерская проводка". Также не лишним будет добавить две ссылки на счета участвующие в транзакции (избыточность). Транзакция также содержит поле(возможно null) ссылающееся на сущность "бизнес-транзакция" - определяет принадлежность транзакции. Вообще, по большому счету эта сущность не особенно нужна и носит чисто вспомогательных характер

5) Определяется сущность "бизнес-транзакция" - содержит данные использованные для осуществления бизнес операции. иногда требуется дополнительная сущность - "счета бизнес операции". Пример бизнес операции - "начисление заработной платы" Иными словами "бизнес транзакция" может включать в себя неопределенно большое количество бухгалтерских проводок.

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

Так например, если потребности в дебетно-кредитных операций нет, то сущность "бухгалтерская проводка" может выглядеть так:
a) "счет" (ссылается на сущность "счет")
б) "корреспондирующий счет" (ссылается на сущность "счет")
в) "тип операции" (дебет/кредит)
г)"остаток ДО операции"
д) "оборот"
е) "остаток ПОСЛЕ операции"

обратите внимание - КАЖДАЯ транзакция все равно нуждается в ДВУХ проводках
Но лично мне такая организация категорически не нравится и на то есть серьезные причины

Из общих соображений могу выделить следующее:
1) Любая бухгалтерская операция должна содержать ДВЕ записи. (двойная запись это бухгалтерский идол... Впрочем, бухгалтеры чуть-чуть иначе понимают принцип двойной записи, но это практически эквивалент вышеописанного)
2) Текущий остаток просто обязан быть зафиксирован - он необходим для многих операций (проверка остатка например итд.)
3) остаток для произвольного счета на любое время и дату содержится в сущности "проводка"
4) при необходимости иметь значение НА КОНЕЦ ДНЯ вводится дополнительная сущность завершения финансового дня и соответствующая процедура. Так в банках есть операция "завершение операционного дня", которая (в числе прочего) фиксирует остатки на счетах
5) мне известны два способа реализации кредитных и дебентых операций. Первый это ровно так как об этом рассказывают бухгалтеры - в зависимости от того является счет дебетным или кредитным оборот по дебету и по кредиту меняет знак (тоесть, дебет будет прибавлять или отнимать от остатка сумму оборота в зависимости от того, является счет кредитным или дебетным). Второй способ это когда например остаток на кредитном счете является отрицательным (при демонстрации этого остатка пользователю он просто берется по модулю). Тогда дебетовые и кредитовые операции всегда будут иметь постоянный знак...
6) Обычно целостность данных обеспечивается средствами БД... Однако иногда могут потребоваться дополнительные меры по обеспечению этой самой целостности... Классическим случаем является операция блокировки счета... Применяется в частности в распределенных системах - перед совершением ЛЮБОЙ бизнес транзакции, все счета участвующие в ней сначала блокируются..

Вот так вот в целом... скучно конечно... выглядит неоправданно сложным но... это сложность таки оправданная
...
Рейтинг: 0 / 0
Проектирование. Счет. Транзакция
    #34033916
as111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за столь развернутый ответ
...
Рейтинг: 0 / 0
Проектирование. Счет. Транзакция
    #34034382
zirconate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
as111Спасибо за столь развернутый ответ
Незачо. Тем более что я допустил вопиющую неточность - счета конечно не дебетные и кредитные (это в банках они таковыми могут быть, и это вообще из другой оперы) а активные и пассивные, а также активно-пассивные
...
Рейтинг: 0 / 0
Проектирование. Счет. Транзакция
    #34039069
Фотография Программист-Любитель
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть еще проблема с датами остатков и проводок при вводе чего-либо задним числом или при коррекции уже отработаных проводок. А в реальной практике это сплошь да рядом.
...
Рейтинг: 0 / 0
Проектирование. Счет. Транзакция
    #34039929
zirconate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Программист-ЛюбительЕсть еще проблема с датами остатков и проводок при вводе чего-либо задним числом или при коррекции уже отработаных проводок. А в реальной практике это сплошь да рядом.

НИКОГДА НИ ПРИ КАКИХ УСЛОВИЯХ не может быть никакой коррекции проводок "задним числом"!... Ошибки исправляются одним из двух способов:

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

2) Откат ВСЕХ проводок в обратном календарном порядке начиная с текущего момента вплоть до той проводки, которая является ошибочной. Ошибочная проводка изымается, вместо нее создается одна или несколько корректных проводок с использованием даты удаленной проводки, после чего все откаченые ранее проводки докатываются с использыванием тех дат которые существовали ранее для данной проводки и, разумеется с пересчетом остатков на конец каждой операции. Этот способ довольно сложен, крайне не надежен, применим далеко не всегда (неприменим например в случае когда отчетность уже зафиксирована контролирующими органами).... Но ОБЫЧНО разработччики бухгалтерских (и особенно банковских) систем предусматривают процедуру отката/доката бухгалтерских проводок ибо очень-очень редко но такая процедура реально необходима... Замечу, что я в данный момент абстрагируюсь от того факта, что в большинстве случаев, когда такая процедура "реально необходима", причины этой необходимости находятся на где-то грани криминальных...
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Проектирование. Счет. Транзакция
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]