powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как лучше хранить номер телефона?
25 сообщений из 79, страница 1 из 4
Как лучше хранить номер телефона?
    #32898881
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сабж. Номер телефона может начинаться с одного или нескольких нулей. Разумеется, строковое представление неприемлимо. Мне пришла мысль хранить его в виде нецелого числа, и всю работу приложения строить с такими числами, а только на клиенте преобразовывать в человекочитаемый вид. Какие будут ещё идеи? Решающий фактор - минимальный объём, занимаемый данными, максимальная скорость работы с таким типом данных. Oracle 9
...
Рейтинг: 0 / 0
Как лучше хранить номер телефона?
    #32898890
Фотография Old Nick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как в числовом варианте хранить паузу, например:

8W0951111111
...
Рейтинг: 0 / 0
Как лучше хранить номер телефона?
    #32898895
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пофиг. Это не есть компонента номера телефона. Но сейчас подумал, что номер 10 и номер 100 - не одно и то же. Как бы извернуться? :)
...
Рейтинг: 0 / 0
Как лучше хранить номер телефона?
    #32898906
tru55
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разумеется, строковое представление неприемлимо

А можно объяснить, почему
...
Рейтинг: 0 / 0
Как лучше хранить номер телефона?
    #32898929
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tru55 Разумеется, строковое представление неприемлимо

А можно объяснить, почему

авторфактор - минимальный объём, занимаемый данными, максимальная скорость работы с таким типом данных
билинг скорее всего...а там этих номеров..
...
Рейтинг: 0 / 0
Как лучше хранить номер телефона?
    #32898939
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
целыми хранить количество нулей, или ноль если он один, дробная часть - все остальное...
...
Рейтинг: 0 / 0
Как лучше хранить номер телефона?
    #32898952
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
10 и 100 те же извращения на тему LZW... сначала 0 за ним количество ... максимум получается 9 нулей... думаю хватит..
...
Рейтинг: 0 / 0
Как лучше хранить номер телефона?
    #32898982
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, хорошая мысль, спасибо. В обобщённом виде нужно написать обратимую функцию, преобразующую номер телефона в уникальное число.
Действительно, биллинг. На десятках миллиардов строк даже 1 сэкономленный байт погоду делает :)
...
Рейтинг: 0 / 0
Как лучше хранить номер телефона?
    #32899009
Shev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как генерить отчеты, выгрузки и т.п. Не достанет каждый раз преобразовывать к нормальному виду?

Внутри биллинга я бы хранил справочник телефонов:
код(счетчик);
номер телефона (текстовый)
Сжатый номер (для передачи больших объемов на клиента)

Соответственно все ссылки по коду.
...
Рейтинг: 0 / 0
Как лучше хранить номер телефона?
    #32899024
Фотография ScareCrow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
[quot Scott Tiger]В обобщённом виде нужно написать обратимую функцию, преобразующую номер телефона в уникальное число.
/quot]номер телефона и есть уникальное число... :(
...
Рейтинг: 0 / 0
Как лучше хранить номер телефона?
    #32899422
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Разумеется, строковое представление неприемлимо.

Кем разумеется?

В данном случае - это единственно правильное решение.
...
Рейтинг: 0 / 0
Как лучше хранить номер телефона?
    #32899437
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Номер телефона не есть число, а есть последовательность цифр, в которой позиции в голове и хвосте могут == 0, но при этом быть значащими. Например, телефон 00700. Если предстваить это в виде числа, это будет число 700, а есть такой номер 700, который совсем не то, что 00700 и 0700, например. Ну и т.д.
...
Рейтинг: 0 / 0
Как лучше хранить номер телефона?
    #32899439
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Строковое представление - это 11 байт. Много.
...
Рейтинг: 0 / 0
Как лучше хранить номер телефона?
    #32899463
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мной разумеется. А что?
...
Рейтинг: 0 / 0
Как лучше хранить номер телефона?
    #32899581
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Справочник тоже не есть хорошо. Это потом джойнить голову сломаешь.
...
Рейтинг: 0 / 0
Как лучше хранить номер телефона?
    #32899633
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Мной разумеется.

Печально.

> Строковое представление - это 11 байт. Много.

Почему именно 11 байт? В сравнении с чем много?

Для Вашей задачи хорошее решение одно: таблица телефонных номеров, ссылки на эту таблицу в логах. Все остальные решения - кривые до безобразия.
...
Рейтинг: 0 / 0
Как лучше хранить номер телефона?
    #32899776
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Аргументы будут?

Много в сравнении, например, с числом. 10-значный телефонный номер в числовом представлении занимает 7 байт, а в строковом - 11. Итого - 4 байта оверхед. В таблице, положим, 2 номера - кто звонил и кому. Итого, 8 байт на строку. На 10 миллиардов строк имеем почти 80 гигабайт. Оно мне надо?. Со справочником я уже говорил - джоинить замучаюсь, если потребуется. Да и зачем? Проще и производительнее применить функцию - ни тебе чтений (даже логических), ни конкатенации строк, только raw cpu power :)
...
Рейтинг: 0 / 0
Как лучше хранить номер телефона?
    #32899804
