powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как правильно хранить биллинговую информацию
46 сообщений из 46, показаны все 2 страниц
Как правильно хранить биллинговую информацию
    #40036622
Sandist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем привет, есть один вопрос связанный с проектированием таблицы под биллинговую информацию, перед тем как реализовать решил дополнительно узнать мнение форумчан

Дано:
Есть некая биллинговая информация хранящаяся в формате xls и xlsx, которую я планирую заливать в скуль. На тек момент информации около 2-3 миллиарда записей, информация будет статична, менять ее никто не будет, но будут запросы к ней, аналитика и отчеты. Вообще по хорошему это идеальный (как по книжке) вариант DWH о котором я мало что знаю. Но тем не менее поделюсь своим делитатнтским мнением и надеюсь на ваши уточнения и помощь.
Из полей:
Дата+время на начало коммуникации
Дата+время на конец коммуникации
Длительность соеднинения
Номер телефона абонента
Номер телефона собеседника
Базовая станция (LAC, CID) абонента на начало коммуникации
Базовая станция (LAC, CID) абонента на конец коммуникации
Базовая станция (LAC, CID) собеседника на начало коммуникации
Базовая станция (LAC, CID) собеседника на конец коммуникации
Хранение:
Все данные разбиты по папкам (название папки - это ориентир для разделения) и хранятся в формате EXCEL
Особенности:
Данные заливаются в одно и то же время за раз около 1 миллиона соединений (на это время система недоступна)
Номер телефона может быть текстовым (internet, gritmer, xbtr...) и может превышать 11 символов (например звонок из других стран)
В основном поиск будет осуществляться по лаку и сиду, по местоположению (долгота и широта), номеру телефона

Что думаю Делать:
1. Справочник Папок (id, название папки)
2. Справочник Базовых станций (id, LAC, CID, широта, долгота, азимут, мощность, ожидаемая дальность)
3. Справочник номеров телефонов (id, номер телефона)
4. Основная таблица (id папки, ДатаВремяНачала, ДатаВремяКонца, длительность(в секундах smallint), id номера абонента, id номера собеседника, id базовых станций)

Основной вопрос заключается в этих самых справочниках, и в типах данных хранения. Заливаем данные 1 раз а читаем часто, стоит ли выносить хранение данные в отдельные справочники (особенно номер телефона) или же лучше денормализовать и залить все данные в одну таблицу сразу? Много ли потеряю при джоинах (если правильно foreign key настроить ключи и индексы)?
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036652
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я бы залил все "как есть" в одну секционированную колумнсторе таблицу.
Быстро дешево и сердито в качестве MVP
Включил бы QueryStore чтобы смотреть какие запросы идут.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036653
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приходилось работать с биллингом.
В таблице вызовов, номера абонентов были в текстовом поле.
Номера вызовов от коммутатора приходили например как +7ХХХХХХХХХХ или 8107ХХХХХХХХХХ.
В этом случае в справочник абонентов уже придётся заносить в два раза больше номеров.
Не знаю как у вас, а вот префиксы часто поступали не в таком "чистом" виде.
С большим количеством вызовов, хранить за месяц в одной таблице или использовать секционированную таблицу.
Можно раскидать по разным носителям.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036656
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandist,

храните как есть, справочники никак Вам не помогут в скорости доступа к данным.
Данные желательно разбить на месячные секции по дате начала соединения. Разбиение необходимо для того, чтобы не поддерживать большое количество индексов (и выделять место для их хранения), выборки биллинговых данных, как правило, охватывают конкретно указанный месяц. Введите нумерацию строк, создайте кластерный индекс по этому номеру. Создайте 1-2 дополнительных индекса для наиболее употребимого поиска.

Разбиение на секции также позволить легко перезаливать какой-либо из месяцев использую переключение секций.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036662
Фотография Megabyte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Toms
Приходилось работать с биллингом.
В таблице вызовов, номера абонентов были в текстовом поле.
Номера вызовов от коммутатора приходили например как +7ХХХХХХХХХХ или 8107ХХХХХХХХХХ.
В этом случае в справочник абонентов уже придётся заносить в два раза больше номеров.
Не знаю как у вас, а вот префиксы часто поступали не в таком "чистом" виде.
Можно раскидать по разным носителям.

