- •Установочный модуль
- •Введение
- •Модуль 1
- •Реляционная алгебра
- •Отсутствующие данные
- •Пустые значения
- •Неопределенные значения
- •Интерпретации
- •Правила вычисления выражений
- •Следствия
- •Проверка условий
- •Реляционные объекты данных
- •Формальные определения
- •Домены и атрибуты
- •Схема отношения
- •Именованное значение атрибута
- •Кортеж
- •Отношение
- •Схема базы данных
- •База данных
- •Операции реляционной алгебры
- •Унарные операции
- •Бинарные операции
- •Варианты операции соединения
- •Производные операции
- •Пример построения выражения реляционной алгебры
- •Понятие базовых и виртуальных отношений
- •Понятие полноты реляционной алгебры
- •Формирование запросов на языке SQL
- •Металингвистические символы
- •Реализация операций реляционной алгебры
- •Пример использования подзапросов
- •Группирующие запросы
- •Упорядочение результатов
- •Вопросы для самоконтроля
- •Упражнения
- •Построение выражений реляционной алгебры
- •Модуль 2
- •Базовые и виртуальные отношения
- •Типы данных
- •Базовые типы данных
- •Типы данных, определяемые пользователем
- •Первичные и кандидатные ключи
- •Создание базовых отношений
- •Индексы
- •Модификация базовых отношений
- •Вставка строк
- •Обновление строк
- •Удаление строк
- •Целостность
- •Декларативная поддержка
- •Пример декларативной поддержки целостности
- •Транзакции и блокировки
- •Триггеры
- •Виртуальные отношения
- •Вопросы для самоконтроля
- •Упражнения
- •Декларативная поддержка целостности
- •Модуль 3
- •Нормальные формы
- •Функциональные зависимости (ФЗ)
- •Правила вывода Армстронга
- •Производные правила вывода
- •Независимость правил Армстронга
- •Полнота системы правил Армстронга
- •Нормальные формы
- •Первая нормальная форма (1NF)
- •Вторая нормальная форма (2NF)
- •Третья нормальная форма (3NF)
- •Нормальная форма Бойса-Кодда (Boyce, Codd; NFBC)
- •Пример построения нормализованных схем отношений
- •Вопросы для самоконтроля
- •Модуль 4
- •Проектирование схем баз данных
- •Уровни логической модели
- •Миграция ключей и виды связей
- •Классификация кластеров
- •Иерархическая рекурсия
- •Абстрактная схема
- •Обобщения
- •Пример реализации иерархической рекурсии
- •Сетевая рекурсия
- •Абстрактная схема
- •Сетевая реализация иерархической рекурсии
- •Обобщения
- •Пример реализации сетевой рекурсии
- •Ассоциация
- •Детализация связей многие-ко-многим
- •Обобщения
- •Пример реализации ассоциации
- •Обобщение
- •Абстрактная схема
- •Пример реализации обобщения
- •Композиция
- •Абстрактная схема
- •Пример реализации композиции
- •Агрегация
- •Абстрактная схема
- •Пример реализации агрегации
- •Унификация атрибутов
- •Вопросы для самоконтроля
- •Упражнения
- •Иерархическая рекурсия
- •Сетевая рекурсия
- •Ассоциация
- •Обобщение
- •Композиция
- •Агрегация
- •Дополнительные главы
- •Технологии баз данных
- •Информационные системы
- •Жизненный цикл ИС
- •СУБД и БД
- •Жизненный цикл БД и средства проектирования
- •Модели данных
- •Иерархическая модель данных
- •Сетевая модель данных
- •Реляционная модель данных
- •Постреляционная модель данных
- •Объектно-ориентированные модели данных
- •XML как модель данных
- •Многомерная модель данных (OLAP)
- •Основные функции СУБД
- •Управление данными во внешней памяти
- •Управление буферами оперативной памяти
- •Управление транзакциями
- •Журнализация и восстановление БД после сбоев
- •Поддержка языков баз данных
- •Типовая организация СУБД
- •Модели взаимодействия с БД
- •Модель с централизованной архитектурой
- •Модель с автономными персональными компьютерами
- •Архитектура «файл-сервер»
- •Архитектура «клиент-сервер»
- •Архитектура «клиент-сервер» трехзвенная
- •Распределенные базы данных
- •Технология тиражирования данных
- •Понятие «фрактал»
- •Геометрические фракталы
- •Алгебраические фракталы
- •Стохастические фракталы
- •Системы итерируемых функций
- •Вопросы для самоконтроля
- •Литература
- •Список иллюстраций
- •Список таблиц
3. Базовые и виртуальные отношения
3.1. Типы данных
Тип данных задает множество значений, объединенных определенной совокупностью допустимых операций. От типа данных зависит размер выделяемой для значений памяти.
3.1.1. Базовые типы данных
Базовыми типами данных являются следующие.
1.Числовые
integer – целый,
перечислимые типы,
float(n), real – вещественный,
decimal(n[, d]) – десятичный с фиксированной точкой,
money, или currency – денежный.
2.Логический
logical.
3.Строковые
bit(n), varbit(n) – строки бит фиксированной или переменной длины,
char(n), varchar(n) – строки символов фиксированной или переменной длины.
4.Даты и времени
date – дата,
time – время суток,
datetime – дата-время.
5.Идентификационные
counter(x0, 4x) – счетчик.
6.Крупные двоичные объекты
BLOB.
Целочисленный тип данных integer может иметь варианты, различающиеся по диапазону представления данных. Например, вариантами 4-байтового типа integer могут быть 8- и 2-байтовые типы bigint и smallint соответственно.
Примечание. Аналогичные варианты могут иметь и другие типы данных – денежный, даты и времени, идентификационный
Тип, в объявлении которого указывается набор символических имен, называется перечислимым. В качесве примера перечислимого типа можно назвать множество названий дней недели (пн, вт, ср, чт, пт, сб, вс). Значения перечислимых типов представляются посредством целочисленных кодов с использованием требуемого количества байтов.
Тип вещественных чисел float(n), real применяется для описания данных, которые нельзя точно представить в компьютере. Вещественные числа (числа с плавающей точкой) представляются в научной нотации, при которой число записывается с помощью мантиссы, умноженной на определенную степень десяти (порядок), например: 10Е3, +5.2Е6, -0.2Е-4. Параметр n (точность) задает количество хранимых бит мантиссы. Точность типа real зависит от конкретной реализации.
Тип decimal(n[, d]) – десятичный с фиксированной точкой с точностью в n десятичных цифр, из которых d (при d > 0) – после десятичной точки, а при d < 0 – до десятичной точки (по умолчанию d = 0). Например: 123.45 (d = 2 > 0, n = 5); 1234500. (d = - 2 < 0, n = 5).
Денежный тип money (в некоторых СУБД обозначаемый как currency) представляет числа в денежном формате в очень широком диапазоне с фиксированной точностью от денежной единицы (например, .0001).
Логический тип данных logical в некоторых СУБД подменяется типом bit(1).
Битовый тип данных используется для определения строк бит, то есть последовательностей двоичных цифр, каждая из которых может иметь значение либо 0, либо 1. Типы bit(n), varbit(n) соответствуют строкам бит фиксированной длины n и переменной длины, не превышающей n бит. Последовательности бит обычно делятся на группы по 8 бит в каждой, которые упаковываются в байты. Если n не делится на 8 нацело, неиспользуемые биты последнего байта игнорируются.
Строки символов состоят из последовательности символов, входящих в определенный создателями СУБД набор символов. Поскольку наборы символов являются специфическими для различных
диалектов языка SQL, перечень символов, которые могут входить в состав значений данных символьного типа, также зависит от конкретной реализации. Чаще всего используются наборы символов ASCII и EBCDIC. Типы char(n), varchar(n) соответствуют строкам символов фиксированной длины n и переменной длины, не превышающей n символов.
Поле, соответствующее типу char(n), представляет собой массив из n байтов в случае, если символы относятся к одному из традиционных 8-битовых наборов данных (скажем, ACSII или EBCDIC). Символ Unicode представляется 16 битами, или двумя байтами. Если значением атрибута оказывается более короткая строка, в каждую «лишнюю» позицию заносится специальный незначащий символ, 8-битовый код которого не совпадает с кодом любого другого символа из числа тех, которые разрешено включать в строки SQL.
SQL-тип varchar(n) на самом деле представляет поле фиксированной длины, хотя размер содержимого может варьироваться. Существуют два общих способа представления строк типа varchar.
Способ 1: длина плюс содержимое. Система организует массив из n+1 байт. В первом байте в виде 8-битового целого числа сохраняется количество байтов в строке. Длина строки не может превысить n, а величина n, в свою очередь, должна быть не больше значения 255 – в противном случае длину строки нельзя представить с помощью одного байта. Второй и последующие байты отображают символы содержимого строки. Если строка состоит их меньшего количества символов, оставшиеся байты массива не могут интерпретироваться как часть содержимого и игнорируются.
Способ 2: строки, завершаемые незначащим символом. В этом случае также формируется массив из n+1 байт. Массив заполняется символами строки, а в элемент, следующий за последним байтом содержимого строки, заносится незначащий символ. Как и в предыдущем случае, оставшиеся байты массива игнорируются.
Типы date, time, datetime представляют значения дат и времени. Тип данных date используется для хранения календарных дат, включающих поля год-месяц-день. Тип данных time – для хранения отметок времени, включающих поля часы-минуты-секунды. Тип данных datetime – для совместного хранения даты и времени.
Значения дат обычно представляются в виде символьных строк постоянной длины и принципиально ничем не отличаются от обычных строк символов подобного формата. Временные величины допускают аналогичное представление. В стандарте SQL, однако, предусмотрен и тип time, позволяющий сохранять значения времени с точностью до дробных долей секунды. Формат значений time относится к категории строк произвольной длины. Таким образом, имеются два альтернативных средства описания значений времени. Во-первых, система способна ограничить точность представления временных величин, как если бы они относились к типу varchar(n), где n – максимально допустимая длина строки с описанием значения времени. Во-вторых, временные значения могут сохраняться и использоваться в виде строк действительно переменной длины.
Значения данных типа счетчика counter(x0, 4x) являются целочисленными, но не задаются, как для других базовых типов, а генерируются системой. Тип счетчика может быть задан лишь при определении таблицы, причем лишь для одного столбца. В программном коде тип счетчика использовать нельзя. Значения данных типа счетчика генерируются автоматически при вставке строк в таблицы. Параметры x0 и 4x задают начальное значение и шаг приращения. Генерация проводится без повторений, так что счетчик всегда будет уникально идентифицировать каждую строку. Например, пусть в таблицу введены 4 строки. Удаление строк 2, 4 и добавление еще одной строки приведет к следующему преобразованию исходной таблицы – табл. 3.1.
Изменить значение счетчика или объявить несколько счетчиков в одной таблице СУБД не позволит. Уникальных значений 4-байтового счетчика при скорости генерации 1 знач/сек хватит на более чем 100 лет:
Таблица 3.1.: Модификация таблицы при удалении строк 2, 4 и добавлении еще одной строки
|
|
Счетчик |
|
|
Счетчик |
|
|
|
counter(1, 1) |
... |
|
counter(1, 1) |
... |
|
|
|
|
=) |
|
|
|
|
1 |
|
1 |
|
|
|
|
2 |
|
|
3 |
|
|
|
3 |
|
|
5 |
|
|
|
4 |
|
|
|
|
1 |
год 6 366 * 24 * 60 * 60 сек < 225 сек |
|
|
|
||
1 |
сек > 2 25 год |
|
|
|
24 8 знач / (1 знач/сек) = 232 сек > 27 год = 128 лет > 100 лет
Счетчик обычно используется как суррогатный, то есть искусственный, первичный ключ таблицы.
BLOB – это обобщенное название типов данных, предназначенных для хранения крупных двоичных объектов (Binary Large OBjects). Такими объектами могут быть графические изображения в различных форматах, видеозаписи, звук, сигналы радаров и т.п. Для данных типа BLOB понятие сравнения не определено.