Да, в проводке хранится только самьій "низкий" уровень счета. Не думаю что некоторая избьіточность полей в таблице журналов является веской причиной для отдельньіх таблиц.
С производительностью проблем нет. Для примера, у меня основная таблица проводок >15М записей. Дополнительно раз в месяц происходит закрьітие периода (можно и чаще), во время которого собираются промежуточньіе итоги (они тоже хранятся в таблице проводок). Большинство отчетов получается за время не более 2х секунд.
Я ранее здесь давал ссьілку на SQLru, там описана структура таблиц детальнее
Мне кажется что разделение проводок по разным таблицам-журналам это неправильный подход. Вы привязываетесь к номерам журналов и конкретному плану счетов. Они имеют свойство меняться. Я не знаком с этими номерами в РФ, но мне кажется номер журнала можно хранить в проводке. И изменение страны для которой происходит учет не должно влиять на структуру таблиц.
Таблицу счетов можно сделать древовидной, а в таблице операций хранить только один счет, самого низкого уровня. И обороты по главному счету получать при помощи объединения с таблицей проводок.
У меня структура таблиц в бухгалтерии: 1. Документ (набор таблиц с датой, типом, контрагентами, списком товаров и т.д.). У меня 2 основные таблицы. Документ имеет 2 состояния: черновик и проведенный документ. В момент проведения на основе настроек конкретного типа документа, вида товаров и т.д. формируются проводки.
2. Проводки (или точнее полупроводки). При проведении документа формируется набор проводок, где каждая проводка это 2 строки и полями: id_документа, дата, счет, организация, сумма, знак (1=дебет, -1=кредит), примечание, id_операции (связь дебета с кредитом). Сюда же можно и воткнуть номер журнала.
3. Движение товаров. При перемещении товаров у меня формируется таблица похожая на проводки, но немного проще: id_документа, дата, id_товара, id_склада, кол-во, сумма, знак (1=приход, -1=расход), id_партии (для партионного учета)
4. Справочники (счетов, организаций, товаров и т.д.)
Все остальное: обороты, остатки, движение получается довольно простыми запросами.
Поле признак, для дебета = "+1", для кредита = "-1".
Проводка разбивается на две строки: дебетная и кредитная. Поля в строке: счет, склад/организация, дата, сумма, знак, id_проводки (дополнительно можно примечание, id_документа, и т.д.) id_проводки в вашем случае может соответствовать general_journal.id и нужно в дальнейшем для отображения проводки в "канонической форме" (должно быть уникальным для обеих строк) Столбцы: дата, сумма, id_проводки у обеих строк одинаковые.
Получаем из журнала проводок главную книгу и сохраняем ее
При использовании структуры таблиц, в котором проводка разбита на 2 строки получение оборотов + остатки на начало и на конец периода (сальдо) это запрос вида
select account_id, sum(case when DATE >= '01.01.2021' and "Знак" = 1 then amount else 0) AS debit_turnout, sum(case when DATE >= '01.01.2021' and "Знак" = -1 then amount else 0) AS credit_turnout, sum("Знак" * amount) AS saldo, sum(case when DATE < '01.01.2021' then "Знак"* amount) AS saldo_begin from "Таблица_полупроводок" group by account_id
Такой запрос гораздо лучше индексируется (по сравнению с запросом с UNION) Про субсчета. Для каждого счета есть признак главный счет и соответственно группировать можно по главному счету.
Ваша структура легко приводится к такой путем добавлением триггера на general_journal (здесь разделять на 2 строки). Хотя конечно, с моей т.з. дублирование всех полей на счет, субсчет, склад для дебета и кредита себе идея.
id_проводки связывает 2 строки в одну (и соответствует понятию "двойная запись") id_контрагента - это как организации так и свои склады/кассы/расч. счета Знак позволяет различить ситуацию Дт 10 Кт 60 сумма -125 и Дт 60 Кт 10 сумма 125 Такая структура большинство отчетов делает тривиальными
Любой отчет считается полным пересчетом, но по закрытию периода я в таблицу проводок вношу остатки: половина проводки, с признаком остаток. В дальнейшем остаток считается от ближайшего закрытия.
А зачем в этой системе вообще нужны месяцы? 5 штук, которые с сезонами вообще не связаны. Проще писать 2021-205, меньше проблем с високосным годом, можно его записывать нулевым, или 366. Но месяцев нет, дней недели, кстати тоже.
А секунду не трогать, она базовая единица измерения.
Как мне кажется будущее все же за гибридами, где ДВС крутит генератор, а колеса приводятся в движение электродвигателем. Плюс небольшой аккумулятор на 10-50км для поездок в городе.
У меня китайский фонарик, приспособленный в качестве фары, в одном из режимов мигает сигналом SOS. И если неудачно переключился будет моргать пока не отключишь.
А фонарик накрыть чем-то разве не выход? Какие-то детские меры безопасности
Да, в проводке хранится только самьій "низкий" уровень счета.
Не думаю что некоторая избьіточность полей в таблице журналов является веской причиной для отдельньіх таблиц.
С производительностью проблем нет. Для примера, у меня основная таблица проводок >15М записей. Дополнительно раз в месяц происходит закрьітие периода (можно и чаще), во время которого собираются промежуточньіе итоги (они тоже хранятся в таблице проводок). Большинство отчетов получается за время не более 2х секунд.
Я ранее здесь давал ссьілку на SQLru, там описана структура таблиц детальнее
Мне кажется что разделение проводок по разным таблицам-журналам это неправильный подход. Вы привязываетесь к номерам журналов и конкретному плану счетов. Они имеют свойство меняться. Я не знаком с этими номерами в РФ, но мне кажется номер журнала можно хранить в проводке. И изменение страны для которой происходит учет не должно влиять на структуру таблиц.
Таблицу счетов можно сделать древовидной, а в таблице операций хранить только один счет, самого низкого уровня. И обороты по главному счету получать при помощи объединения с таблицей проводок.
У меня структура таблиц в бухгалтерии:
1. Документ (набор таблиц с датой, типом, контрагентами, списком товаров и т.д.). У меня 2 основные таблицы. Документ имеет 2 состояния: черновик и проведенный документ.
В момент проведения на основе настроек конкретного типа документа, вида товаров и т.д. формируются проводки.
2. Проводки (или точнее полупроводки). При проведении документа формируется набор проводок, где каждая проводка это 2 строки и полями: id_документа, дата, счет, организация, сумма, знак (1=дебет, -1=кредит), примечание, id_операции (связь дебета с кредитом). Сюда же можно и воткнуть номер журнала.
3. Движение товаров. При перемещении товаров у меня формируется таблица похожая на проводки, но немного проще: id_документа, дата, id_товара, id_склада, кол-во, сумма, знак (1=приход, -1=расход), id_партии (для партионного учета)
4. Справочники (счетов, организаций, товаров и т.д.)
Все остальное: обороты, остатки, движение получается довольно простыми запросами.
Поле признак, для дебета = "+1", для кредита = "-1".
Проводка разбивается на две строки: дебетная и кредитная. Поля в строке: счет, склад/организация, дата, сумма, знак, id_проводки (дополнительно можно примечание, id_документа, и т.д.)
id_проводки в вашем случае может соответствовать general_journal.id и нужно в дальнейшем для отображения проводки в "канонической форме" (должно быть уникальным для обеих строк)
Столбцы: дата, сумма, id_проводки у обеих строк одинаковые.
Ха! У меня один "нелетальщик", говорит людей не посылали, а послали автоматическую станцию
Получаем из журнала проводок главную книгу и сохраняем ее
При использовании структуры таблиц, в котором проводка разбита на 2 строки получение оборотов + остатки на начало и на конец периода (сальдо) это запрос вида
select account_id,
sum(case when DATE >= '01.01.2021' and "Знак" = 1 then amount else 0) AS debit_turnout,
sum(case when DATE >= '01.01.2021' and "Знак" = -1 then amount else 0) AS credit_turnout,
sum("Знак" * amount) AS saldo,
sum(case when DATE < '01.01.2021' then "Знак"* amount) AS saldo_begin
from "Таблица_полупроводок"
group by account_id
Такой запрос гораздо лучше индексируется (по сравнению с запросом с UNION)
Про субсчета. Для каждого счета есть признак главный счет и соответственно группировать можно по главному счету.
Ваша структура легко приводится к такой путем добавлением триггера на general_journal (здесь разделять на 2 строки). Хотя конечно, с моей т.з. дублирование всех полей на счет, субсчет, склад для дебета и кредита себе идея.
Как выше уже сказали сальдо и обороты это результат суммирования проводок за весь период.
Вариант с полями под субсчета мне кажется дорогой не туда. Иногда счет сначала ввели как основной, а потом его надо сделать субсчетом и наоборот.
У меня для структура таблицы для проводок
Id_счета, Знак, Сумма, id_контрагента, id_проводки
id_проводки связывает 2 строки в одну (и соответствует понятию "двойная запись")
id_контрагента - это как организации так и свои склады/кассы/расч. счета
Знак позволяет различить ситуацию Дт 10 Кт 60 сумма -125 и Дт 60 Кт 10 сумма 125
Такая структура большинство отчетов делает тривиальными
Любой отчет считается полным пересчетом, но по закрытию периода я в таблицу проводок вношу остатки: половина проводки, с признаком остаток.
В дальнейшем остаток считается от ближайшего закрытия.
Когда-то здесь описывал упрощенный вариант моего учета https://www.sql.ru/forum/1321016/zhurnal-dvizheniya-deneg
Ну и "кровосісі" упомянуты же :)
А зачем в этой системе вообще нужны месяцы? 5 штук, которые с сезонами вообще не связаны.
Проще писать 2021-205, меньше проблем с високосным годом, можно его записывать нулевым, или 366. Но месяцев нет, дней недели, кстати тоже.
А секунду не трогать, она базовая единица измерения.
Для тех кому надо сменить ID в TeamViewer, гугл в помощь. Работает для всех версий
Эти фейковые контакты режутся методом исключения на сервере
А фонарик накрыть чем-то разве не выход? Какие-то детские меры безопасности