Чтобы не было таких вот по-разному написанных одинаковых номеров, надо выделять и хранить 10значный номер, а в отдельном поле можно хранить код страны(лучше в международном формате +7 для РФ).

2ТС: Справочник для номеров вряд ли имеет смысл, т.к. слишком высокий процент уникальности телефонных номеров - кол-во записей вряд ли будет меньше 50% от кол-ва записей данных.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036696
Sandist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Megabyte,

раз все советуют денормализовать, тогда видимо так и нужно поступить
тогда посоветуйте пожалуйста как правильно хранить номер телефона?
хранить префикс страны отдельно - зачем? какая в этом польза?
сколько символов нужно для хранения номера телефона и префикса (если все же он нужен)
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036711
Фотография Megabyte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandist
Megabyte,
тогда посоветуйте пожалуйста как правильно хранить номер телефона?
хранить префикс страны отдельно - зачем? какая в этом польза?
сколько символов нужно для хранения номера телефона и префикса (если все же он нужен)

Я же написал, именно номер телефона 10значный. Остальное кол-во символов - это привязка к стране, у каждой страны по-разному(пример: +7, 8 - РФ, +38 - Украина, в Индии вроде +91). Больше 3х символов не знаю используется ли.
Можно вообще код не хранить, а ссылку на страну, на случай, если нужно будет делать какие-то расчеты в разрезе региона.
Но вдруг надо будет выдавать номер с кодом - т.е. полную версию...
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036731
Sandist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Megabyte,
да, идею я понял
не понял только почему эти же 3 или более символов нельзя добавить к номеру телефона и искать сразу по одному полю, а не по двум в запросах? в чем ускорение или экономия?
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036739
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Megabyte
Sandist
Megabyte,
тогда посоветуйте пожалуйста как правильно хранить номер телефона?
хранить префикс страны отдельно - зачем? какая в этом польза?
сколько символов нужно для хранения номера телефона и префикса (если все же он нужен)

Я же написал, именно номер телефона 10значный. Остальное кол-во символов - это привязка к стране, у каждой страны по-разному(пример: +7, 8 - РФ, +38 - Украина, в Индии вроде +91). Больше 3х символов не знаю используется ли.
Можно вообще код не хранить, а ссылку на страну, на случай, если нужно будет делать какие-то расчеты в разрезе региона.
Но вдруг надо будет выдавать номер с кодом - т.е. полную версию...
Номер может быть больше 10 символов, например, Великобритания, Китай.
Код страны, конечно, можно выделить, но, наверное, это нужно делать, если этого хочет бизнес. Так же, как и остальные компоненты номера. Потому что лишняя функциональность чревата ошибками, придётся исправлять код, соответственно, в случае разделения его нельзя использовать в качестве ключа.

ИМХО лучше хранить нормализованный код, который используется в телефонных сетях, без всяких "разделений".
По стандарту E.164 (рекомендация ITU-T) нормализованный номер имеет размер 15 символов, но оборудование (насколько я знаю) рассчитано на 18.
Вот я бы так и делал.
Да, и ещё, иногда в номер могут включаться внутренние номера, так что, возможно, нужен ещё запас.

Полезное:
Habr: Заблуждения программистов о телефонных номерах
Wiki: Телефонный номер
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036760
Фотография SIMPLicity_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Toms
Приходилось работать с биллингом.
В таблице вызовов, номера абонентов были в текстовом поле.
Номера вызовов от коммутатора приходили например как +7ХХХХХХХХХХ или 8107ХХХХХХХХХХ.
В этом случае в справочник абонентов уже придётся заносить в два раза больше номеров.
Не знаю как у вас, а вот префиксы часто поступали не в таком "чистом" виде.
С большим количеством вызовов, хранить за месяц в одной таблице или использовать секционированную таблицу.
Можно раскидать по разным носителям.


