Почему для телефонного номера лучше использовать строковый тип данных?
Что проверяют
Понимаете ли вы, что телефон это идентификатор, а не число, и представляете ли его путь целиком: от выгрузки источника до витрины и соединения таблиц.
Как отвечать
Опорный аргумент: над номером нет ни одной осмысленной арифметической операции. Сложение, среднее и разность номеров бессмысленны, значит числовой тип не даёт ничего, а отнимает многое:
- ведущие нули значащие. Номер с нулём в начале и без него это разные номера, а число их не различает;
- при чтении выгрузки без явного указания типа колонка уезжает в целое или в дробное, и нули срезаются молча, а пропуски превращают весь столбец в дробный;
- знак плюса международного формата, скобки, разделители и добавочный номер цифрами не являются;
- в отчёте число показывается в экспоненциальной записи и в таком виде уходит заказчику;
- осмысленные операции строковые: префикс страны, код оператора, маскирование, хеш для обезличивания.
Дальше назвать рабочую схему. Хранить две колонки: сырое значение как пришло и нормализованную форму по международному стандарту, то есть плюс и до пятнадцати цифр без разделителей. Ключ соединения и дедупликация строятся по нормализованной. Нормализация делается один раз на загрузке библиотекой, знающей планы нумерации, а не набором регулярных выражений. В хранилище это текстовый тип с проверкой формата, а в колоночном формате схема задаётся явно, чтобы движок не угадывал тип по первым строкам файла.
Где спотыкаются
Аргументируют переполнением: мол, длинный номер не влезет в целочисленный тип. Влезет: пятнадцать цифр заметно меньше предела восьмибайтового целого. Настоящая причина совсем другая, и ошибка в обосновании сразу показывает, что кандидат повторяет заученное.
Считают, что сам по себе строковый тип решает вопрос сопоставления. Пока номера не приведены к единому виду, одно и то же значение в двух форматах не соединится, и дубликаты клиента разъедутся по разным строкам витрины.
Отдают номер в модель как есть либо кодируют категорией с миллионами уровней. Номер нужен как ключ и как источник признаков: страна, оператор, тип линии. Сам по себе он не признак, а в обучающую выборку идёт уже обезличенным.