|
|
|
Баланс абонента, как правильно организовать?
|
|||
|---|---|---|---|
|
#18+
Всем привет! Не могу определиться как правильно спроектировать БД что бы правильно и быстро работало, вообщем, для примера, есть 3 таблицы: Код: plaintext 1. 2. 3. При пополнении счета происходит запись в таблицу пополнений, кто, когда и сколько пополнил, при оплате услуг в таблицу платежей записывается кто, когда и сколько заплатил, теперь нужно узнать текущий баланс абонента, сколько у него осталось на текущий момент, есть два способа которые у меня крутятся в голове: 1. В таблицу абонентов добавить поле ТекущийБаланс, при пополнении и при оплате менять значение этого поля в ту или иную сторону; 2. Вычислять разницу между таблицами пополнений и платежей, выполняя запрос к этим таблицам Первый вариант меня смущает его простотой и ненадежностью Второй вариант, боюсь сильно будет нагружать сервер при запросе к таблицам в которых будет очень много записей. Может у кого нибудь есть другой вариант получения текущего баланса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2008, 10:31 |
|
||
|
Баланс абонента, как правильно организовать?
|
|||
|---|---|---|---|
|
#18+
CrvikВсем привет! Не могу определиться как правильно спроектировать БД что бы правильно и быстро работало, вообщем, для примера, есть 3 таблицы: Код: plaintext 1. 2. 3. При пополнении счета происходит запись в таблицу пополнений, кто, когда и сколько пополнил, при оплате услуг в таблицу платежей записывается кто, когда и сколько заплатил, теперь нужно узнать текущий баланс абонента, сколько у него осталось на текущий момент, есть два способа которые у меня крутятся в голове: 1. В таблицу абонентов добавить поле ТекущийБаланс, при пополнении и при оплате менять значение этого поля в ту или иную сторону; 2. Вычислять разницу между таблицами пополнений и платежей, выполняя запрос к этим таблицам Первый вариант меня смущает его простотой и ненадежностью Второй вариант, боюсь сильно будет нагружать сервер при запросе к таблицам в которых будет очень много записей. Может у кого нибудь есть другой вариант получения текущего баланса? Объясните мне, глупому, в чем разница между платежами и пополнением счета? Разве пополнение счета не есть платеж? И какой баланс Вы хотите из этих таблиц вывести? ИМХО, Вам надо произнести вслух правило формирования баланса / написать формулу, по которой нужно будет расчитать значение. Тогда меньше будет "каши"... ИМХО, должно быть нечто следующее: - таблица абонентов - таблица оказанных абоненту услуг (таблица учета разговоров абонента) = сумма снимается со счета - таблица проведенных платежей по услугам = сумма добавляется на счет В Вашем первом варианте ничего "позорного" нет. Просто на таблицы платежей и оказанных услуг "вешаются" триггеры (на вставку, изменение, удаление), которые делает всю необходимую работу по корректировке баланса... И при чем тут ненадежность? Все достаточно надежно: пока триггер не выполнится - запись не изменится... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2008, 10:51 |
|
||
|
Баланс абонента, как правильно организовать?
|
|||
|---|---|---|---|
|
#18+
CrvikВсем привет! Не могу определиться как правильно спроектировать БД что бы правильно и быстро работало, вообщем, для примера, есть 3 таблицы: Код: plaintext 1. 2. 3. При пополнении счета происходит запись в таблицу пополнений, кто, когда и сколько пополнил, при оплате услуг в таблицу платежей записывается кто, когда и сколько заплатил, теперь нужно узнать текущий баланс абонента, сколько у него осталось на текущий момент, есть два способа которые у меня крутятся в голове: 1. В таблицу абонентов добавить поле ТекущийБаланс, при пополнении и при оплате менять значение этого поля в ту или иную сторону; 2. Вычислять разницу между таблицами пополнений и платежей, выполняя запрос к этим таблицам Первый вариант меня смущает его простотой и ненадежностью Второй вариант, боюсь сильно будет нагружать сервер при запросе к таблицам в которых будет очень много записей. Может у кого нибудь есть другой вариант получения текущего баланса? Продолжаю задавать вопросы. Какой сервер Вы будете использовать. И что значит "Очень много записей"? Тысячи? Миллионы? Миллиарды? Для "нормальных" серверов (MS SQL Server, Oracle...) миллион записей не приводит к большим "зависаниям"... Кроме того, Вы можете написать необходимые хранимые процедуры. Это еще слегка уменьшит время, так как хранимая процедура лежит на сервере в скомпилированном виде и не нуждается в дополнительной обработке, в отличие от SQL-команды... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2008, 11:01 |
|
||
|
Баланс абонента, как правильно организовать?
|
|||
|---|---|---|---|
|
#18+
Согласен. Написать триггер, который будет апдейтить текущий остаток. можно дополнительно для контроля сделать процедуру, которая, скажем раз в месяц, сверяет текущий остаток с суммой всех движений по счету. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2008, 11:03 |
|
||
|
Баланс абонента, как правильно организовать?
|
|||
|---|---|---|---|
|
#18+
Станислав С...кийКроме того, Вы можете написать необходимые хранимые процедуры. Это еще слегка уменьшит время, так как хранимая процедура лежит на сервере в скомпилированном виде и не нуждается в дополнительной обработке, в отличие от SQL-команды...Это спорное утверждение, особенно как универсальное. Особенно при упоминании Oracle. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2008, 11:05 |
|
||
|
Баланс абонента, как правильно организовать?
|
|||
|---|---|---|---|
|
#18+
IT-ShamanСогласен. Написать триггер, который будет апдейтить текущий остаток.Если на систему будет большая нагрузка (одновременно проводящиеся транзакции), то триггера могут оказаться не лучшим решением. Просто потому, что они понизят пропускную способность системы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2008, 11:11 |
|
||
|
Баланс абонента, как правильно организовать?
|
|||
|---|---|---|---|
|
#18+
Сервер: Windows 2003 Server, MSSQL 2005, ASP.Net2.0 Раз первый вариант имеет место жить, значит буду делать как посоветовал Станислав, пусть тригер следит за актуальным балансом абонента. Спасибо всем за советы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2008, 11:33 |
|
||
|
Баланс абонента, как правильно организовать?
|
|||
|---|---|---|---|
|
#18+
авторПлатежи (id, abonent_id, date_payment, summa) Пополнение счета(id, abonent_id, date_fill, summa) 1) Одну таблицу в ж ... 2) Вводим поле тип операции 3) Вспоминаем что есть отрицательные числа Ostatok = StartOstatok + Sum(Summa) 4) Можно конечно и триггера повесить ______________________________________________________ Давайте считать обступившее нас со всех строн коричневое море шоколадным ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2008, 11:51 |
|
||
|
Баланс абонента, как правильно организовать?
|
|||
|---|---|---|---|
|
#18+
shelsoft авторПлатежи (id, abonent_id, date_payment, summa) Пополнение счета(id, abonent_id, date_fill, summa) 1) Одну таблицу в ж ... 2) Вводим поле тип операции 3) Вспоминаем что есть отрицательные числа Ostatok = StartOstatok + Sum(Summa) 4) Можно конечно и триггера повесить Я приводил таблицы для примера, в реале они содержат больше полей чем я тут указал, тем самым я не могу смешивать информацию в одну таблицу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2008, 12:18 |
|
||
|
Баланс абонента, как правильно организовать?
|
|||
|---|---|---|---|
|
#18+
Bely IT-ShamanСогласен. Написать триггер, который будет апдейтить текущий остаток.Если на систему будет большая нагрузка (одновременно проводящиеся транзакции), то триггера могут оказаться не лучшим решением. Просто потому, что они понизят пропускную способность системы. Это понятно. поэтому лучше автору вопроса самому определить способ решения. возможно сделать не через триггеры, а запускать с некоторой регулярностью процедуру, которая будет вычислять текущий остаток (раз в час, в день и т.п.). Должен быть компромисс между актуальностью информации и нагрузки на сервер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2008, 14:51 |
|
||
|
Баланс абонента, как правильно организовать?
|
|||
|---|---|---|---|
|
#18+
CrvikСервер: Windows 2003 Server, MSSQL 2005, ASP.Net2.0 Раз первый вариант имеет место жить, значит буду делать как посоветовал Станислав, пусть тригер следит за актуальным балансом абонента. Спасибо всем за советы. Обычно делают отдельную таблица с балансами и делают в ней разрезы по датам. Типа того Балансы (Абонент, Дата, Баланс). Способ разреза по датам зависит от длительности минимального отчетного периода. Если период день - то и минимальный шаг - день. Если месяц - то месяц. Создавать записи в таблице нужно только при совершении движения. Для быстрого поиска предыдущего движения хранить его дату, типа такого: Балансы (Абонент, Дата, Баланс, Дата последнего движения). Если предполагается большое количество движений за период, то сохраняют еще сумму приходов и расходов (оборотов дебета-кредита): Балансы (Абонент, Дата, Баланс, Приход, Расход, Дата последнего движения). Записи в таблице баланс можно обновлять как в реальном режиме, так и при закрытии периода. Зависит от объема данных и соотношения (изменения баланса / запрос данных баланса). Если объемы большие и значение большое, то лучше делать пересчет баланса при закрытии периода. Если значение отношения маленькое, то лучше делать пересчет в реальном режиме. Если объемы данных маленькие, то реализация проще для пересчета баланса в реальном режиме. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2008, 12:17 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=98&tid=1543645]: |
0ms |
get settings: |
8ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
89ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
| others: | 233ms |
| total: | 410ms |

| 0 / 0 |