Номера идентифицировать с конца не получалось?
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036787
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Биллингом занимался давно, попробую вспомнить.
Как уже отмечал, не всегда с коммутатора поступает корректный номер,
поэтому и префиксы не всегда удавалось правильно отрезать.
Далее если не путаю, в номерах кажется могли быть ещё и добавочные цифры.
Так что справа точно не отрежешь, особенно из номеров из-за бугра.

Как вариант:
Использовал справочник номерной ёмкости, например отсюда.
https://www.mtt.ru/pomosh-i-podderzhka/defcodes/

Справочник номерной ёмкости со временем пополняется, добавлял новые диапазоны в свою таблицу.

Например, вызов 9029150099 в диапазоне 9029150000-9029159999
902
9150000-9159999

Оператор: Норильск Красноярский край ЗАО "Енисейтелеком"

От номера отрезал префикс, таблица префиксов достаточно статична.
Далее искал оператора.
Правую часть искал в таблице с номерной ёмкостью, например по совпадению от 9029150000 до 9029159999.
Лишние символы 111 в 9029159999111 не мешали, найденный номер без префикса: 9029159999.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036809
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Toms
Как вариант:
Использовал справочник номерной ёмкости, например отсюда.
https://www.mtt.ru/pomosh-i-podderzhka/defcodes/
Там даже 495 нету, не говоря уже о каком ни будь условном зимбабвийском урюпинске :-)

И главное, смысл в чём, зачем этот справочник для задачи автора?
Sandist
В основном поиск будет осуществляться по лаку и сиду, по местоположению (долгота и широта), номеру телефона
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036813
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я дал пример номерной ёмкости Российских сотовых операторов связи, DEF.
А 495 это из справочника фиксированных Российских операторов связи ABC.

Есть справочники ABC и DEF иностранных операторов связи.

Очень кратко из интернета:

Номера с кодом ABC
ABC — это наименование кодов, которые имеют четкую привязку по географическому использованию. Такие телефоны называют городскими или стационарными, а подключение на них производят и мобильные операторы.

Номера с кодом DEF
Номерная емкость операторов сотовой связи России имеет отличную структуру от кода городской нумерации. Здесь нет четкой привязки кода к городу, области, или целого региона.

Коды, которые не имеют четкой географической привязки, называются DEF. Так же как и с городскими кодами, один сотовый семизначный номер может принадлежать нескольким операторам. Каждый из них может использовать такие номера в разных кодах и в разных регионах.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036818
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используя номерную ёмкость, можно узнать номер абонента, пример приводил.
Мне для работы, номер абонента интереса не представлял, это я для Sandist.
Меня интересовала тарификация вызова, а для этого необходимо знать оператора связи, либо регион, либо страну абонента.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036822
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Toms
Я дал пример номерной ёмкости Российских сотовых операторов связи, DEF.
А 495 это из справочника фиксированных Российских операторов связи ABC.

Есть справочники ABC и DEF иностранных операторов связи.
Да, отсюда я делаю вывод, что невозможно корректно определить ABC и DEF коды, правильно? То есть всё равно будут пробелы, записи с кодом NULL.

Даже для корректной поддержки кода страны придётся нагородить какой то дорогой (в разработке и эксплуатации) ужас
С учётом того, что у страны может быть много кодов, что у нескольких стран могут быть одинаковые коды.
И как вишенка на торте, всё это работать будет по временнЫм срезам, то есть корректное определение номера делается на момент его возникновения, с существующим тогда номерным планом, то есть один и тот же номер может в разное время относиться к разным странам (и, само собой, к разным городам, операторам и т.д.).

Моё мнение - нужно хранить:
а) номер из источника "как есть"
б) нормализованный номер
в) прочие атрибуты номера, такие как страны, операторы, населённые пункты, другие признаки, которые можно выудить из номера и справочников номерной ёмкости, но опционально, в nullable полях. "Накопали что смогли, без претензий". В том числе хранить "сам номер" тоже как опциональный nullable атрибут. (Разумеется, опциональные атрибуты нужно хранить, только если есть такое бизнес-требование, а не просто так)
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036824
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Также зная оператора связи можно собрать статистику по вызовам, трафику, начислениям или затрата по операторам, регионам, странам и т.д.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036828
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, отсюда я делаю вывод, что невозможно корректно определить ABC и DEF коды, правильно? То есть всё равно будут пробелы, записи с кодом NULL.

