
13.Реляционные объекты данных. Домены. Знамение доменов. Пример сравнения выбранных значений из табл. Р,SР (БД П,ДиП). Определение данных. Способ задания нового домена. Домены и типы данных.
Основными понятиями реляционных баз данных являются тип данных, домен, атрибут, кортеж, первичный ключ и отношение.
Типы данных: Как правило, типы данных делятся на три группы: 1) Простые типы данных. 2) Структурированные типы данных. (Массивы, Структуры). 3) Ссылочные типы данных. (указатели).
Реляционная модель требует, чтобы типы используемых данных были простыми (не обладали внутренней структурой).
Домены — это типы данных, имеющие некоторый смысл (семантику). Домен характеризуется следующими свойствами:
- Домен имеет уникальное имя (в пределах базы данных).
- Домен определен на некотором простом типе данных или на другом домене.
- Домен может иметь некоторое логическое условие, позволяющее описать подмножество данных, допустимых для данного домена.
- Домен несет определенную смысловую нагрузку.
Кортеж, отношение
Кортеж — это набор именованных значений заданного типа. Отношение — это множество кортежей, соответствующих одной схеме отношения.
Обычным житейским представлением отношения является таблица, заголовком которой является схема отношения, а строками — кортежи отношения-экземпляра; в этом случае имена атрибутов именуют столбцы этой таблицы.
Свойства отношений: 1) В отношении нет одинаковых кортежей. 2) Кортежи не упорядочены (сверху вниз). 3) Атрибуты не упорядочены (слева направо). 4) Все значения атрибутов атомарны.
Реляционной базой данных называется набор отношений. Схемой реляционной базы данных называется набор заголовков отношений, входящих в базу данных.
Домен — допустимое потенциальное ограниченное подмножество значений данного типа. Например, домен ИМЕНА определен на базовом типе строк символов, но в число его значений могут входить только те строки, которые могут представлять имена (в частности, для возможности представления русских имен такие строки не могут начинаться с мягкого или твердого знака и не могут быть длиннее, например, 20 символов). В один домен могут входить значения из нескольких колонок, объединённых, помимо одинакового типа данных, ещё и логически. Если два значения берутся из одного и того же домена, то можно выполнить сравнение этих двух значений.
Более простое определение домена — это допустимое потенциальное множество значений одного типа.
Основное значение доменов состоит в том, что домены ограничивают сравнения . Некорректно, с логической точки зрения, сравнивать значения из различных доменов, даже если они имеют одинаковый тип. В этом проявляется смысловое ограничение доменов. Синтаксически правильный запрос "выдать список всех деталей, у которых вес детали больше имеющегося количества" не соответствует смыслу понятий "количество" и "вес".
Замечание. Понятие домена помогает правильно моделировать предметную область. При работе с реальной системой в принципе возможна ситуация когда требуется ответить на запрос, приведенный выше. Система даст ответ, но, вероятно, он будет бессмысленным.
Замечание. Не все домены обладают логическим условием, ограничивающим возможные значения домена. В таком случае множество возможных значений домена совпадает с множеством возможных значений типа данных.
Замечание. Не всегда очевидно, как задать логическое условие, ограничивающее возможные значения домена. Я буду благодарен тому, кто приведет мне условие на строковый тип данных, задающий домен "Фамилия сотрудника". Ясно, что строки, являющиеся фамилиями не должны начинаться с цифр, служебных символов, с мягкого знака и т.д. Но вот является ли допустимой фамилия "Ггггггыыыыы"? Почему бы нет? Очевидно, нет! А может кто-то назло так себя назовет. Трудности такого рода возникают потому, что смысл реальных явлений далеко не всегда можно формально описать. Просто мы, как все люди, интуитивно понимаем, что такое фамилия, но никто не может дать такое формальное определение, которое отличало бы фамилии от строк, фамилиями не являющимися. Выход из этой ситуации простой - положиться на разум сотрудника, вводящего фамилии в компьютер.
Большинство SQL -серверов имеют схожие типы данных, хотя имеются и различия. После того обилия типов, к которому мы привыкли в базах данных Paradox или MS Access, может показаться, что SQL -серверы имеют очень ограниченный набор типов данных. Связано это в первую очередь, с ограничениями стандартов языка запросов SQL.
Например, InterBase не имеет:
Тип автоинкремент (автоматически увеличивающееся числовое поле). Нехватку такого важного типа можно компенсировать специальными числовыми генераторами.
Тип Boolean. Вместо него предлагается использовать символьный тип данных Char (1).
Тип Currency. Денежные типы данных придется хранить в обычных столбцах с вещественным типом данных.
В InterBase все настолько взаимосвязано, что очень сложно говорить о какой-то одной теме, не затрагивая при этом другие. На этой лекции мы коротко затронем вопрос создания таблиц, хотя полностью развернем эту тему позже. Таблицы создаются с помощью специального SQL -запроса, и для этого проще всего использовать утилиту для работы с базами данных. Если InterBase сервер у вас не запущен, запустите его. Также откройте утилиту IBConsole, войдите в локальный сервер и откройте базу данных FIRST. На панели задач находится кнопка Interactive SQL, которая запускает встроенную утилиту для редактирования выделенной базы данных:
Рис. 16.1. Значок утилиты "Interactive SQL"
Нажав на эту кнопку, вы увидите окно Интерактивного SQL:
Рис. 16.2. Interactive SQL
На рисунке указаны основные кнопки, с которыми вам придется работать, и два окна: для ввода запроса, и для вывода результатов запроса. Строка состояния содержит адрес и имя текущей базы данных, в нашем случае это C:\DataBases\first.gdb. Все запросы, которые мы будем вводить, будут относиться к этой БД.
Еще следует заметить, что в синтаксисе запросов не обязательно использовать заглавные буквы для ключевых слов, однако мы будем придерживаться рекомендаций SQL по этому вопросу.
Целые числа
InterBase поддерживает два типа целых чисел:
SMALLINT - Короткое целое число (2 байта) со знаком. Диапазон значений от -32768 до 32767.
INTEGER (INT) - Длинное целое число (4 байта) со знаком. Диапазон значений от - 2147483648 до 2147483647.
Здесь рекомендации обычные: экономить на дисковом пространстве для чисел не стоит, поэтому используйте SMALLINT только в тех полях, которые никогда не будут содержать больших чисел. Во всех остальных случаях рекомендуется использовать длинное целое INTEGER, которое также можно обозначать сокращенным синтаксисом INT. Заметим здесь же, что длинное целое INTEGER также используется для ключевых автоинкрементных полей, идентифицирующих запись, а роль счетчика при этом играют генераторы.
В окне для запросов впишите следующий запрос:
CREATE TABLE Table_Cel(
Korotkoe SMALLINT,
Dlinnoe INT)
и нажмите кнопку Execute Query (Выполнить запрос). Этим запросом мы дали команду создать таблицу с именем "Table_Cel", которая содержит два поля: " Korotkoe ", имеющее типSMALLINT, и " Dlinnoe " с типом INTEGER.
Если вы все сделали правильно, запрос исчезнет. Далее можно закрыть Interactive SQL или просто перейти на основное окно IBConsole. В дереве серверов выделите раздел Tablesбазы данных FIRST, и в правом окне увидите таблицу TABLE_CEL:
Рис. 16.3. Новая таблица создана
Чтобы окончательно убедиться, что все получилось правильно, щелкните правой кнопкой по получившейся таблице и выберите команду Properties. Выйдет окно со списком полей на вкладке Properties. Вкладка Metadata содержит запрос, по которому была создана таблица, а на вкладке Data можно увидеть записи таблицы:
Рис. 16.4. Отображение вкладки Metadata свойств таблицы TABLE_CEL
Таким же образом вы сможете создавать следующие таблицы и контролировать правильность их параметров. Выполняйте все приводимые примеры создания таблиц, так как некоторые из них понадобятся нам в следующих лекциях.
Вещественные числа
К вещественным типам относятся:
FLOAT - Число с плавающей точкой одинарной точности (4 байта). Диапазон от 3,4*10-38 до 3,4*10+38. Значащих цифр 7.
DOUBLE PRECISION - Число с плавающей точкой двойной точности (8 байт). Диапазон от 1,7*10-308 до 1,7*10+308. Значащих цифр 15.
Типа данных REAL в InterBase не существует, однако попытка создать поле такого типа не приведет к ошибке, вместо этого InterBase создаст поле типа FLOAT. Попытки создать поле других вещественных типов, которые имеются в Delphi, приведут к ошибке.
Тип FLOAT не рекомендуется использовать там, где нужна точность расчетов дробных значений, особенно в денежных полях. Вместо привычного типа CURRENCY, которого нет вInterBase, лучше подойдет тип DOUBLE PRECISION. Пример:
CREATE TABLE Table_Vesh(
Kol_Float FLOAT,
Kol_Double DOUBLE PRECISION)
Здесь первое поле может содержать вещественные числа, имеющие не более 4 знаков после запятой. При попытке сохранить число "1,234567" реально будет записано число "1,2345". Второе поле обеспечивает большую точность сохраняемых данных.
В вещественных полях нельзя управлять количеством цифр после запятой, поэтому если вам потребуется, выводить только две цифры, в программе придется использовать маску ввода, например "#,###.##".