Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как правильно хранить биллинговую информацию / 25 сообщений из 46, страница 1 из 2
17.01.2021, 19:20
    #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
17.01.2021, 21:19
    #40036652
SERG1257
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно хранить биллинговую информацию
Я бы залил все "как есть" в одну секционированную колумнсторе таблицу.
Быстро дешево и сердито в качестве MVP
Включил бы QueryStore чтобы смотреть какие запросы идут.
...
Рейтинг: 0 / 0
17.01.2021, 21:34
    #40036653
Alex_Toms
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно хранить биллинговую информацию
Приходилось работать с биллингом.
В таблице вызовов, номера абонентов были в текстовом поле.
Номера вызовов от коммутатора приходили например как +7ХХХХХХХХХХ или 8107ХХХХХХХХХХ.
В этом случае в справочник абонентов уже придётся заносить в два раза больше номеров.
Не знаю как у вас, а вот префиксы часто поступали не в таком "чистом" виде.
С большим количеством вызовов, хранить за месяц в одной таблице или использовать секционированную таблицу.
Можно раскидать по разным носителям.
...
Рейтинг: 0 / 0
17.01.2021, 22:07
    #40036656
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно хранить биллинговую информацию
Sandist,

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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


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

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

За оформление ответа сильно не бейте, есть срочная работа, отвечаю как можно быстрее.
...
Рейтинг: 0 / 0
18.01.2021, 16:12
    #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
18.01.2021, 16:29
    #40036854
Alex_Toms
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно хранить биллинговую информацию
спасибо всем за помощь
я тоже пришел к тому что буду хранить номер телефона в том формате в котором он приходит
+ в поле буду хранить код
+ регион
+ страна

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


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

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

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


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

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

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

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

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

после сохранения всех строк как есть и добавления нумератора строк Вы получаете карт-бланш, можете создать вторую таблицу, связанную с первой номером строки, в которой хранить нормализованные данные и прочие вспомогательные, которые потребуются для каждой записи из "сырой" таблицы.
...
Рейтинг: 0 / 0
18.01.2021, 18:44
    #40036913
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как правильно хранить биллинговую информацию
Sandist
разве если указать поле varchar (100) место резервироваться сразу под 100 символов не будет?
Не будет, только слишком большая строка запрещена к индексированию, так что varchar(1000) тоже не надо.
varchar (100) в самый раз.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Как правильно хранить биллинговую информацию / 25 сообщений из 46, страница 1 из 2
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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