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

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

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

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

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

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

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

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

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

Печально.

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

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

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

Много в сравнении, например, с числом. 10-значный телефонный номер в числовом представлении занимает 7 байт, а в строковом - 11. Итого - 4 байта оверхед. В таблице, положим, 2 номера - кто звонил и кому. Итого, 8 байт на строку. На 10 миллиардов строк имеем почти 80 гигабайт. Оно мне надо?. Со справочником я уже говорил - джоинить замучаюсь, если потребуется. Да и зачем? Проще и производительнее применить функцию - ни тебе чтений (даже логических), ни конкатенации строк, только raw cpu power :)
...
Рейтинг: 0 / 0
03.02.2005, 16:59
    #32899804
Urri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше хранить номер телефона?
Беда в том, что есть как телефоны типа 10 и 100, так и типа 02 и 03. ;-)))
А если функции написать, которые из 11^11 (11 символов 0...9 или пусто) конвертят в 255^5 (5 символов binary character, кроме chr(0), например) и обратно? 5 символов хватит при таком раскладе. Правда, все равно не очень быстро, но и не очень медленно ;-)
...
Рейтинг: 0 / 0
03.02.2005, 17:05
    #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
03.02.2005, 17:14
    #32899849
guest_20040621
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как лучше хранить номер телефона?
> Аргументы будут?

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

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

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

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

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

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

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

> Да и зачем?

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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