Любые недостатки для хранения целого числа в виде строки в базе данных?

У меня есть значения id для продуктов, которые мне нужны для хранения. Сейчас они все целые числа, но я не уверен, что поставщик данных в будущем будет вводить буквы или символы в этот микс, поэтому я обсуждаю, хранить ли его сейчас как целое или строку.

Есть ли производительность или другие недостатки для сохранения значений в виде строк?

Ответы

Ответ 1

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

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

Сохранение идентификаторов продуктов в виде строк сегодня сэкономит вам много боли в будущем, если поставщик данных решит начать использовать буквенные или символьные символы. Нет реального недостатка.

Ответ 2

НЕ рассматривайте производительность. Рассмотрим смысл.

Идентификационные номера "не являются числовыми, за исключением того, что они записаны с алфавитом всех цифр.

Если у меня есть номер детали 12 и номер 14, в чем разница между ними? Является ли часть № 2 или -2 значимой? Нет.

Номера деталей (и все, что не имеет единиц измерения) не являются "числовыми". Они всего лишь цифры цифр.

Почтовые индексы в США, например. Телефонные номера. Номера социального страхования. Это не цифры. В моем городе разница между почтовым индексом 12345 и 12309 - это не расстояние от моего дома до центра города.

Не объединяйте числа - с единицами - где суммы и различия означают что-то со строками цифр без сумм или различий.

Идентификаторы номеров - правильные строки. Не целые числа. Они никогда не будут целыми, потому что у них нет сумм, различий или средних значений.

Ответ 3

Это действительно зависит от того, о каком типе вы говорите. Если это код, подобный номеру телефона, на самом деле было бы лучше использовать varchar для идентификатора, а затем ваш собственный идентификатор будет серийным для db и использовать для первичного ключа. В случае, когда целое число не имеет численного значения, обычно предпочтительны varchars.

Ответ 4

Я только что провел последний год, имея дело с базой данных, в которой есть почти все идентификаторы как строки, некоторые с цифрами, а другие - смешанные. Это проблемы:

  • Абсолютно ограниченное идентификационное пространство. Идентификатор 4 char (только для цифр) имеет емкость для 10000 уникальных значений. 4-байтовый номер имеет емкость более 4 миллиардов.
  • Непредсказуемое покрытие идентификационного пространства. После того, как идентификаторы начнут включать нецифровые цифры, становится трудно предсказать, где вы можете создавать новые идентификаторы без коллизий.
  • Проблемы с преобразованием и отображением при определенных обстоятельствах, например при написании сценариев или при экспорте. Если идентификатор интерпретируется как число, и есть начальный ноль, идентификатор изменяется.
  • Сортировка. Вы не можете полагаться на естественный порядок, полезный.

Конечно, если у вас закончились идентификаторы или вы не знаете, как создавать новые идентификаторы, ваше приложение будет мертвым. Я предлагаю, чтобы, если вы не можете контролировать формат входящих идентификаторов, вам нужно создать свои собственные (числовые) идентификаторы и связать с ним предоставленный ID. Затем вы можете убедиться, что ваш собственный идентификатор является надежным и уникальным (и цифровым), но предоставляет идентификатор пользователя, который может иметь любой формат, который требуется вашим пользователям, и даже не должен быть уникальным во всем приложении. Это больше работает, но если бы вы прошли через то, что у меня было, вы бы знали, куда идти.

Anil G

Ответ 5

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

SELECT * FROM my_table WHERE integer_as_string > '100';

Ответ 6

Пространство, которое будет занимать целое число, будет намного меньше, чем строка. Например, 2 ^ 32-1 = 4 294 967 295. Это займет 10 байтов для хранения, где в качестве целого будет занимать 4 байта для хранения. Для одной записи это не очень много места, но когда вы начинаете миллионы... Как и многие другие сообщения, есть несколько других проблем, которые следует учитывать, но это один из недостатков строкового представления.

Ответ 7

  • Вы не сможете делать сравнения правильно. "... где x > 500" не то же самое, что ".. где x > " 500 ", потому что" 500 " > " 100000 "
  • Эффективная строка будет хитом, особенно если вы используете индексы в виде целых индексов намного быстрее, чем индексы строк.

С другой стороны, это действительно зависит от вашей ситуации. Если вы собираетесь хранить что-то вроде телефонных номеров или номеров регистрации учащихся, то имеет смысл использовать строки.

Ответ 8

Целые функции более эффективны с точки зрения хранения и производительности. Однако, если есть вероятность, что альфа-символы могут быть введены, вы должны использовать строку. На мой взгляд, эффективность и производительность могут быть незначительными, тогда как время, необходимое для изменения вашего кода, может быть не таким.

Ответ 9

Как указано в Integer vs String в базе данных

В моей стране пост-коды также всегда 4 цифры. Но первая цифра может быть равна нулю.

Если вы сохраняете "0700" как целое число, вы можете получить массу проблем:

Он может быть прочитан как восьмеричное значение Если он правильно читается как десятичное значение, он превращается в "700" , Когда вы получите значение "700" , вы должны помнить, что нужно добавить нуль Я не добавляю нуль, позже, как вы узнаете, "700" - "0700", или кто-то ошибся "7100"? Технически наши почтовые коды являются фактическими строками, даже если они всегда 4 цифры.

Вы можете сохранить их как целые числа, чтобы сэкономить место. Но помните, что это простой DB-трюк, и будьте осторожны с ведущими нулями.

Но как насчет того, сколько файлов находится в потоке? Целое или строка?

Это явно целое число.

Если идентификатор всегда начинался с нуля, сохраните его как в межсетевом.

Ответ 10

Лучше использовать независимый идентификатор и, если необходимо, добавить идентификатор строки: если вам нужно указать бизнес-индикатор, зачем его использовать ID системы?

Основные недостатки:

  • Целочисленные операции и индексирование всегда показывают лучшую производительность при больших масштабах данных (более 1 тыс. строк в таблице, не говоря уже о связанных таблицах)

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

  • И вы создадите дополнительный контекстный уровень для разработчиков, чтобы знать, и в любом случае кто-то всегда будет это испортить:)