Urri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Беда в том, что есть как телефоны типа 10 и 100, так и типа 02 и 03. ;-)))
А если функции написать, которые из 11^11 (11 символов 0...9 или пусто) конвертят в 255^5 (5 символов binary character, кроме chr(0), например) и обратно? 5 символов хватит при таком раскладе. Правда, все равно не очень быстро, но и не очень медленно ;-)
...
Рейтинг: 0 / 0
Как лучше хранить номер телефона?
    #32899820
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извиняюсь, что пишу на WatcomSQL, так как PL/SQL не сильно знаю, но думаю что по функциональности будет один в один:
Код: plaintext
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.
/* Функция перевода телефона
   в десятичное число */
CREATE FUNCTION _PhoneToBin (
  IN @Phone char( 11 )
)
RETURNS numeric( 13 ,  11 )
BEGIN
  RETURN CONVERT(numeric( 13 ,  11 ), Length(@Phone) || '.' || @Phone);
END;

/* Функция перевода десятичного числа
   в телефон */
CREATE FUNCTION _BinToPhone (
  IN @BinPhone numeric( 13 ,  11 )
)
RETURNS char( 11 )
BEGIN
  RETURN Left((@BinPhone - Truncnum(@BinPhone,  0 )) * 
    Power( 10 , Truncnum(@BinPhone,  0 )), Truncnum(@BinPhone,  0 ));
END;

// Проверяем результат
SELECT _PhoneToBin('0100') AS Phone100, 
       _PhoneToBin('89262500102') AS Phone926, 
       _BinToPhone(Phone100) AS OrigPhone100, 
       _BinToPhone(Phone926) AS OrigPhone926, 
       DataLength(Phone100) AS LenBinPhone100, 
       DataLength(Phone926)  AS LenBinPhone926;
Phone100Phone926OrigPhone100OrigPhone926LenBinPhone100LenBinPhone9264.0111.89262500102'100''89262500102'49

Комментарии:
В ASA тип numeric - плавающий десятичный тип, то есть он занимает ровно столько места, сколько нужно. Я его использовал для хранения телефона, где 2 цифры до знака - это длина телефона, цифры после знака - сам телефон.
Функция "TRUNCNUM" сбрасывает десятичные знаки (то есть не округляет).
Функция "POWER" возводит число в степень.
Остальные функции думаю понятны.
...
Рейтинг: 0 / 0
Как лучше хранить номер телефона?
    #32899849
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Аргументы будут?

Эссно. 1. Нормализация. 2. Компактность (не 11 байт, а 4 или 8). Из 1 вытекает 3. Возможность дополнительных манипуляций с телефонными номерами.

> Много в сравнении, например, с числом.

Не смешно. Я бы понял, если бы Вы приводили аргументы с учетом файловой системы, размера страницы, версии СУБД и способа хранения таблицы.

> На 10 миллиардов строк имеем почти 80 гигабайт.

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

> Со справочником я уже говорил - джоинить замучаюсь, если потребуется.

;)) А в чем здесь проблема, если не секрет? Что значит "замучаюсь"?

> Да и зачем?

А зачем вообще базы данных _проектируют_?

> Проще и производительнее применить функцию - ни тебе чтений
> (даже логических), ни конкатенации строк, только raw cpu power :)

Сравните оба варианта экспериментально.

Через год, когда Вам перестанет хватать функциональности Вашего биллинга, надеюсь, Вы вспомните это обсуждение. ;)
...
Рейтинг: 0 / 0
Как лучше хранить номер телефона?
    #32899951
Фотография Scott Tiger
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> Эссно. 1. Нормализация. 2. Компактность (не 11 байт, а 4 или 8).

Ну это сворачивать если, то возможно. Тоже надо подумать. Насчёт нормализации ради нормализации не стоит, право. Как PK номер подходит, посколько не может измениться (так устроено). Не опускайтесь до уровня теоретиков от СУБД. Иначе - велкам ту су.дбмс.

> Не смешно. Я бы понял, если бы Вы приводили аргументы с учетом файловой системы, размера страницы, версии СУБД и способа хранения таблицы.

Причём здесь файловая система? Таблица - heap-organized. Это не единственная таблица с номером телефона и не единственная очень большая таблица. Остальное писал.

> Если есть задача хранить 10 миллиардов строк, то лишние 80 Гб погоды не сделают. Просто посчитайте накладные расходы для каждой таблицы.

10 старушек - рупь.

> ;)) А в чем здесь проблема, если не секрет? Что значит "замучаюсь"?