У вызовов типа 001, 01 или 9567 конечно определить префикс невозможно, его в номере просто нет. Это местный вызов, не припомню случая чтобы было другое, например межгород.


Даже для корректной поддержки кода страны придётся нагородить какой то дорогой (в разработке и эксплуатации) ужас
С учётом того, что у страны может быть много кодов, что у нескольких стран могут быть одинаковые коды.
И как вишенка на торте, всё это работать будет по временнЫм срезам, то есть корректное определение номера делается на момент его возникновения, с существующим тогда номерным планом, то есть один и тот же номер может в разное время относиться к разным странам (и, само собой, к разным городам, операторам и т.д.).

"у нескольких стран могут быть одинаковые коды"-ЭТО ИСКЛЮЧЕНО!!!
Номер всегда в одной стране!


Моё мнение - нужно хранить:
а) номер из источника "как есть"
б) нормализованный номер
в) прочие атрибуты номера, такие как страны, операторы, населённые пункты, другие признаки, которые можно выудить из номера и справочников номерной ёмкости, но опционально, в nullable полях. "Накопали что смогли, без претензий". В том числе хранить "сам номер" тоже как опциональный nullable атрибут. (Разумеется, опциональные атрибуты нужно хранить, только если есть такое бизнес-требование, а не просто так)

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

За оформление ответа сильно не бейте, есть срочная работа, отвечаю как можно быстрее.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036847
Sandist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Toms,

спасибо всем за помощь
я тоже пришел к тому что буду хранить номер телефона в том формате в котором он приходит
+ в поле буду хранить код
+ регион
+ страна

то есть у меня всегда будет заполнен номер телефона а вот код, регион и стана могут не распознаваться
отсюда есть вопрос как думаете сколько символов достаточно для номера телефона? для 2-3 миллиардов в моем случае даже 1 символ будет много играть (пространство имею ввиду). Я прочитал что 18 символов должно хватить, но вот мне что-то подсказывает, что это избыточно

Ниже аналогичный вопрос на stackoverrun
https://stackoverrun.com/ru/q/117000
авторAssuming you don't store things like the '+', '()', '-', spaces and what-have-yous (and why would you, they are presentational concerns which would vary based on local customs and the network distributions anyways), the ITU-T recommendation E.164 for the international telephone network (which most national networks are connected via) specifies that the entire number (including country code, but not including prefixes such as the international calling prefix necessary for dialling out, which varies from country to country, nor including suffixes, such as PBX extension numbers) be at most 15 characters.

Call prefixes depend on the caller, not the callee, and thus shouldn't (in many circumstances) be stored with a phone number. If the database stores data for a personal address book (in which case storing the international call prefix makes sense), the longest international prefixes you'd have to deal with (according to Wikipedia) are currently 5 digits, in Finland.

