Типы данных, хранимых в таблицах

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

Таблица 1.2. Классификация типов данных, хранимых в таблицах

Название типа данных

Пояснение

Числовые типы

Обычно выделяют целочисленные типы  данных и типы данных с плавающей точкой. В свою очередь в зависимости от диапазона значений эти типы данных делятся еще на несколько подклассов. Например, однобайтовые, четырехбайтовые   и  восьмибайтовые для целых типов. Кроме этого современные СУБД поддерживают денежный тип (money).

Строковые типы

Строковый тип данных задается максимальным количеством символов, которые могут в нем храниться. Кроме этого, как правило, есть ограничение на максимальную длину строкового типа.  При работе со строковыми типами данных важным является такой параметр, как кодировка. Обычно используется одна из разновидностей ASCII кодировки, в которой каждый символ кодируется одним байтом. В последнее время все чаще практикуется универсальная кодировка Unicode. Используя эту кодировку, следует иметь в виду, что каждый символ строки будет кодироваться двумя байтами, а, следовательно, для хранения таких строк требуется в два раза больше места на диске, чем для хранения строк в кодировке ASCII. Да и операции с такими строками будут выполняться несколько медленнее.

Типы данных для хранения больших объемов информации

В таких столбцах хранят  двоичную или текстовую информацию. Это  могут быть исполняемые модули, графические изображения, статьи и т.п. Для таких типов не устанавливается предельный размер, хотя СУБД, разумеется, ограничивает объем таких данных, исходя из своих внутренних возможностей. 

Структурные типы данных

К таким типам следует отнести данные со сложной (не однородной в отличие от строкового типа) внутренней структурой. В частности к таким типам относятся типы данных для хранения даты и времени. Использование таких данных предполагает наличие в СУБД некоторого математического аппарата для работы с их внутренней структурой  (получение месяца, количества минут  и т.п.).

Другие типы данных

К этому классу я отношу все остальные типы, встречающиеся в таблицах, которые не попали в предыдущие классы. К таким типам в частности следует отнести тип uniqueidentifier для хранения уникальных идентификаторов строк.

 

Следует заметить, что на данные, хранящиеся в некотором столбце таблицы, может накладываться некоторое дополнительное условие, дополнительное по отношению к ограничению типом данных, хранящихся в столбце. Такое условие довольно часто сводится к указанию множества значений, которое может принимать элемент таблицы.  Например, если в данном столбце храниться целое число, трактуемое в контексте задачи как номер месяца, то для этого столбца определено множество значений 1..12. Подобные множества называются еще доменами. Многие СУБД предоставляют возможность накладывать на значения, хранящиеся в столбце, дополнительные условия (т.е. фактически определять домен), что является фактором сохранения целостности базы данных. 

Рассуждая о типах данных, следует коснуться такого понятия как NULL. Значение NULL нельзя считать в полной мере типом данных. Этот «тип» используется для того, чтобы обозначить отсутствие данного. До сих пор теоретики спорят о том, соответствует ли использование такого «типа»  положениям теории реляционной базы данных. А между тем практики давно уже включили использование NULL в СУБД. Однако начинающим проектировщикам баз данных  не мешает все же разобраться в том, стоит ли использовать NULL в своих проектах, а если стоит, то в каких случаях это использование действительно оправдано. Попробуем разобраться, обратившись к Таблице 1.1. Зададимся вопросом: есть ли смысл использовать NULL в одном из столбцов данной таблицы?  В первом столбцы мы храним фамилии работников. Если, например, фамилия на данный момент неизвестна, а сам факт выдачи денег следует все же зафиксировать, то для этого вполне сгодиться и пустая строка.  Во второй строке мы храним дату. Но и здесь мы можем   обойтись без использования NULL.  Программисты всего мира давно уже для таких целей используют заведомо не достижимые даты, например 01.01.1910 и т.п. Причем поскольку таких недостижимых дат имеется множество, то, используя их можно зашифровать и причину, почему правильная дата не может быть указана.  Обратимся, наконец, к третьему столбцу. Столбец содержит некоторое числовое значение – полученная работником сумма. И вот здесь при попытке обозначить отсутствие данных мы можем встретить некоторое затруднение. Разумеется, нельзя использовать отрицательное и нулевое значение, так как и то и другое вполне укладывается в ту предметную область, которую рассматриваем. Можно конечно использовать какие-нибудь большие отрицательные или положительные суммы. Но тогда следует учитывать диапазон, используемый для данного типа чисел и возможность преобразования одного типа данных в другой.  В данном контексте, на мой взгляд, вполне уместно использовать NULL.

Использование NULL несколько усложняет логику сравнения.  Действительно, можно ли считать равными две переменные, если они оба принимают значение NULL? А как быть с условиями неравенства, если одна из сторон неравенства принимает значение NULL?   Мы закономерно приходим к выводу, что к значениям TRUE и FALSE, используемым в традиционной логике, следует добавить и третье значение, для обозначения той ситуации, когда в сравнении участвует NULL.  Мы, таким образом, получаем трехзначную логику. Близко к   проблеме сравнения с  величиной NULL звучит и вопрос: как сортировать таблицу по столбцу, если он может принимать значения «равное» NULL?  Обычно рассматривают четыре возможных варианта: 

           Все значения NULL помещаются в конец отсортированного списка, независимо от того, в каком направлении (по возрастанию или по убыванию) сортируется список.

           Все значения NULL помещаются в начало отсортированного списка, независимо от того, в каком направлении сортируется список.

           Значения NULL  считаются наименьшими из всех возможных в списке значений.

           Значения NULL считаются наибольшими из всех возможных в списке значений.

Наконец можно поставить  вопрос и об операциях, операндами в которых могут  быть NULL-величины.  Например, как рассматривать конкатенацию двух строк, если одна из них может принять значение NULL.  Как правило, в настройках конкретной СУБД указывается один из вариантов обработки той или иной ситуации, в которой участвует значение NULL. Автор является сторонником сведения к минимуму использования значения NULL.  Даже в разобранном выше примере, где мы рассуждали об использовании NULL в столбце, где содержатся суммы (см. Таблица 1.1), можно обойтись без использования этого значения, если добавить в таблицу еще один столбец, для хранения признака недействительности суммы.  

Hosted by uCoz