Лекции ПрБД, 2 курс 3 семестр (для ИВТ и т.п.) / Проектирование БД_уч пособие v02
.pdf
Сущность-потомок в неидентифицирующей связи будет независимой от идентификатора, если она не является также сущностью-потомком в ка- кой-либо идентифицирующей связи.
а) идентифицирующая
Участки
idУчастка <PK>
Наименование участка
b) неидентифицирующая Отдел
idОтдела <PK>
Наименование отдела
b) рекурсивная
Сотрудник
Табельный номер
Фамилия
Имя
Отчество
Должность
Пути
idПути
idУчастка <FK>
Наименование пути
Сотрудник
Табельный номер
idОтдела <FK>
Фамилия
Имя
Отчество
руководит
подчиняется
Рис. 41. Примеры связей
Внешний вид связи на диаграммах IDEF1X указывает на ее мощность, тип и обязательность.
121
Табл. 5. Обозначения связей и кардинальности связей
|
|
Элемент диаграммы |
Обозначает |
||
|
|
|
|
|
|
|
|
|
|
|
идентифицирующая связь |
|
|
|
|
|
|
|
|
|
|
|
неидентифицирующая связь |
|
|
|
|
|
|
|
|
|
|
|
1,1 |
|
|
|
|
|
|
|
|
|
|
|
0,M |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
0,1 |
|
|
|
Z |
||
|
|
|
|
|
|
|
|
|
|
|
1,M |
|
|
|
P |
||
|
|
|
|
|
|
|
|
|
|
|
точно N (N - произвольное число) |
|
|
|
N |
||
|
|
|
|
|
|
Пример ER-модели в нотации IDEF1X представлен ниже
Студент |
Дисциплина |
|
Преподаватель |
зачетка <PK> |
|
|
|
Код дисциплины <PK> |
|
Штатный номер |
|
№ группы <FK> |
Название |
|
|
|
Кафедра <FK> |
||
ФИО |
Номер семестра |
|
ФИО |
Дата рождения |
Экз/зачет |
|
Звание |
|
|
|
Степень |
Группа
номер группы <PK>
Специальность Кол-во студентов
Кафедра
Номер кафедры <PK>
Название
Зав.кафедрой
Рис. 42. Пример ER-модели в нотации IDEF1X
В тех случаях, когда две и более сущностей по набору атрибутов незначительно отличаются друг от друга, можно применять в модели конструкцию – иерархию наследования (категорий), включающую в себя суперклассы и подклассы. Суперкласс – сущность, включающая в себя под-
122
классы. Иерархия наследования представляет собой особый тип объединения сущностей, которые разделяют общие характеристики. Обычно иерархию наследования создают, когда несколько сущностей имеют общие по смыслу атрибуты, либо когда сущности имеют общие по смыслу связи.
Например, в организации работают служащие, занятые полный рабочий день (постоянные служащие) и совместители. Из их общих свойств можно сформировать обобщенную сущность (родового предка) «Сотрудник» (Рис. 43), чтобы представить информацию, общую для всех типов служащих. Специфическая для каждого типа информация может быть расположена в дополнительных сущностях (потомках) «Постоянный сотрудник» и «Совместитель». Для каждой категории требуется указать дискриминатор – атрибут родового предка, который показывает, как отличить одну сущность от другой. В приведенном примере дискриминатор – атрибут «Тип».
|
|
|
|
Сотрудник |
|
|
|
|
|
|
Сотрудник |
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Табельный номер |
|
|
|
|
|
|||||||
|
|
|
Табельный номер |
|
|
|
|
Общая сущность |
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
idОтдела <FK> |
|
|
|
|
|
|||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
idОтдела <FK> |
|
|
|
|
|
|
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
Фамилия |
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
Фамилия |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
Имя |
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
Имя |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
Отчество |
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
Отчество |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
Должность |
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
Должность |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
Дискриминатор |
Тип |
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
Тип |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
Сущности-категории |
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Постоянный сотрудник |
|
Совместитель |
|
|
Постоянный сотрудник |
|
|
Совместитель |
|
Консультант |
|||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Табельный номер <FK> |
|
|
|
Табельный номер <FK> |
|
Табельный номер <FK> |
|||||||||
Табельный номер <FK> |
|
|
|
Табельный номер <FK> |
|||||||||||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||||||
|
|
|
|
|
|
|
|
|
|
|
Ставка |
|
Ставка |
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||||
|
|
|
|
|
|
|
|
|
Ставка |
|
|
|
|
|
|
|
|
|
|||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Организация |
|||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
a)неполная категория |
|
|
|
|
|
b)полная категория |
|
|
|
|
||||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
Рис. 43. Категоризация в нотации IDEF1X
Иерархии категорий делятся на два типа: неполные (сущностикатегории составляют полное множество потомков родительской сущности) и полные (сущности-категории составляют неполное множество потомков общей сущности).В полной категории одному экземпляру родового предка обязательно соответствует экземпляр в каком-либо потомке, т. е. в примере сотрудник обязательно является либо совместителем, либо консультантом, либо постоянным сотрудником. Если категория еще не выстроена полностью и в родовом предке могут существовать экземпляры, которые не имеют соответствующих экземпляров в потомках, то такая ка-
123
тегория будет неполной. При построении модели возможны различные комбинации полных и неполных категорий. Например, первый уровень категории неполный, отдельные сущности которого дополняются вторым уровнем – полной категорией.
8.5 Получение реляционной схемы из ER-схемы
Для преобразования ER-модели в реляционную схему можно воспользоваться следующим алгоритмом.
Шаг 1. Каждая простая сущность превращается в таблицу. Простая сущность – это сущность, не являющаяся подтипом и не имеющая подтипов. Имя сущности становится именем таблицы.
Шаг 2. Каждый атрибут становится возможным столбцом с тем же именем; может выбираться более точный формат. Столбцы, соответствующие необязательным атрибутам, могут содержать неопределенные значения; столбцы, соответствующие обязательным атрибутам, – не могут.
Шаг 3. Компоненты уникального идентификатора сущности превращаются в первичный ключ таблицы. Если имеется несколько возможных уникальных идентификатора, выбирается наиболее используемый. Если в состав уникального идентификатора входят связи, к числу столбцов первичного ключа добавляется копия уникального идентификатора сущности, находящейся на дальнем конце связи (этот процесс может продолжаться рекурсивно). Для именования этих столбцов используются имена концов связей и/или имена сущностей.
Шаг 4. Связи многие-к-одному (и один-к-одному) становятся внешними ключами. Т.е. делается копия уникального идентификатора с конца связи «один», и соответствующие столбцы составляют внешний ключ. Необязательные связи соответствуют столбцам, допускающим неопределенные значения; обязательные связи – столбцам, не допускающим неопределенные значения.
Шаг 5. Индексы создаются для первичного ключа (уникальный индекс), внешних ключей и тех атрибутов, на которых предполагается в основном базировать запросы.
Шаг 6. Если в концептуальной схеме присутствовали подтипы, то возможны два способа:
a)все подтипы в одной таблице;
b)для каждого подтипа – отдельная таблица.
124
При применении способа а) таблица создается для наиболее внешнего супертипа, а для подтипов могут создаваться представления. В таблицу добавляется по крайней мере один столбец, содержащий код ТИПА; он становится частью первичного ключа.
При использовании метода b) для каждого подтипа первого уровня (для более нижних – представления) супертип воссоздается с помощью представления UNION (из всех таблиц подтипов выбираются общие столбцы – столбцы супертипа).
Табл. 6. Сравнение вариантов преобразования подтипов
|
Вариант а) – все в одной таблице |
Вариант б) – отдельная таблина на каж- |
|
|
|
|
дый подтип |
|
|
|
|
|
Преимущества |
||
|
|
|
|
− |
все хранится вместе; |
− более ясны правила подтипов; |
|
− легкий доступ к супертипу и подтипам; |
− программы работают только с нужны- |
||
− |
требуется меньше таблиц. |
|
ми таблицами. |
|
|
|
|
|
Недостатки |
||
|
|
|
|
− |
слишком общее решение; |
− |
слишком много таблиц; |
− требуется дополнительная логика ра- |
− смущающие столбцы в представлении |
||
|
боты с разными наборами столбцов и |
|
UNION; |
|
разными ограничениями; |
− |
потенциальная потеря производитель- |
− потенциальное узкое место (в связи с |
|
ности при работе через UNION; |
|
|
блокировками); |
− над супертипом невозможны модифи- |
|
− столбцы подтипов должны быть необя- |
|
кации. |
|
|
зательными; |
|
|
− в некоторых СУБД для хранения не- |
|
|
|
|
определенных значений требуется до- |
|
|
|
полнительная память. |
|
|
|
|
|
|
Шаг 7. Если в концептуальной модели имелись исключающие связи, то также возможны два способа:
a.общий домен. Если остающиеся внешние ключи все в одном домене, т.е. имеют общий формат, то создаются два столбца: идентификатор связи и идентификатор сущности. Столбец идентификатора связи используется для различения связей, покрываемых дугой исключения. Столбец идентификатора сущности используется для хранения значений уникального идентификатора сущности на дальнем конце соответствующей связи.
125
b.явные внешние ключи. Если результирующие внешние ключи не относятся к одному домену, то для каждой связи, покрываемой дугой исключения, создаются явные столбцы внешних ключей; все эти столбцы могут содержать неопределенные значения.
Табл. 7. Сравнение вариантов преобразования исключающих связей
Вариант а) – общий домен |
|
Вариант б) – явные внешние ключи |
|
|
|
|
Преимущества |
|
|
|
|
Нужно только два столбца |
|
Условия соединения – явные |
|
|
|
|
Недостатки |
|
|
|
|
Оба дополнительных атрибута должны |
Слишком много столбцов |
|
использоваться в соединениях |
|
|
|
|
|
|
|
|
С заключение раздела можно привести мнения экспертовпроектировщиков БД о причинах возникающих проблем в процессе разработки ER-моделей:
1)Наличие нескольких нотаций для ER-модели, при этом отсутствует единый стандарт (или хотя бы единая система обозначений). Например, в большинстве бумажных изданий чаще всего встречается нотация Чена, но, помимо объективных недостатков её восприятия (из всех нотаций она самая неудобочитаемая), практически отсутствуют удобные case-инструменты для ее построения. В основном на рынке большое количество инструментов, ориентированных на нотацию Мартина и IDEF1X.
2)Для различных СУБД поддерживаются инструменты, позволяющие построить схему БД (например, MS Access или MS SQL Management Studio). В результате получается что-то похожее на ERдиаграмму – чисто формально проектировщик получает графическое представление, описывающее сущности и отношения, но эти диаграммы не соответствуют ни одной из перечисленных нотаций. Такой диаграммой можно пользоваться, но вот использовать ее в документации можно не всегда.
3)ER-модель позволяет сделать «статический снимок» сущностей и связей между ними в данной предметной области. Для описания процессов информационного обмена между сущностями предметной области необходимо использовать другие методики (вместе или вместо ERмоделирования).
126
Вопросы для самопроверки
1)В чем заключаются недостатки процесс проектирования БД с помощью нормализации?
2)Что такое семантическое моделирование?
3)Перечислите основные компоненты семантической модели.
4)Дайте характеристику ER-модели П Чена.
5)Дайте характеристику ER-модели «воронья лапка».
6)Дайте характеристику нотации Баркера.
7)Дайте характеристику методологии IDEF1X.
8)Перечислите шаги для получения реляционной схемы из ERсхемы.
9 SQL (Structured English Query Language)
9.1 История SQL. История стандарта SQL. Уровни соответствия. Классы инструкций SQL
В начале 1970-х годов после появления в июне 1970 г. работы Э. Кодда «Реляционная модель данных для больших совместно используемых банков данных» корпорацией IBM была разработана экспериментальная реляционная СУБД IBM System R, для которой был создан специальный язык SEQUEL (Structured English Query Language), позволявший относительно просто управлять данными в этой СУБД. В дальнейшем этот язык применялся во многих коммерческих СУБД и в силу своего широкого распространения постепенно стал стандартом «де-факто» для языков манипулирования данными в реляционных СУБД. Целью разработки было создание простого непроцедурного языка, которым мог воспользоваться любой пользователь, даже не имеющий навыков программирования [24]. Разработкой языка запросов занимались Дональд Чэмбэрлин (Donald D. Chamberlin) и Рэй Бойс (Ray Boyce). Пэт Селинджер (Pat Selinger) занимались разработкой стоимостного оптимизатора (cost-based optimizer), Рэймонд Лори (Raymond Lorie) занимался компиляторой запросов.
Первоначальное название языка было SEQUEL – акроним «Structured English Query Language» - «английский язык структурированных запросов» и произносится как «сиквэл». Позже по юридическим соображениям2 язык SEQUEL был переименован в SQL – аббревиатура «Structured
2 «SEQUEL» был торговой маркой британской авиастроительной группй компаний «Hawker Siddeley»
127
Query Language» (язык структурированных запросов), и официальное произношение стало побуквенным «эс-кью-эль» (однако, многие англоговорящие разработчики БД до сих пор используют первое произношение языка). В 1979 г. корпорация Relational Software (впоследствии ставшей Oracle) представила коммерческую реализацию SQL для СУБД Oracle V2 для машин VAX. Корпорация Oracle отобрала у IBM права на SQL и сейчас является собственником всех выпускаемых на рынок SQL продуктов.
Через некоторое время SQL завоевал на рынке популярность и привлек внимание Американского национального института по стандартизации (American National Standards Institute, ANSI), который в 1986, 1989, 1992, 1999 и 2003 годах выпустил стандарты языка SQL.
Первый международный стандарт языка SQL был принят в 1989 г. Иногда стандарт SQL1 также называют стандартом ANSI/ISO, и подавляющее большинство доступных на рынке СУБД поддерживают этот стандарт полностью. Однако развитие информационных технологий, связанных с базами данных, и необходимость реализации переносимых приложений потребовали в скором времени доработки и расширения первого стандарта SQL.
Вконце 1992 г. был принят новый международный стандарт языка SQL, который называется SQL/92 или SQL2. И он не лишен недостатков, но в то же время является существенно более точным и полным, чем SQL/89. В настоящий момент большинство производителей СУБД внесли изменения в свои продукты так, чтобы они в большей степени удовлетворяли стандарту SQL2.
В1999 году появился новый стандарт, названный SQL3. Если отличия между стандартами SQL1 и SQL2 во многом были количественными, то стандарт SQL3 соответствует качественным серьезным преобразованиям. В SQL3 введены новые типы данных, при этом предполагается возможность задания сложных структурированных типов данных, которые в большей степени соответствуют объектной ориентации.
Наконец, добавлен раздел, который вводит стандарты на события и триггеры, которые ранее не затрагивались в стандартах, хотя давно уже широко использовались в коммерческих СУБД. В стандарте определены возможности четкой спецификации триггеров как совокупности события и действия.
128
В конце 2003 года был принят и опубликован новый вариант международного стандарта SQL:2003.В SQL:2003 специфицирован ряд новых и важных свойств, с небольшими модификациями, внесёнными позже в 2008 году.
В стандарте SQL2003 существуют семь основных классов инструкций – инструкции для установления связи, управления, работы с данными, диагностики, работы со схемами, работы с сеансами, работы с транзакциями. Постоянное развитие стандарта способствовало появлению среди разных производителей и платформ многочисленных диалектов SQL. Кроме перечисленных инструкций в диалектах обычно вводятся процедурные команды (условные, циклические, средства работы с массивами, переменными и другие). Наиболее распространены следующие диалекты: PL/SQL (Oracle), Transact/SQL (MS SQL Server), PL/pgSQL (PostgreSQL), SQLPL (DB2).
Отличительной особенностью языка SQL является тот факт, что это язык работы с множествами, представленными в реляционной форме. На основе теории множеств в терминологии ANSI используются кластеры, содержащие множество каталогов, каталоги содержат множество схем, схемы содержат множество объектов, объекты содержат подобъекты и так далее. Для доступа к подобъекту – полю таблицы нужно выполнить следующее разыменование: каталог.схема.объект.подобъект. Далее в следующих пунктах данного раздела пособия будут рассмотрены основные инструкции стандарта SQL2003, а также введены понятия основных объектов реляционных баз данных [23].
9.2 Идентификаторы. Константы. Операторы. Типы данных. Ограничения
Идентификаторы SQL имеют длину 128 символов, могут содержать любые цифры, буквы и знак подчеркивания, должны начинаться с буквы, не могут содержать пробелов и специальных символов, должны быть уникальными в своей области видимости.
Константы могут быть числовые, строковые константы, константы даты/времени и булевские. Основные категории и типы данных приведены ниже (Табл. 8).
Операторы сравнения: = (равно), <(меньше), >(больше), <= (меньше или равно), >= (больше или равно), <>, != (не равно), !< (не мень-
129
ше),!> (не больше). Арифметические операторы: + (сложение), – (вычитание), * (умножение), / (деление), %(остаток целочисленного деления).
Логические операторы:
−ALL – возвращает true, если весь набор true;
−AND – возвращает true, если все сравнения true;
−ANY – возвращает true, если хотя бы одно сравнение из набора дает true;
−Between – возвращает true, если операнд находится внутри диапазона;
−Exists – возвращает true, если подзапрос возвращает хотя бы одну строку;
−In – возвращает true, операнд равен одному выражению из списка или множеству строк, возвращаемых подзапросом;
−Like – возвращает true, если операнд совпадает с шаблоном;
−NOT – возвращает true, если отрицается значение булевого оператора;
−OR – возвращает true, если одно из сравнений возвращает true;
−SOME – возвращает true, если несколько сравнений из набора дают результат true;
−IS NULL – возвращает true, если операнд имеет неопределенное значение;
−NOT IS NULL –возвращает true, если операнд не имеет неопределенное значение.
Табл. 8. Основные категории и типы данных языка SQL [23]
Категория |
Примеры типов данных и |
Описание |
|
аббревиатура |
|
|
|
|
BINARY () |
BINARY LANGE OBJECT |
Хранятся двоичные строковые значе- |
двоичные |
(BLOB) |
ния в шестнадцатеричном формате. |
|
|
Двоичные строки хранятся без ссылок |
|
|
на наборы и без ограничения длины |
|
|
|
BOOLEAN |
BOOLEAN |
Хранятся сведения об истинности – |
(булевы) |
|
TRUE или FALSE |
|
|
|
CHARACNER |
CHAR |
Хранятся любые символы и строки |
строковые |
CHARACNER |
фиксированной длины. Вариабельные |
типы |
VARYNG (VARCHAR) |
типы хранят строки переменной длины, |
(символьные) |
|
при этом автоматически удаляются за- |
|
|
мыкающие пробелы. Другие типы про- |
130
