Почему такие конкретные типы данных необходимы при создании таблиц базы данных? - PullRequest
3 голосов
/ 20 января 2010

Возьмите следующий оператор создания таблицы:

create table fruit
{
  count int,
  name varchar(32),
  size float
}

Вместо этих конкретных типов данных, почему бы не иметь "string", "number", "boolean" или, что еще лучше, без необходимости указывать какие-либо типы данных.

Каковы технические причины наличия таких специфических типов данных? (в отличие от общего типа или без типа данных)

Ответы [ 10 ]

4 голосов
/ 20 января 2010

Представьте 20 миллионов строк в таблице со столбцом int, в котором все числа от 1 до 10.

Если бы вы использовали для этого tinyint, это заняло бы 1 байт . Если бы вы использовали обычный int, это заняло бы 4 байта . Это в четыре раза больше дискового пространства, 60 МБ больше дискового пространства .

Теоретически, вы могли бы спроектировать механизм базы данных для «умной конфигурации» таблицы, но представьте себе нашу теоретическую таблицу, в которой внезапно база данных решает, что ей нужно выделить больше байтов для данных в столбце. Вся таблица должна быть переназначена, и производительность может замедлиться до ползания потенциально в течение нескольких часов, пока движок реструктурирует таблицу. Существует так много крайних случаев и способов ошибиться, что было бы больше работы, чтобы остаться на вершине автоматической конфигурации, чем просто правильно спроектировать приложение.

3 голосов
/ 20 января 2010

потому что есть разные по размеру и хранилищу

tinyint = 1 байт

smallint = 2 байта

int = 4 байта

bigint = 8 байт

поэтому, если вы знаете, что вам нужно хранить только определенный диапазон, вам не нужно использовать bigint и нести дополнительные затраты на хранение дополнительных байтов в строке

То же самое относится к строкам (char, varchar и т. Д.)

также встроены ограничения ... не может хранить букву A в int ... данные будут чистыми ..

3 голосов
/ 20 января 2010

Устанавливает стратегию сортировки и индексации, а также обеспечивает целостность данных.

Представь себе это.

MyNumberField как универсальный: "1234", 13, 35, "1234afgas"

Почему некоторые из этих строк и почему в "1234afgas" есть буквы?

С ограничениями типов они не будут разрешены.

2 голосов
/ 20 января 2010

В дополнение к тому, что опубликовали все остальные, существует также огромная проблема с целостностью данных. Представьте, что вы сохранили значение «1» в базе данных, если это будет рассматриваться как ИСТИНА, числовое значение 1, строка «1» ...

если два столбца имеют значение «1», равняется ли col1 + col2 цифре 2 или строке «11»?

2 голосов
/ 20 января 2010

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

1 голос
/ 20 января 2010

Помимо того, что уже было сказано, существуют базы данных, которые не требуют типов данных, такие как SQLite (http://www.sqlite.org/).

0 голосов
/ 20 января 2010

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

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

0 голосов
/ 20 января 2010

Помимо хранилища, определенный тип данных также является типом ограничения Например, если вы знаете, что определенный номер счета будет содержать ровно 8 символов, определение этого типа является наиболее логичной и эффективной вещью, которую вы можете сделать. (например, nchar (8))

Вы устанавливаете домен (или его часть, он может быть уточнен другими ограничениями) немедленно в типе поля таким образом.

0 голосов
/ 20 января 2010

Та же самая основа вопроса может быть задана в любом месте. Почему есть типы в классах? Это ограничение и ожидание данных. Вы ожидаете получить тип x, чтобы иметь дело с типом x. Вы не хотите иметь дело с бесконечной возможностью и делаете много проверок типов каждый раз, когда имеете дело с частью данных.

Типы, будь то примитивный или созданный тип, используются для определения структуры, которая будет удерживаться. Он говорит, что N - это тип X, и вы можете делать все то, что может делать тип X.

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

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

0 голосов
/ 20 января 2010

Существуют базы данных, которые не печатают, на ум приходит IBM Universe DB (также известная как Pick). С этим Db все поля имеют строковый тип, и вы определяете, как они используются через «словарь».

При интенсивном использовании как сильно типизированных БД, так и Universe я неравнодушен к строго типизированным с точки зрения программирования.

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