As for suffixes, some PBXs support up to 11 digit extensions (again, according to Wikipedia). Since PBX extension numbers are part of a different dialing plan (PBXs are separate from phone companies' exchanges), extension numbers need to be distinguishable from phone numbers, either with a separator character or by storing them in a different column.


Я вот думаю, может достаточно 15 символов, а если будут префиксы типа 0880 или подобное, то они поместятся для Российских номеров, а если и нет, то это в районе погрешности, думаю таких будет оч оч мало.

Как думаете 15 достаточно с учетом того, что я убираю все символы '+', '()', '-' и пробелы?
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036854
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо всем за помощь
я тоже пришел к тому что буду хранить номер телефона в том формате в котором он приходит
+ в поле буду хранить код
+ регион
+ страна

Достаточно одного поля, ссылку на справочник оператора связи.
А уж там поля: страна, регион, город.
В запросе join с таблицей вызовов.
Если всё это запихнуть в вызовы, таблица очень сильно разбухнет!


то есть у меня всегда будет заполнен номер телефона а вот код, регион и стана могут не распознаваться
отсюда есть вопрос как думаете сколько символов достаточно для номера телефона? для 2-3 миллиардов в моем случае даже 1 символ будет много играть (пространство имею ввиду). Я прочитал что 18 символов должно хватить, но вот мне что-то подсказывает, что это избыточно

Я вот думаю, может достаточно 15 символов, а если будут префиксы типа 0880 или подобное, то они поместятся для Российских номеров, а если и нет, то это в районе погрешности, думаю таких будет оч оч мало.

Как думаете 15 достаточно с учетом того, что я убираю все символы '+', '()', '-' и пробелы?


Для номера абонента, поле varchar, сколько размер не скажу, просто не помню.
Если даже объявить поле как varchar(1000), а номер 9 символов, то занимать будет 9 байт.
Конечно поле с такое максимальной длиной не стоит, это я для примера объёма хранения данных.
Самое главное размер должен позволять хранить самый длинный номер.
Практика показывает, номер хранить стоит как поступает с коммутатора не преобразовывая.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036861
Фотография Megabyte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandist
Megabyte,
да, идею я понял
не понял только почему эти же 3 или более символов нельзя добавить к номеру телефона и искать сразу по одному полю, а не по двум в запросах? в чем ускорение или экономия?

Я не знаю, как у вас будет выглядеть исходная информация, но нам операторы присылают данные в виде: 8ХХХХХХХХХХ, 7ХХХХХХХХХХ, +7ХХХХХХХХХХ. Соответственно если хранить в базовом виде и по нему же делать аналитику в разрезе номера, то это будут разные номера. Поэтому желательно иметь номер отдельно от кода страны, можно в качестве отдельного поля, помимо исходной информации.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036872
Sandist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Toms,

разве если указать поле varchar (100) место резервироваться сразу под 100 символов не будет?
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036874
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandist
Alex_Toms,

разве если указать поле varchar (100) место резервироваться сразу под 100 символов не будет?

нет.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036879
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Занимать место не будет.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036911
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandist,

после сохранения всех строк как есть и добавления нумератора строк Вы получаете карт-бланш, можете создать вторую таблицу, связанную с первой номером строки, в которой хранить нормализованные данные и прочие вспомогательные, которые потребуются для каждой записи из "сырой" таблицы.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036913
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandist
разве если указать поле varchar (100) место резервироваться сразу под 100 символов не будет?
Не будет, только слишком большая строка запрещена к индексированию, так что varchar(1000) тоже не надо.
varchar (100) в самый раз.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40036935
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
varchar(100) тоже много.

Посмотрел номера контактов на сайте Oracle
У Греции номера 15 символов, скорее всего должно хватить длины 20-25символов.
Greece +30.210.67.89.450 +30 210 678 9215
Hungary +36.1.2241800 3618017722
Israel +972.3.9273677 +44.207.1312.982
Italy +39.06.52436.400 39 028 733 5050
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40037007
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Toms
varchar(100) тоже много.

Посмотрел номера контактов на сайте Oracle
У Греции номера 15 символов, скорее всего должно хватить длины 20-25символов.
Greece +30.210.67.89.450 +30 210 678 9215
Лучше смотреть на сайтах, относящихся к телефонии, а не к базам данных :-)

У Греции 12 символов, но да, по стандартам может быть до 15.
Только не забывайте, что в номер могут добавляться дополнительные локальные расширения, т.е. внутренний номер компании может быть частью "полного" номера.

В принципе коммутаторы рассчитаны на 18, так что можно ограничиться varchar(18).
Единственно, непонятно, какой профит, сколько рублей, получит бизнес, если выберет 18 вместо 100 :-)
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40037018
Sandist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо большое, тогда соответственно сделаю varchar(100) - на всякий глянул статью по производительности разных длин при сортировке, кому интересно "https://habr.com/ru/post/489182/"

