Вопрос о типе столбца таблицы базы данных - PullRequest
0 голосов
/ 26 января 2011

Иногда данные фрагмента могут быть представлены в виде целого числа (4 байта) или строки. Примеры: номера телефонов в виде bigint (8 байт), почтовые индексы в виде int (4) и т. Д. У нас есть большая таблица триплетов описания значения индекса в виде 3 столбцов, индексом является 5-значное целое число (не последовательное), и у нас это как int. Администратор БД сообщает, что это плохой дизайн, для сохранения таких данных всегда следует использовать varchar, если только это не может быть гарантированное целое число, например, auto-inc PK. Ты согласен? Почему или почему нет?

Ответы [ 3 ]

1 голос
/ 26 января 2011

Мое эмпирическое правило заключается в том, что если вы не собираетесь делать с ним математические вычисления, и это не суррогатный ключ или fk суррогатного ключа, это строковые данные. Телефонные номера не являются целыми числами, они являются строками, так же как и почтовые индексы (которые не всегда числовые за пределами США). Числа, хранящиеся в виде строк, часто имеют и требуют начальных нулей (см. Почтовые индексы США), сохраняя их как INT или десятичное число, что не позволит вам ввести действительные значения. Если он не генерируется автоматически, как вы узнаете, что это целочисленные данные? Если вы на 100 процентов положительны, это никогда не должно быть ничего, кроме целого числа (и без начальных нулей), если сделать его целочисленным, то это предотвратит попадание некоторых неверных данных. Но, будьте уверены, вам не нужно это строка данных позже (например, когда вы интернационализируете и узнаете, что ваши почтовые коды больше не являются числами).

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

0 голосов
/ 27 января 2011

Если DB является оракулом, DBA может быть правильным.Тип VARCHAR2 может быть более эффективным, чем INT для разделов и индексов.

Кроме того, если вы не будете выполнять агрегирование или что-то подобное в поле INT, усиление не будет.

0 голосов
/ 27 января 2011

Я бы рекомендовал не использовать VARCHAR в качестве столбца индекса, если все, что вам нужно сделать, это представить идентификатор. Во-первых, при индексации VARCHAR возникают лишние накладные расходы на обработку. Издержки возникают из-за того, что значение VARCHAR должно быть преобразовано через базу данных COLLATION перед сравнением для целей индексации. Во-вторых, нет причин иметь тип данных переменной длины - это делает неэффективной индексацию. В-третьих, вам нужно в 5 раз больше места для представления целого числа как VARCHAR, чем как INT. это означает, что при использовании VARCHAR индекс будет увеличен в 5 раз. Наконец, всегда существует вероятность того, что числовые данные попадут в столбец. Это может повлиять на ваш индекс и, возможно, нарушить ссылочную целостность базы данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...