- •Глава 3. Реляционная модель данных
- •Глава 4. Реляционная алгебра и реляционное исчисление
- •Глава 11. Модель «сущность-связь»
- •Глава 15. Методология логического проектирования реляционной бд
- •Физическое проектирование реляционной бд
- •8.2.5. Язык pl/sql
- •Глава 21. Внедрение операторов sql в прикладные программы
- •21.3. Интерфейс доступа к данным odbc (Open DataBase Connectivity)
- •9.14. Использование case-инструментов
Физическое проектирование реляционной бд
Физическое проектирование БД представляет собой процесс, цель которого состоит в подготовке описания способа физической реализации таблиц БД на вторичных (внешних) запоминающих устройствах с учетом требований к целостности данных. На этом же этапе выбирается организация файлов для хранения данных и индексных файлов, обеспечивающих эффективный доступ к данным, а также принимаются решения по защите данных.
Во время предыдущего этапа была определена логическая структура БД, т.е. описаны реляционные таблицы, связи между ними и ограничения, обусловленные конкретной прикладной областью. Эта структура не зависит от конкретной СУБД и учитывает только то, что для представления данных выбрана реляционная модель.
Теперь, приступая к физическому проектированию БД, необходимо, прежде всего, выбрать конкретную целевую СУБД (targetDBMS). Здесь важно понимать, что многие этапы физического проектирования БД в значительной степени зависят от выбранной целевой СУБД. Следовательно, может существовать несколько различных способов реализации одной и той же схемы БД. Поэтому разработчик физической БД должен разбираться в функциональных возможностях существующих СУБД, понимать достоинства и недостатки каждого возможного варианта реализации. Разработчик физической БД должен уметь выбрать наилучшую стратегию хранения данных с учетом всех существующих особенностей их использования.
Если концептуальное и логическое проектирование БД отвечало на вопрос «что?», то физическое проектирование дает ответ на вопрос «как?». Несмотря на эту принципиальную разницу, между логическим и физическим проектированием существует постоянная обратная связь, т.к. решения, принимаемые на этапе физического проектирования с целью повышения производительности системы, способны повлиять на структуру логической модели данных (имеется в виду денормализация). Выражением этой зависимости является итерационный процесс проектирования БД, который может состоять из большого числа уточнений, направленных на корректировку принятых ранее решений.
Выбор целевой СУБД.Цель этого этапа заключается в выборе СУБД, которая удовлетворяет как текущим, так и будущим требованиям организации при оптимальном уровне затрат (расходы на приобретение СУБД вместе с дополнительным аппаратным и программным обеспечением, потребность в обучении персонала и др.).
Для оценки возможностей различных СУБД могут использоваться самые разнообразные параметры, которые при необходимости разделяются на отдельные группы. К примеру, Т. Коннолли и К. Бегг приводят перечень, в котором 70 показателей разбиты на 7 групп.
В настоящее время превосходным источником информации для выбора потенциальных кандидатов на роль целевой СУБД является Интернет. Например, исчерпывающий список программных продуктов, относящихся к классу СУБД, можно найти на Web-сайте специализированного журнала по адресу www.intelligententerprise.com. Ценная информация о характеристиках различных СУБД содержится также на Web-сайтах их производителей.
Дополнительная полезная информация о программных продуктах может быть получена от уже существующих пользователей, которые располагают сведениями о реальном качестве поддержки со стороны производителя СУБД, о совместимости с отдельными приложениями. Эти пользователи в состоянии дать сравнительную характеристику результатов, которые могут быть получены при использовании различных вычислительных платформ.
Кроме того, для сравнения разных СУБД можно воспользоваться имеющимися результатами тестирования их производительности. В частности, отчеты по оценке характеристик СУБД публикуются независимой организацией TransactionProcessingCouncilна сайтеwww.tpc.org.
На основе собранных материалов проводится предварительное исследование функциональных возможностей разных СУБД и для последующей оценки выбираются 2–3 продукта. При использовании большого числа оценочных параметров простое сравнение разных СУБД может оказаться трудной задачей. В этой ситуации помогает процедура вычисления обобщенного показателя.
|
№ п/п |
Характеристики СУБД |
Вес |
Рейтинг |
ВесРейтинг | ||
|
СУБД1 |
СУБД2 |
СУБД1 |
СУБД2 | |||
|
1 |
Простота реорганизации |
0,15 |
8 |
6 |
1,2 |
0,9 |
|
2 |
Средства индексирования |
0,2 |
6 |
5 |
1,2 |
1,0 |
|
3 |
Сжатие данных |
0,05 |
4 |
9 |
0,2 |
0,45 |
|
4 |
Возможности шифрования |
0,15 |
6 |
5 |
0,9 |
0,75 |
|
5 |
Наличие CASE-средств |
0,15 |
6 |
5 |
0,9 |
0,75 |
|
6 |
Стоимость |
0,25 |
7 |
6 |
1,75 |
1,5 |
|
7 |
Масштабируемость |
0,05 |
4 |
9 |
0,2 |
0,45 |
|
|
Итого |
1 |
41 |
45 |
6,35 |
5,8 |
Весовые коэффициенты выражают важность для конкретной организации отдельных параметров, характеризующих те или иные свойства (возможности) СУБД. Рейтинг, устанавливаемый по 10-балльной шкале, выражает экспертную оценку возможностей некоторой СУБД с точки зрения отдельно взятого показателя.
Рейтинг по каждому показателю умножается на соответствующий весовой коэффициент и полученные произведения суммируются, что дает общую (итоговую) оценку, которая может сравниваться с аналогичными оценками для других СУБД. Наиболее приемлемым будет считаться продукт с максимальной суммарной оценкой.
Создание таблиц БД с помощью языка SQL.Язык SQL включает в себя набор различных операторов (инструкций, команд), при выполнении которых СУБД производит определенные действия: создает новые таблицы в составе БД или изменяет их структуру, добавляет новые данные в существующие таблицы, осуществляет выборку данных и т.п.
Каждая инструкция SQLначинается со стандартных ключевых слов, которые описывают характер выполняемых действий: CREATE (создать), INSERT (добавить), SELECT (выбрать), DELETE (удалить) и т.п. Затем указывается одно или несколькопредложений, которые конкретизируют требуемые действия. Эти предложения могут содержать имена таблиц и их столбцов, константы, выражения и дополнительные ключевые слова.
В дальнейшем для описания формата операторов языка SQL применяются следующие обозначения расширенной формы BNF (BackusNaurForm— форма Бэкуса–Наура):
прописные буквы будут использоваться для записи зарезервированных слов;
строчными буквами записываются слова, определяемые пользователем;
вертикальная черта () указывает на необходимостьвыбораодного из нескольких приведенных вариантов;
фигурные скобки определяют обязательный элемент;
квадратные скобки определяют необязательный элемент;
многоточие (…) используется для указания необязательной возможности повторения конструкции от нуля до нескольких раз.
Описание типов данных.Современные СУБД позволяют обрабатывать данные разнообразных типов, среди которых основными являются следующие:
INT, SMALLINT — целые числа;
NUMERIC,DECIMAL— числа с фиксированной точкой;
REAL,FLOAT— числа с плавающей точкой;
CHAR, VARCHAR — строки символов постоянной и переменной длины;
MONEY, SMALLMONEY — денежные величины;
DATETIME, SMALLDATETIME — дата и время;
BIT — логические величины.
Создание таблиц БД.В простейшем виде команда CREATE TABLE имеет следующий синтаксис:
CREATE TABLE table_name ({column_def table_constraint} [, …])
Определение отдельной колонки, обозначенное как column_def, имеет следующий формат:
{column_name data_type} [DEFAULT constant_expression] [column_constraint} [, …]
Прежде всего, следует определить имя колонки (column_name), а также тип хранимых в ней данных (data_type). Ключевое словоDEFAULTопределяет значение по умолчанию (constant_expression), которое будет использовано, если при вводе записи явно не указано другое значение.
Кроме того, для колонки можно определить набор ограничений (column_constraint), которые обеспечивают поддержку целостности данных, т.е. защиту БД от нарушения согласованности сохраняемых данных. При этом может использоваться несколько видов ограничений.
1. Обязательные данные.Для некоторых столбцов требуется наличие в каждой строке таблицы конкретного и допустимого значения. Чтобы задать ограничение подобного типа, предусмотрено использование спецификатора NOT NULL. Если для некоторого столбца задан такой спецификатор, то система будет препятствовать появлению в этом столбце пустых значений (NULL). В соответствии со стандартом ISO спецификатор NULL должен применяться по умолчанию.
Например, каждый сотрудник обязательно занимает ту или иную должность. Следовательно, столбец Positionв таблицеStaffдолжен определяться следующим образом:
Position VARCHAR(10) NOT NULL
2. Первичный ключ.Для определения простого первичного ключа используется спецификатор PRIMARYKEY, который приписывается соответствующему столбцу. При этом для столбца гарантируется уникальность значений, а также становятся запрещенными неопределенные значения (NULL). В таблице можно определить только один первичный ключ.
3. Уникальность значений столбца.Если в дополнение к первичному ключу необходимо иметь альтернативные ключи, то следует применять спецификатор UNIQUE. Например, в таблицеSubject(Дисциплина) первичный ключ строится по целочисленному кодуSubjectID, что сокращает время поиска. Однако и название дисциплины (символьное полеSubName) должно быть уникальным, что обеспечивается с помощью спецификатора UNIQUE:
CREATE TABLE Subject (SubjectID INTEGER PRIMARY KEY,
SubName VARCHAR(20) NOT NULL UNIQUE);
4. Проверочные ограничения.С помощью спецификатораCHECK(logical_expression) можно задать диапазон возможных значений для некоторого столбца. Это ограничение, которое основано на проверке логического выраженияlogical_expression, позволяет объединить несколько условий контроля при вводе данных.
Например, правильность ввода значений для столбца Семестр в некоторой таблице можно обеспечить следующим образом:
Семестр INTEGER NOT NULL CHECK((Семестр >= 1) OR (Семестр <= 10))
5. Внешний ключ.Конструкция [FOREIGNKEY]REFERENCESref_table[(ref_column)] определяет внешний ключ, который предусматривается в дочерней (зависимой) таблице для связи с родительской (главной) таблицейref_table. Параметрref_columnне является обязательным, т.к. в родительской таблице ссылка осуществляется на первичный ключ. При ссылке на альтернативный ключ (столбец с атрибутомUNIQUE) этот параметр требуется указать в явном виде.
Ограничения для значений в колонках таблицы могут устанавливаться и другим способом — через определение ограничений table_constraintна уровне таблицы. Такой вариант обычно применяется в случае составных ключей. При этом используются те же самые ключевые слова, однако синтаксис немного изменяется:
{PRIMARY KEYUNIQUE} {(column [, …])}
FOREIGN KEY (column [, …]) REFERENCES ref_table [(ref_column [, …])]
Например, для создания таблицы Subjectможно использовать следующую команду:
CREATE TABLE Subject (SubjectID INTEGER,
SubName VARCHAR(20) NOT NULL,
PRIMARY KEY (SubjectID), UNIQUE (SubName));
Манипулирование данными с помощью языка SQL.Основным инструментом выборки данных в языке SQL является команда SELECT. Эта команда позволяет получить доступ к данным, которые представлены как совокупность таблиц произвольной сложности.
В упрощенном варианте команда SELECT имеет следующий синтаксис:
SELECT <Список_выбора>
[INTO<Новая_таблица>]
FROM<Набор_источников_данных>
[WHERE<Условие_отбора>]
[GROUPBY<Ключи_группировки>]
[ORDERBY<Ключи_сортировки> [ASCDESC]]
Конструкция рассматриваемой команды включает в себя отдельные разделы, каждый из которых имеет свое назначение. При этом обязательными являются только два раздела — SELECT и FROM.
Рассмотрим наиболее распространенные варианты применения оператора SELECT.
Чтобы целиком отобразить содержимое некоторой таблицы, достаточно ввести следующий оператор:
SELECT * FROM <имя_исх_табл>
Здесь символ * означает «все столбцы».
Если необходимо отобразить только значения из определенных столбцов таблицы, то оператор запроса должен выглядеть следующим образом:
SELECT<список_столбцов>
FROM <имя_исх_табл>
В списке столбцов могут присутствовать выражения языка SQL, что соответствует так называемым вычисляемым полям в результирующей таблице. В эти выражения обычно входят константы и названия полей (только числовых типов), а также арифметические операции (сложение, вычитание, умножение и деление). Для построения сложных выражений разрешается использовать круглые скобки.
Чтобы отобрать только те строки (записи), которые удовлетворяют определенному условию, необходимо добавить конструкцию WHERE:
SELECT <список_столбцов>
FROM <имя_исх_табл>
WHERE <условие_отбора>
При построении условия отбора могут использоваться простые операции сравнения (=, <>, <, >, <=, >=). Более сложные выражения строятся с помощью логических операций AND,ORилиNOT. Кроме того, можно указать шаблон поиска (LIKE), а также проверить попадание в диапазон (BETWEEN) или принадлежность к множеству (IN).
Чтобы требуемым образом отсортировать результаты запроса, в оператор SELECTпомещается конструкцияORDERBY:
SELECT<список_столбцов>
FROM <имя_исх_табл>
ORDER BY<ключи_сортировки>
Каждый ключ сортировки обязательно включает в себя название столбца, а также указатель порядка сортировки: DESC(по убыванию) илиASC(по возрастанию). По умолчанию действует режимASC.
В языке SQL присутствует набор специальных функций агрегирования, которые производят статистическую обработку данных. Каждая из этих функций оперирует со значениями отдельного столбца таблицы и в результате возвращается:
количество значений — функция COUNT();
сумма значений — функция SUM();
усредненное значение — функция AVG();
минимальное или максимальное значение — функция MIN() или MAX().
Особым случаем является вариант COUNT(*), когда происходит подсчет общего числа записей. Например, оператор
SELECT COUNT(*)
FROM <имя_исх_табл>
WHERE <условие_отбора>
дает количество записей таблицы, удовлетворяющих заданному условию отбора.
Если до применения агрегирующей функции необходимо исключить из рассмотрения повторяющиеся значения, то аргумент функции должен начинаться с ключевого слова DISTINCT:
SELECT COUNT(DISTINCT имя_столбца)
FROM<имя_исх_табл>
[WHERE <условие_отбора>]
Рассмотренные примеры иллюстрируют получение общих итогов для некоторого отчета. Вместе с тем, очень часто в отчетах требуется формировать и промежуточные итоги. Для этой цели необходимо построить группирующий запрос, т.е. в разделе GROUP BY перечислить столбцы таблицы или указать выражения, по которым должна происходить группировка отобранных записей. В результате по каждой группе создается единственная строка с промежуточными итогами. Содержание этой строки описывается в разделе SELECT как <список_выбора>. При этом необходимо учитывать следующее требование: каждый элемент списка должен иметь единственное значение для отдельной группы.
Пусть, например, в БД имеется таблица ПРЕПОДАВАТЕЛИ(Код_Преп, ФИО, Должность, Зарплата, Код_Каф). Чтобы определить количество преподавателей, работающих на каждой кафедре, а также их суммарную зарплату, необходимо выполнить следующий запрос:
SELECTКод_каф,COUNT(Код_Преп), SUM(Зарплата)
FROMПРЕПОДАВАТЕЛИ
GROUP BY Код_каф
Раздел WHERE оператора SELECTможет содержатьвложенный запрос(илиподзапрос). Результат выполнения этого внутреннего запроса используется для получения окончательного результата.
Например, список всех преподавателей, которые получают зарплату выше средней, формируется с помощью следующего запроса:
SELECTФИО, Должность
FROMПРЕПОДАВАТЕЛИ
WHERE Зарплата > (SELECTAVG(Зарплата)FROMПРЕПОДАВАТЕЛИ)
Для получения информации из нескольких таблиц применяется механизм соединения этих таблиц. Исходные таблицы перечисляются через запятую в разделе FROM, а раздел WHERE должен содержать условие, по которому происходит соединение строк из отдельных таблиц. Для сокращенного обозначения рассматриваемых таблиц разрешается использование псевдонимов.
Пусть, например, требуется сформировать список преподавателей университета с указанием названия кафедры, на которой работает преподаватель, и телефона этой кафедры. Выполняем следующий запрос:
SELECTФИО, Название, Телефон
FROMПРЕПОДАВАТЕЛИ a, КАФЕДРЫ b
WHERE a.Код_каф =b.Код_каф
При связывании таблиц конструкция в разделе FROMможет выглядеть так:
<left_table> <join_type> <right_table> ON <search_condition>
В этой конструкции элемент <join_type> может принимать следующие значения:
[INNER]JOIN— внутреннее соединение (применяется по умолчанию). Результат содержит только те пары связанных строк из <left_table> и <right_table>, которые удовлетворяют условию соединения <search_condition>.
LEFT[OUTER]JOIN— левое внешнее соединение. Результат будет обязательно содержать все строки из <left_table>. Если для некоторой строки этой таблицы ни одна из строк в <right_table> не удовлетворяет условию соединения, то соответствующие поля записи, включаемой в результат запроса, заполняются значениями NULL.
RIGHT[OUTER]JOIN— правое внешнее соединение.
FULL [OUTER]JOIN— полное внешнее соединение, что равносильно одновременному применению правил дляLEFT[OUTER]JOINиRIGHT[OUTER]JOIN.