еще может кто помочь правильно определять префикс (чтобы можно было по нему корректно определить страну , регион и оператора)
может у кого уже есть наработка, не совсем понимаю как в таком разнообразии (куче) различных вариантов определить правильно эти данные
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40037019
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не помню какой был размер этого поля в таблице, давно не работаю с биллингом.
Номера на сайте привёл для ориентира.
Руководствоваться нужно согласно документации по связи, а не то что разместят на сайтах.
Про дополнительные символы в номерах я уже упоминал, они бывают и их тоже приходилось учитывать.
А 18 вместо 100, это чисто от разработчика. Не делай лишний размер поля если в этом нет необходимости.
Деньги здесь не причём.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40037028
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как я определял оператора.

Приходили номера например
+79029159999, 89029159999 или 81079029159999.
Отсекал префикс, приводил к одному виду кажется к такому 79029159999.
Исходный номер не трогал, это только в расчётах.
Далее для приводимого примера

Для диапазона 9029150000-9029159999 в систему заносил 7902915.
Далее проверял запросом
select *
from (
select '79029159999' P
) T
where P like '7902915%'

Поле P из таблицы вызовов, а 7902915 из таблицы номерной ёмкости.

Работает достаточно быстро, за раз обрабатывает все записи.
При обработке отсекаем обработанные записи.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40037091
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandist
еще может кто помочь правильно определять префикс (чтобы можно было по нему корректно определить страну , регион и оператора)
может у кого уже есть наработка, не совсем понимаю как в таком разнообразии (куче) различных вариантов определить правильно эти данные
Всё делается лайком по справочнику, как написал Alex_Toms
Единственно добавлю, что справочников должно быть несколько, отдельно для стран, регионов, операторов, т.к. для страны вы можете получить правильные данные почти гарантированно, стран же немного, а вот для остального получится уже не так точно.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40037097
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Sandist
еще может кто помочь правильно определять префикс (чтобы можно было по нему корректно определить страну , регион и оператора)
может у кого уже есть наработка, не совсем понимаю как в таком разнообразии (куче) различных вариантов определить правильно эти данные
Всё делается лайком по справочнику, как написал Alex_Toms
Единственно добавлю, что справочников должно быть несколько, отдельно для стран, регионов, операторов, т.к. для страны вы можете получить правильные данные почти гарантированно, стран же немного, а вот для остального получится уже не так точно.
Ещё удобно вместо разных справочников делать перекрывающиеся шаблоны, и выбирать TOP 1 по максимальной длинне найденного шаблона.

Например, для номера 74953631234 будут найдены шаблоны:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select *, row_number() over(partition by Num.P order by len(Templ.P) desc) as row
from (
    select '74953631234' P
    union all
    select '79161234567' P
) Num
    join (
        select '7%' P, 'Россия' Descr
        union all
        select '7495%' P, 'Москва, оператор фиксированной связи МГТС'
        union all
        select '7495363%' P, 'Москва, оператор сотовой связи MTS'
        union all
        select '7916%' P, 'Москва, оператор сотовой связи MTS'
    ) Templ
        on Num.P like Templ.P
order by Num.P, row
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40037104
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хватит одного справочника, проверено на практике.
Надеюсь к вечеру немного освобожусь, поищу прежние наработки, вспомню подробнее как делал.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40037109
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sandist,

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

Например,
499001
49901
4991
499

Второй способ - написать CLR функцию, в которую загрузите справочники направлений и будете парсить уже каждую строку таблицы, т.е. таблица будет обработана за один проход. Функция внутри себя будет подбирать коды также в порядке убывания длины.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40037115
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Именно так я и делал.
Сначала обрабатывал с максимальной длиной из справочника, у вас в примере 11.
Далее с длиной 10, 9 и так далее до 1.
Порядок должен быть такой, а не наоборот.
Всего максимум 11 запросов update.
При обработке исключал обработанные записи.
Перед запросом update проверял, есть ли не обработанные записи, если нет, то заканчивал обработку.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40037127
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
выполнять парсинг номеров по получившемуся справочнику, по одному проходу на каждую длину. Это достаточно быстрый способ, получается не более 11 проходов по таблице.
А чем хуже одним запросом, без "проходов"?
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40037128
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пока занят, потом отвечу...
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40037207
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