Замучаюсь, значит мне для вывода, грубо говоря, отчёта какого-нибудь придётся достаточно много раз читать индекс этого справочника (это в случае, если номер телефона будет в индексе). Не будет - ещё и блоки таблицы. В целом, так или иначе, 90 процентов этого справочника будут читаться достаточно активно. Это будет худший вариант, чем хранение номера as is или в преобразованном так или иначе виде.

> А зачем вообще базы данных _проектируют_?

Ну явно, чтобы не гордиться степенью нормализованности :)

> Проще и производительнее применить функцию - ни тебе чтений
> (даже логических), ни конкатенации строк, только raw cpu power :)

Сравните оба варианта экспериментально.

> Через год, когда Вам перестанет хватать функциональности Вашего биллинга, надеюсь, Вы вспомните это обсуждение. ;)

А при чём здесь функциональность?
...
Рейтинг: 0 / 0
Как лучше хранить номер телефона?
    #32900036
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> Ну это сворачивать если, то возможно.

Imho незачем огород городить. Суррогатный ключ int4 или int8.

> Как PK номер подходит, посколько не может измениться (так устроено).

;) Я придерживаюсь точки зрения, что практически ни одна естественная сущность для первичного ключа непригодна.

> Не опускайтесь до уровня теоретиков от СУБД. Иначе - велкам ту су.дбмс.

Был, спасибо. Не интересно.

> 10 старушек - рупь.

Хм... imho вопрос стоит примерно так: хватит для хранения основной бд массива 4 Тб или купить сразу 8? Какие 80 гигабайт? О чем Вы?

> Замучаюсь, значит мне для вывода, грубо говоря, отчёта какого-нибудь
> придётся достаточно много раз читать индекс этого справочника

Обязательно придется. И какие проблемы, по-Вашему, это создаст? Абонентов - максимум несколько миллионов, лог - десятки миллиардов записей (непонятно, правда, зачем все их держать в оперативной таблице).

> Ну явно, чтобы не гордиться степенью нормализованности :)

;) Оно, понятно, не самоцель.

> А при чём здесь функциональность?

А Вы сами-то как думаете?
...
Рейтинг: 0 / 0
Как лучше хранить номер телефона?
    #32900219
Фотография PVP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Применить шестнащатиричную систему кодирования. В одном байте два символа. Избыточность невелика, т.к. кроме цифр надо использовать спецсимволы P, #,+. Легко кодировать и декодировать.
...
Рейтинг: 0 / 0
Как лучше хранить номер телефона?
    #32900297
Фотография andrushok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Усе это напомнило мне один случай. Было сие на SDW-2004. Некий умный мужик (действительно умный, мелкомягким C# сбацал, не люблю его за это, так как он щас C++ "портить" пытаетси) Herb Sutter толкал речь про оптимизацию. Был пример некого сищного цикла - так как пишут 99% (я в том числе) и было показано, где и чо можно соптимизировать - так 7, 8 итераций. После етого, сволочь така, стал спрашивать, а угадайте на скольки увеличилось то. Ну народ стал гадать типа 30-40%, самые смелые 2-3 раза предлогали. А он и выдает в 27-60 раз работает быстрее (в зависимости от компилятора, конечно). Ну все выпали в осадок, а он и добавляет, хрен гнойный "Не делайте ЭТО НИКОГДА!" . Тоесть, как писали, так и пищите, не оптимизируйте, пока это не надо.

Ну и вернемся к нашим баранам. Как правило, пока базу не родили, до стресс-теста (если нужен, конечно) не доползли, об оптимизации думать рано. Конечно, кой-какой опыт имеется, кое-где сразу видно, как лучще сделать. Но такова собачья (наша) жисть, что как правило тебе ТЗ по полной программе не выдаст сначала. По ходу будуть всяки изменения и подкрутки (может и переделки). Так, что даже 4 байта на телефоне - это блохи, будут проблемы и поважнее. А вот сразу усложнять жисть себе (к примеру - нужны все телефоны с третей цифрой 1 и последними 3-мя цифрами 345, попляши ка!) ни к чему. IMHO.
...
Рейтинг: 0 / 0
Как лучше хранить номер телефона?
    #32900352
guest_20040621
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> как писали, так и пищите, не оптимизируйте, пока это не надо.

Время оптимизации настанет тогда, когда г-н Scott Tiger осознает необходимость разнесения оперативных таблиц (или баз, что лучше: MySQL для входа, Oracle - для хранилища) и архива, т. е. состоявшихся и закончившихся соединений. И будет в несколько потоков писать, и в несколько потоков этот лог разгребать. А пока речь о том, в каком виде этот лог хранить.
...
Рейтинг: 0 / 0
25 сообщений из 79, страница 1 из 4
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Как лучше хранить номер телефона?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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