Во-первых, я хотел бы понять, что вы подразумеваете под «очень большими базами данных» - большинство систем СУБД, работающих на достойном оборудовании, должны иметь возможность рассчитать это в реальном времени для чего-либо менее чем сотен миллионов счетов.Я говорю здесь из опыта.
Во-вторых, «наилучшая практика» - это одно из тех выражений, которые очень мало значат - оно часто используется для представления чьего-либо мнения как более значимого, чем просто мнение.
По моему мнению, безусловно, лучший вариант - рассчитать его на лету.
Если ваша база данных настолько велика, что вы действительно не можете этого сделать, я бы подумал о ночной партии (как вы описываете).Ночные пакетные прогоны - это боль, особенно для систем, которые должны быть доступны 24/7, но они имеют преимущество, сохраняя всю логику в одном месте.
Если вы хотите избежать ночных пакетов, вы можете использовать триггеры для заполнения таблицы "unpaid_invoices".При создании новой записи счета-фактуры триггер копирует этот счет в таблицу «unpaid_invoices»;когда вы обновляете счет с помощью платежа, а сумма платежа равна неоплаченной сумме, вы удаляете из таблицы unpaid_invoices.По определению таблица unpaid_invoices должна быть намного меньше, чем общее количество счетов;вычисление непогашенной суммы для данного клиента на лету должно быть в порядке.
Однако триггеры - это неприятные, злые вещи с экзотическими режимами сбоев, которые могут поставить в тупик ничего не подозревающего разработчика, поэтому учитывайте это только при наличии ниндзяРазработчик SQL под рукой.Обязательно убедитесь, что у вас есть SQL-запрос, который проверяет правильность вашей таблицы unpaid_invoices, и в идеале запланируйте его как обычную задачу.