Быстрее получалось, не требуется сортировка, например. Но при условии, что памяти достаточно для буферизации необходимой части данных.
Реально не 11 проходов, а меньше.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40037230
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
Быстрее получалось, не требуется сортировка, например.
Вы же пишите, что
Владислав Колосов
выстроить коды в порядке убывания по длине и выполнять парсинг номеров по получившемуся справочнику, по одному проходу на каждую длину.
Выстроить и есть сортировка, разве нет?
Правда, тут будет только сортировка справочника, а не всего набора.

В общем, интересно было бы сравнить.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40037235
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Правда, тут будет только сортировка справочника, а не всего набора.
Кстати, сервер тоже может делать не сортировку, а цикл, а внутри сканы справочника. Если это выгоднее. Притом можно сделать кластерный индекс по длине.
Т.е. по сути можно этот алгоритм "выстроить коды в порядке убывания по длине и выполнять парсинг номеров по получившемуся справочнику, по одному проходу на каждую длину." написать одним запросом:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
create table Template(P varchar(100), Descr varchar(100), L int)
create clustered index idx_Template_L on Template(L desc)
insert Template
select *, len(P)
from (
select '7%' P, 'Россия' Descr
union all
select '7495%' P, 'Москва, оператор фиксированной связи МГТС'
union all
select '7495363%' P, 'Москва, оператор сотовой связи MTS'
union all
select '7916%' P, 'Москва, оператор сотовой связи MTS'
) t

create table Num(P varchar(100))
insert Num
select '74951234567' P
union all
select '74953631234' P
union all
select '79161234567' P

select *
from (
    select * from Num
) Num
    cross apply (
        select top 1 * from Template Templ where Num.P like Templ.P  order by Templ.L desc
    ) Templ
order by Templ.L

select *
from (
    select * from Num
) Num
    cross apply (
        select top 1 * from Template Templ where Num.P like Templ.P  order by Templ.L desc
    ) Templ 
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40037245
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

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

В былые времена парсинг кодов направлений ~2млн строк на Pentium3 занимал 2-3 минуты.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40037250
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Владислав Колосов
В порядке убывания, верно, но... для курсора или цикла. сортировка справочника выполняется один раз, затем во временную таблицу алгоритм отбирает значение, соответствующие длине строки текущей итерации и ищет LIKE совпадения для update.
Так и в моём запросе точно так же, план же есть.
Сортировка только один раз, при наполнении справочника.
А потом тоже без сортировки "ищет LIKE совпадения", только без "во временную таблицу".
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40037273
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Сортировка только один раз, при наполнении справочника.
А потом тоже без сортировки "ищет LIKE совпадения", только без "во временную таблицу".
Подумалось, а если сделать секционирование по длине, не будет ли параллельного поиска в справочнике? :-)
Или, как вариант, сделать 11 справочников, и искать с union all
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40037284
Alex_Toms
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Или, как вариант, сделать 11 справочников, и искать с union all
Что из одного справочника 11 запросов с разной длиной и с union all или из 11 справочников с union all те же 11 запросов.

А зачем вообще с union all?
В таблице вызовов сделать числовое поле, ссылку на справочник кодов, default(0).
А далее апдейтил это поле для кодов с максимальной длиной из справочника, у вас в примере 11.
Далее с длиной 10, 9 и так далее до 1.
При каждом проходе записей с 0 в этом поле становилось всё меньше.
При наличии в справочнике всех кодов с 0 их не будет.
Всего максимум 11 запросов update.
При обработке исключал обработанные записи.
Перед запросом update проверял, есть ли не обработанные записи, если нет, то заканчивал обработку.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40037298
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

не буду спорить, в те времена cross apply еще не было.
...
Рейтинг: 0 / 0
Как правильно хранить биллинговую информацию
    #40037377
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Toms
А зачем вообще с union all?
...
При каждом проходе записей с 0 в этом поле становилось всё меньше.
Что бы одним запросом выполнить все 11 проходов, причём что бы они (проходы) выполнялись параллельно.
...
Рейтинг: 0 / 0
46 сообщений из 46, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как правильно хранить биллинговую информацию
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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