powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Баланс абонента, как правильно организовать?
11 сообщений из 11, страница 1 из 1
Баланс абонента, как правильно организовать?
    #35553623
Crvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет!
Не могу определиться как правильно спроектировать БД что бы правильно и быстро работало, вообщем, для примера, есть 3 таблицы:
Код: plaintext
1.
2.
3.
Абоненты (id, name)
Платежи (id, abonent_id, date_payment, summa)
Пополнение счета(id, abonent_id, date_fill, summa)

При пополнении счета происходит запись в таблицу пополнений, кто, когда и сколько пополнил, при оплате услуг в таблицу платежей записывается кто, когда и сколько заплатил, теперь нужно узнать текущий баланс абонента, сколько у него осталось на текущий момент, есть два способа которые у меня крутятся в голове:
1. В таблицу абонентов добавить поле ТекущийБаланс, при пополнении и при оплате менять значение этого поля в ту или иную сторону;
2. Вычислять разницу между таблицами пополнений и платежей, выполняя запрос к этим таблицам

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

Может у кого нибудь есть другой вариант получения текущего баланса?
...
Рейтинг: 0 / 0
Баланс абонента, как правильно организовать?
    #35553680
CrvikВсем привет!
Не могу определиться как правильно спроектировать БД что бы правильно и быстро работало, вообщем, для примера, есть 3 таблицы:
Код: plaintext
1.
2.
3.
Абоненты (id, name)
Платежи (id, abonent_id, date_payment, summa)
Пополнение счета(id, abonent_id, date_fill, summa)

При пополнении счета происходит запись в таблицу пополнений, кто, когда и сколько пополнил, при оплате услуг в таблицу платежей записывается кто, когда и сколько заплатил, теперь нужно узнать текущий баланс абонента, сколько у него осталось на текущий момент, есть два способа которые у меня крутятся в голове:
1. В таблицу абонентов добавить поле ТекущийБаланс, при пополнении и при оплате менять значение этого поля в ту или иную сторону;
2. Вычислять разницу между таблицами пополнений и платежей, выполняя запрос к этим таблицам

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

Может у кого нибудь есть другой вариант получения текущего баланса?
Объясните мне, глупому, в чем разница между платежами и пополнением счета? Разве пополнение счета не есть платеж? И какой баланс Вы хотите из этих таблиц вывести? ИМХО, Вам надо произнести вслух правило формирования баланса / написать формулу, по которой нужно будет расчитать значение. Тогда меньше будет "каши"...

ИМХО, должно быть нечто следующее:
- таблица абонентов
- таблица оказанных абоненту услуг (таблица учета разговоров абонента) = сумма снимается со счета
- таблица проведенных платежей по услугам = сумма добавляется на счет

В Вашем первом варианте ничего "позорного" нет. Просто на таблицы платежей и оказанных услуг "вешаются" триггеры (на вставку, изменение, удаление), которые делает всю необходимую работу по корректировке баланса... И при чем тут ненадежность? Все достаточно надежно: пока триггер не выполнится - запись не изменится...
...
Рейтинг: 0 / 0
Баланс абонента, как правильно организовать?
    #35553715
CrvikВсем привет!
Не могу определиться как правильно спроектировать БД что бы правильно и быстро работало, вообщем, для примера, есть 3 таблицы:
Код: plaintext
1.
2.
3.
Абоненты (id, name)
Платежи (id, abonent_id, date_payment, summa)
Пополнение счета(id, abonent_id, date_fill, summa)

При пополнении счета происходит запись в таблицу пополнений, кто, когда и сколько пополнил, при оплате услуг в таблицу платежей записывается кто, когда и сколько заплатил, теперь нужно узнать текущий баланс абонента, сколько у него осталось на текущий момент, есть два способа которые у меня крутятся в голове:
1. В таблицу абонентов добавить поле ТекущийБаланс, при пополнении и при оплате менять значение этого поля в ту или иную сторону;
2. Вычислять разницу между таблицами пополнений и платежей, выполняя запрос к этим таблицам

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

Может у кого нибудь есть другой вариант получения текущего баланса?
Продолжаю задавать вопросы.
Какой сервер Вы будете использовать. И что значит "Очень много записей"? Тысячи? Миллионы? Миллиарды?
Для "нормальных" серверов (MS SQL Server, Oracle...) миллион записей не приводит к большим "зависаниям"...
Кроме того, Вы можете написать необходимые хранимые процедуры. Это еще слегка уменьшит время, так как хранимая процедура лежит на сервере в скомпилированном виде и не нуждается в дополнительной обработке, в отличие от SQL-команды...
...
Рейтинг: 0 / 0
Баланс абонента, как правильно организовать?
    #35553725
IT-Shaman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Согласен. Написать триггер, который будет апдейтить текущий остаток.
можно дополнительно для контроля сделать процедуру, которая, скажем раз в месяц, сверяет текущий остаток с суммой всех движений по счету.
...
Рейтинг: 0 / 0
Баланс абонента, как правильно организовать?
    #35553732
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Станислав С...кийКроме того, Вы можете написать необходимые хранимые процедуры. Это еще слегка уменьшит время, так как хранимая процедура лежит на сервере в скомпилированном виде и не нуждается в дополнительной обработке, в отличие от SQL-команды...Это спорное утверждение, особенно как универсальное.
Особенно при упоминании Oracle.
...
Рейтинг: 0 / 0
Баланс абонента, как правильно организовать?
    #35553761
Bely
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IT-ShamanСогласен. Написать триггер, который будет апдейтить текущий остаток.Если на систему будет большая нагрузка (одновременно проводящиеся транзакции), то триггера могут оказаться не лучшим решением.
Просто потому, что они понизят пропускную способность системы.
...
Рейтинг: 0 / 0
Баланс абонента, как правильно организовать?
    #35553847
Crvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сервер: Windows 2003 Server, MSSQL 2005, ASP.Net2.0

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

Спасибо всем за советы.
...
Рейтинг: 0 / 0
Баланс абонента, как правильно организовать?
    #35553895
Фотография shelsoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторПлатежи (id, abonent_id, date_payment, summa)
Пополнение счета(id, abonent_id, date_fill, summa)
1) Одну таблицу в ж ...
2) Вводим поле тип операции
3) Вспоминаем что есть отрицательные числа Ostatok = StartOstatok + Sum(Summa)
4) Можно конечно и триггера повесить


______________________________________________________
Давайте считать обступившее нас со всех строн коричневое море шоколадным
...
Рейтинг: 0 / 0
Баланс абонента, как правильно организовать?
    #35553970
Crvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
shelsoft авторПлатежи (id, abonent_id, date_payment, summa)
Пополнение счета(id, abonent_id, date_fill, summa)
1) Одну таблицу в ж ...
2) Вводим поле тип операции
3) Вспоминаем что есть отрицательные числа Ostatok = StartOstatok + Sum(Summa)
4) Можно конечно и триггера повесить




Я приводил таблицы для примера, в реале они содержат больше полей чем я тут указал, тем самым я не могу смешивать информацию в одну таблицу.
...
Рейтинг: 0 / 0
Баланс абонента, как правильно организовать?
    #35554536
IT-Shaman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Bely IT-ShamanСогласен. Написать триггер, который будет апдейтить текущий остаток.Если на систему будет большая нагрузка (одновременно проводящиеся транзакции), то триггера могут оказаться не лучшим решением.
Просто потому, что они понизят пропускную способность системы.
Это понятно. поэтому лучше автору вопроса самому определить способ решения. возможно сделать не через триггеры, а запускать с некоторой регулярностью процедуру, которая будет вычислять текущий остаток (раз в час, в день и т.п.). Должен быть компромисс между актуальностью информации и нагрузки на сервер.
...
Рейтинг: 0 / 0
Баланс абонента, как правильно организовать?
    #35559053
Николай1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
CrvikСервер: Windows 2003 Server, MSSQL 2005, ASP.Net2.0

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

Спасибо всем за советы.

Обычно делают отдельную таблица с балансами и делают в ней разрезы по датам.
Типа того
Балансы (Абонент, Дата, Баланс).

Способ разреза по датам зависит от длительности минимального отчетного периода. Если период
день - то и минимальный шаг - день. Если месяц - то месяц.

Создавать записи в таблице нужно только при совершении движения. Для быстрого поиска предыдущего движения хранить его дату, типа такого:

Балансы (Абонент, Дата, Баланс, Дата последнего движения).

Если предполагается большое количество движений за период, то сохраняют еще сумму приходов и расходов (оборотов дебета-кредита):

Балансы (Абонент, Дата, Баланс, Приход, Расход, Дата последнего движения).

Записи в таблице баланс можно обновлять как в реальном режиме, так и при закрытии периода. Зависит от объема данных и соотношения (изменения баланса / запрос данных баланса). Если объемы большие и значение большое, то лучше делать пересчет баланса при закрытии периода. Если значение отношения маленькое, то лучше делать пересчет в реальном режиме.
Если объемы данных маленькие, то реализация проще для пересчета баланса в реальном режиме.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Баланс абонента, как правильно организовать?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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