1. Понятие модели данных. В модели данных описывается некоторый набор родовых понятий и признаков, которыми должны обладать все конкретные СУБД и управляемые ими базы данных, если они основываются на этой модели. Наличие модели данных позволяет сравнивать конкретные реализации, используя один общий язык. Наиболее распространенная трактовка модели данных принадлежит Кристоферу Дейту - реляционная модель состоит из трех частей, описывающих разные аспекты реляционного подхода: ● структурной части - основные логические структуры данных, которые могут применяться на уровне пользователя при организации БД, соответствующих данной модели (например, «таблицы» в SQL). ● манипуляционной части - спецификация одного или нескольких языков, предназначенных для написания запросов к БД. Основное назначение – обеспечить эталонный «модельный» язык. ● целостной части - механизмы ограничений целостности, которые обязательно должны поддерживаться во всех реализациях СУБД, соответствующих данной модели. Например, поддержка ограничения первичного ключа в любой переменной отношения в Реляционной модели. 2. Модель данных инвертированных таблиц. Описание и характеристика. Представители: СУБД Datacom/DB и Adabas (ADAptableDAtabase System). Такая организация доступа к данным используется во всех современных реляционных СУБД. Однако пользователи не имеют непосредственного доступа к инвертированным таблицам (индексам). База данных похожа на БД в модели SQL, но с отличием - пользователям видны и хранимые таблицы, и пути доступа к ним. Структуры данных: ● Строки таблиц упорядочиваются системой в некоторой физической, видимой пользователям последовательности; ● Физическая упорядоченность строк всех таблиц может определяться и для всей БД (так делается, например, в Datacom/DB); ● Для каждой таблицы можно определить произвольное число ключей поиска, для которых строятся индексы. Эти индексы автоматически поддерживаются системой, но явно видны пользователям. Манипулирование данными: 1. Операции, устанавливающие адрес записи и разбиваемые на два подкласса: a. прямые поисковые операторы (например, установить адрес первой записи таблицы по некоторому пути доступа); b. операторы, устанавливающие адрес записи при указании относительной позиции от предыдущей записи по некоторому пути доступа. 2. Операции над адресуемыми записями. Целостностная составляющая: Общие правила определения целостности отсутствуют, вся поддержка возлагается на прикладную программу 3. Иерархическая модель данных. Описание и характеристика. Представитель: СУБД IMS (Information Management System) компании IBM Структурная составляющая: Состоит из упорядоченного набора деревьев - из упорядоченного набора нескольких экземпляров одного типа дерева. Тип дерева состоит из одного «корневого» типа записи и упорядоченного набора из нуля или более типов поддеревьев (каждое из которых является некоторым типом дерева). Тип дерева в целом представляет собой иерархически организованный набор типов записи. Все экземпляры данного типа потомка с общим экземпляром типа предка называются близнецами. Определяется полный порядок обхода дерева: сверху-вниз, слева-направо. Вместо термина «запись» использовался термин «сегмент», а под «записью базы данных» понималось все дерево сегментов. Манипуляционная составляющая: Типовые операции: ● найти указанный экземпляр типа дерева БД; ● перейти от одного экземпляра типа дерева к другому; ● перейти от экземпляра одного типа записи к экземпляру другого типа записи внутри дерева; ● перейти от одной записи к другой в порядке обхода иерархии; ● вставить новую запись в указанную позицию; ● удалить текущую запись. Целостностная составляющая: Автоматически поддерживается целостность ссылок между предками и потомками. Основное правило: никакой потомок не может существовать без своего родителя. 4. Сетевая модель данных. Описание и характеристика. Представитель: СУБД IDMS (Integrated Database Management System), разработанная компанией CullinetSoftware, Inc. Является расширением иерархической модели. В иерархических структурах запись-потомок должна иметь в точности одного предка; в сетевой структуре данных у потомка может иметься любое число предков. 1 Структурная составляющая: Состоит из набора записей и набора связей между этими записями - из набора экземпляров каждого типа из заданного в схеме БД набора типов записи и набора экземпляров каждого типа из заданного набора типов связи. Тип связи определяется для двух типов записи: предка и потомка. Экземпляр типа связи состоит из одного экземпляра типа записи предка и упорядоченного набора экземпляров типа записи потомка. Для данного типа связи L с типом записи предка P и типом записи потомка C должны выполняться следующие два условия: ● каждый экземпляр типа записи P является предком только в одном экземпляре типа связи L; ● каждый экземпляр типа записи C является потомком не более чем в одном экземпляре типа связи L. Манипуляционная составляющая: ● найти конкретную запись в наборе однотипных записей; ● перейти от предка к первому потомку по некоторой связи; ● перейти к следующему потомку в некоторой связи; ● перейти от потомка к предку по некоторой связи; ● создать новую запись; ● уничтожить запись; ● модифицировать запись; ● включить в связь; ● исключить из связи; ● переставить в другую связь и т.д. Целостностная составляющая: Имеется (необязательная) возможность потребовать для конкретного типа связи отсутствие потомков, не участвующих ни в одном экземпляре этого типа связи (как в иерархической модели). 5. Реляционная модель данных. Описание и характеристика. Основана на идеях Кодда. Он предложил использовать в качестве родовой структуры БД «таблицы», в которых и столбцы, и строки не являются упорядоченными. Для обозначения родовой структуры Кодд стал использовать термин отношение (relation), а для обозначения элементов отношения — термин кортеж. Соответственно, модель данных получила название реляционной модели. Схема БД в реляционной модели данных — это набор именованных заголовков отношений вида Hi = {<Ai1, Ti1>, <Ai2, Ti2>, …, <Aini, Tini>}. Ti называется доменом атрибута Ai. Каждый домен Ti является подмножеством значений некоторого базового типа данных Ti+, а значит, к его элементам применимы все операции этого базового типа. Реляционная база данных в каждый момент времени представляет собой набор именованных отношений, каждое из которых обладает заголовком, таким как он определен в схеме БД, и телом. Имя отношения Ri совпадает с именем заголовка этого отношения HRi. Тело отношения BRi— это множество кортежей вида {<Ai1, Ti1, vi1>, <Ai2, Ti2, vi2>, …, <Aini, Tini, vini>}, где tij принадлежит Tij. Во время жизни БД тела отношений могут изменяться, но все содержащиеся в них кортежи должны соответствовать заголовкам соответствующих отношений. В манипуляционной части модели определяются два фундаментальных механизма манипулирования реляционными БД — реляционная алгебра и реляционное исчисление. Первый механизм базируется в основном на классической теории множеств (Объединение, пересечение, вычитание, взятие декартова произведения), а второй — на классическом логическом аппарате исчисления предикатов первого порядка. Данный набор операций принято называть реляционной алгеброй Кодда: ● объединение (UNION), ● пересечение (INTERSECT), ● вычитание (MINUS), ● взятие расширенного декартова произведения (TIMES), ● переименование атрибутов (RENAME), ● проекция (PROJECT), ● ограничение (WHERE), ● соединение ( JOIN), ● деление (DIVIDE BY) ● присваивание. В целостной части реляционной модели данных фиксируются два базовых требования целостности, которые должны поддерживаться в любой реляционной СУБД: ● ограничение целостности сущности — означает, что первичный ключ должен полностью идентифицировать каждую сущность, а поэтому в составе любого значения первичного ключа не допускается наличие неопределенных значений; ● ограничение ссылочной целостности – требование целостности внешнего ключа. Для каждого значения внешнего ключа, появляющегося в кортеже значения-отношения ссылающейся переменной отношения, либо в значении-отношении переменной отношения, на которую указывает ссылка, должен найтись кортеж с таким же 2 значением первичного ключа, либо значение внешнего ключа должно быть полностью неопределенным (т. е. ни на что не указывать). 6. Объектно-ориентированная модель данных. Описание и характеристика. База данных — это набор объектов (контейнеров данных) произвольного типа. Две разновидности типов: ● литеральные ● объектные Литеральные типы данных — это обычные типы данных, принятые в традиционных языках программирования. Подразделяются на: ● базовые скалярные числовые типы, ● символьные и булевские типы (атомарные литералы), ● конструируемые типы записей (структур) ● коллекции Типом элемента любой коллекции может являться любой скалярный или объектный тип за исключением того же типа коллекции.) Объектные типы по смыслу близки к понятию класса в ООП. У каждого объектного типа имеется операция создания и инициализации нового объекта этого типа. Имеются два вида объектных типов: ● атомарный объектный тип; ● объектный тип коллекций. В определении атомарного объектного типа указывается его внутренняя структура (набор свойств — атрибутов и связей) и набор операций, которые можно применять к объектам этого типа. Для определения атомарного объектного типа можно использовать механизм наследования, расширяя набор свойств и/или переопределяя существующие и добавляя новые операции. В стандарте ODMG в качестве базового средства манипулирования объектными базами данных предлагается язык OQL (ObjectQuery Language). В совокупности результатом допустимых в OQL выражений запросов могут являться: ● коллекция объектов; ● индивидуальный объект; ● коллекция литеральных значений; ● индивидуальное литеральное значение. В объектной модели отсутствует аналог ограничения целостности сущности реляционной модели данных. Интересно, что при определении атомарного объектного типа можно объявить ключ — набор свойств объектного класса, однозначно идентифицирующий состояние каждого объекта, входящего в экстент этого класса. Ссылочная целостность поддерживается, если между двумя атомарными объектными типами определяется связь вида «один-ко- многим». В этом случае объекты на стороне связи «один» рассматриваются как предки, а объекты на стороне связи «многие» — как потомки, и ООСУБД обязана следить за тем, чтобы не образовывались потомки без предков. 7. Модель данных SQL. Описание и характеристика. Модель данных SQL сложилась к 1999 г. 1 отличие модели данных SQL от реляционной модели данных: SQL-ориентированная база данных представляет собой набор таблиц (отношений), каждая из которых в любой момент времени содержит некоторое множество строк, соответствующих заголовку таблицы. 2 отличие: для таблицы поддерживается порядок столбцов, соответствующий порядку их определения. Другими словами, таблица — это вовсе не отношение, хотя они похожи. Имеется две основных разновидности таблиц, хранимых в базе данных: ● традиционная таблица— множество столбцов с указанными типами данных; ● типизированная таблица— столбцы, содержащие определенный структурный тип плюс один «самоссылающийся» столбец. С типизированной таблицей можно обращаться, как с традиционной таблицей, считая, что у нее имеются неявно определенные столбцы, а можно относиться к строкам типизированной таблицы, как к объектам структурного типа, OID которых содержатся в «самоссылающемся» столбце Модель данных SQL предоставляет набор средств манипулирования данными: ● SELECT — выборка; ● INSERT — вставка; ● UPDATE — обновление; ● DELETE — удаление; ● и др. В модели SQL отсутствует обязательное предписание об ограничении целостности сущности. В базе данных могут существовать таблицы, для которых не определен первичный ключ. С другой стороны, если для таблицы 3 определён первичный ключ, то для неё ограничение целостности сущности поддерживается точно так же, как это требуется в реляционной модели данных. Ссылочная целостность в модели данных SQL поддерживается в обязательном порядке, но в трех разных вариантах, лишь один из которых полностью соответствует реляционной модели. В SQL имеются развитые возможности явного определения ограничений целостности на уровне столбцов таблиц, на уровне таблиц целиком и на уровне базы данных. 8. Истинная реляционная модель данных. Описание и характеристика. Истинная реляционная модель – вариант реляционной модели данных, предложенный Дейтом и Дарвеном в 2006 году. Очень большое внимание уделяется типам данных. Предлагаются три категории типов данных: ● скалярные типы — инкапсулированный тип, реальная внутренняя структура которого скрыта от пользователей; ● кортежные типы — безымянный тип данных, определяемый с помощью генератора типа TUPLE c указанием множества пар <имя_атрибута, тип_атрибута>. Значением кортежного типа является кортеж, представляющий собой множество триплетов <имя_атрибута, тип_атрибута, значение_атрибута>, которое соответствует заголовку кортежа этого кортежного типа; ● типы отношений — безымянный тип данных, определяемый с помощью генератора типа RELATION c указанием некоторого заголовка кортежа. Значением типа отношения является заголовок отношения, совпадающий с заголовком кортежа этого типа отношения, и тело отношения, представляющее собой множество кортежей, соответствующих этому заголовку. В число обязательных требований истинной реляционной модели входит требование определения хотя бы одного возможного ключа для каждой переменной отношения. Возможный ключ — это одно из подмножеств заголовка переменной отношения, обладающее свойствами первичного ключа. Средства поддержки декларативной ссылочной целостности фигурируют только в разделе рекомендуемых возможностей. Для манипулирования реляционными данными Дейт и Дарвен предложили новую реляционную алгебру, названную ими Алгеброй A, которая основывается на реляционных аналогах булевских операций конъюнкции, дизъюнкции и отрицания: ● Реляционное дополнение(т.е. отрицание) ● Реляционная конъюнкция ● Реляционная дизъюнкция ● Удаление атрибута ● Переименование атрибута 9. Нормальные формы отношений. Нормальная форма — требование, предъявляемое к структуре таблиц в теории реляционных баз данных для устранения из базы избыточных функциональных зависимостей между атрибутами (полями таблиц). Нормальные формы: • первая нормальная форма (1NF); • вторая нормальная форма (2NF); • третья нормальная форма (3NF); • нормальная форма Бойса-Кодда (BCNF); • четвертая нормальная форма (4NF); • пятая нормальная форма, или нормальная форма проекции-соединения (5NF или PJ/NF). При этом: • каждая следующая нормальная форма в некотором смысле лучше предыдущей нормальной формы; • при переходе к следующей нормальной форме свойства предыдущих нормальных форм сохраняются. Первая нормальная форма (1NF) Все строки должны быть различными. Все элементы внутри ячеек должны быть атомарными (не списками). Другими словами, элемент является атомарным, если его нельзя разделить на части, которые могут использовать в таблице независимо друг от друга. Вторая нормальная форма (2NF) Таблица должна находиться в первой нормальной форме. Любое её поле, не входящее в состав первичного ключа, минимально функционально зависит от первичного ключа. Если таблица приведена к первой нормальной форме и у нее установлен уникальный id для каждой строки, то она находится и во второй нормальной форме. 4 Третья нормальная форма (3NF) Таблица находится во второй нормальной форме. Любой её не ключевой атрибут нетранзитивно функционально зависит от первичного ключа. Проще говоря, второе правило требует выносить все не ключевые поля, содержимое которых может относиться к нескольким записям таблицы в отдельные таблицы. Нормальная форма Бойса-Кодда (BCNF) Эта форма почти то же самое, что и третья. С одним небольшим дополнительным условием: В таблице должен быть только один потенциальный первичный ключ Другими словами, в таблице должен быть только один первичный ключ и не должно быть других потенциальных вариантов (например, набор не ключевых полей этой таблицы). Четвертая нормальная форма (4NF) Переменная отношения находится в 4NF, если она находится в BCNF и не содержит нетривиальных многозначных зависимостей. Пятая нормальная форма (5NF) Переменная отношения R находится в пятой нормальной форме, или в нормальной форме проекции/соединения (5NF, или PJ/NF – Project-Join Normal Form) в том и только в том случае, когда каждая нетривиальная PJD (зависимость проекции/соединения - Project-Join Dependency – PJD) в R подразумевается возможными ключами R. Таким образом, чтобы распознать, что данная переменная отношения R находится в 5NF, необходимо знать все возможные ключи R и все PJD этой переменной отношения. 5NF является «окончательной» нормальной формой, которой можно достичь в процессе нормализации на основе проекций. Другими словами, такие отношения далее нормализовать бессмысленно. Доменно-ключевая нормальная форма (ДКНФ) Переменная отношения находится в ДКНФ тогда и только тогда, когда каждое наложенное на неё ограничение является логическим следствием ограничений доменов и ограничений ключей, наложенных на данную переменную отношения. Другими словами, что бы Вы там не меняли – ничего не потеряется, если соблюдены все ограничения относительно ключей и доменов. 10. ER-диаграммы. Основные понятия. Нормальные формы ER-диаграмм. ER-модель - модель данных, позволяющая описывать концептуальные схемы предметной области. ER-модель используется при высокоуровневом (концептуальном) проектировании баз данных. С её помощью можно выделить ключевые сущности и обозначить связи, которые могут устанавливаться между этими сущностями. В качестве стандартной графической нотации, с помощью которой можно визуализировать ER-модель, была предложена диаграмма сущность-связь (ER-диаграмма). Основными понятиями ER-модели являются: ● сущность; ● связь; ● атрибут. Сущность — это реальный или представляемый объект, информация о котором должна сохраняться и быть доступной. В диаграммах ER-модели сущность представляется в виде прямоугольника, содержащего имя сущности. При этом имя сущности — это имя типа, а не некоторого конкретного экземпляра этого типа. При определении типа сущности необходимо гарантировать, что каждый экземпляр сущности может быть отличим от любого другого экземпляра той же сущности. Связь — это графически изображаемая ассоциация, устанавливаемая между двумя типами сущностей. Как и сущность, связь — это типовое понятие, все экземпляры обоих связываемых типов сущностей подчиняются устанавливаемым правилам связывания. В любой связи выделяются два конца, на каждом из которых указываются: ● имя конца связи; ● степень конца связи; ● обязательность связи. Связь представляется в виде ненаправленной линии, соединяющей две сущности или ведущей от сущности к ней же самой. Атрибутом сущности является любая деталь, которая служит для уточнения, идентификации, классификации, числовой характеристики или выражения состояния сущности. Имена атрибутов заносятся в прямоугольник, изображающий сущность, под именем сущности и изображаются малыми буквами. 5 Первая нормальная форма ER-диаграммы В первой нормальной форме ER-диаграммы устраняются атрибуты, содержащие множественные значения, т.е. производится выявление неявных сущностей, «замаскированных» под атрибуты. Вторая нормальная форма ER-диаграммы Во второй нормальной форме устраняются атрибуты, зависящие только от части уникального идентификатора. Эта часть уникального идентификатора определяет отдельную сущность. Третья нормальная форма ER-диаграммы В третьей нормальной форме устраняются атрибуты, которые зависят от атрибутов, не входящих в уникальный идентификатор. Эти атрибуты являются основой отдельной сущности. 11. Получение реляционной схемы из ER-диаграммы. Каждый простой тип сущности превращается в таблицу. Имя сущности становится именем таблицы. Экземплярам типа сущности соответствуют строки соответствующей таблицы. Каждый атрибут становится столбцом таблицы с тем же именем; может выбираться более точный формат представления данных. Столбцы, соответствующие необязательным атрибутам, могут содержать неопределенные значения; столбцы, соответствующие обязательным атрибутам, — не могут. Компоненты уникального идентификатора сущности превращаются в первичный ключ таблицы. Если в состав уникального идентификатора входят связи, к числу столбцов первичного ключа добавляется копия уникального идентификатора сущности, находящейся на дальнем конце связи. Связи «многие к одному» (и «один к одному») становятся внешними ключами. Для поддержки связи «многие ко многим» между типами сущности A и B создается дополнительная таблица AB с двумя столбцами, один из которых содержит уникальные идентификаторы экземпляров сущности A, а другой — уникальные идентификаторы экземпляров сущности B. Индексы создаются для первичного ключа (уникальный индекс), внешних ключей и тех атрибутов, на которых предполагается в основном базировать запросы. Если в концептуальной схеме (ER-диаграмме) присутствуют подтипы, то возможны два способа их представления в реляционной схеме: 1. собрать все подтипы в одной таблице; 2. для каждого подтипа образовать отдельную таблицу. Достоинства первого способа: ● соответствие логике супертипов и подтипов; ● обеспечение простого доступа к экземплярам супертипа и не слишком сложный доступ к экземплярам подтипов; ● возможность обойтись небольшим числом таблиц. Недостатки первого способа: ● прикладная программа, имеющая дело с одной таблицей супертипа, должна включать дополнительную логику работы с разными наборами столбцов; ● общая для всех подтипов таблица потенциально может стать узким местом при многопользовательском доступе по причине возможности блокировки таблицы целиком; ● для индивидуальных столбцов подтипов должна допускаться возможность содержать неопределенные значения. Достоинства второго способа: ● действуют более понятные правила работы с подтипами (каждому подтипу соответствует одноименная таблица); ● упрощается логика приложений; каждая программа работает только с нужной таблицей. Недостатки второго способа: ● в общем случае требуется слишком много отдельных таблиц; ● работа с экземплярами супертипа на основе представления, объединяющего таблицы супертипов, может оказаться недостаточно эффективной; ● поскольку множество экземпляров супертипа является объединением множеств экземпляров подтипов, не все РСУБД могут обеспечить выполнение операций модификации экземпляров супертипа. Существуют два способа формирования схемы реляционной БД при наличии взаимно исключающих связей: 1. общее хранение внешних ключей; 6 2. раздельное хранение внешних ключей. Преимущество первого способа: ● в таблице, соответствующей сущности, появляется всего два дополнительных столбца. Недостаток первого способа: ● усложнение выполнения операции соединения. Преимущество второго способа: ● соединения являются явными (и естественными). Недостаток второго способа: ● требуется иметь столько столбцов, сколько имеется альтернативных связей. 12. Диаграммы классов языка UML. Основные понятия. Язык OCL. Основными понятиями UML являются сущности, диаграммы и отношения. Сущности, основные элементы UML, могут вступать в отношения, и они группируются на диаграммах. Моделирование на языке UML является объектноориентированным, поэтому основной сущностью в UML является класс. 7 Диаграммой классов в терминологии UML называется диаграмма, на которой показан набор классов, а также связей между этими классами. Кроме того, диаграмма классов может включать комментарии и ограничения. Ограничения могут неформально задаваться на естественном языке или же могут формулироваться на языке объектных ограничений OCL (Object Constraints Language). Классом называется именованное описание совокупности объектов с общими атрибутами, операциями, связями и семантикой. Графически класс изображается в виде прямоугольника. У каждого класса должно быть имя, уникально отличающее его от всех других классов. Атрибутом класса называется именованное свойство класса, описывающее множество значений, которые могут принимать экземпляры этого свойства. Класс может иметь любое число атрибутов (в частности, не иметь ни одного атрибута). Любой атрибут любого объекта класса должен иметь некоторое значение. Имена атрибутов представляются в разделе класса, расположенном под именем класса. На практике рекомендуется использовать короткие прилагательные и существительные, отражающие смысл соответствующего свойства класса. Первое слово в имени атрибута рекомендуется писать с прописной буквы, а все остальные слова — с заглавной. Операцией класса называется именованная услуга, которую можно запросить у любого объекта этого класса. Операция — это абстракция того, что можно делать с объектом. Класс может содержать любое число операций (в частности, не содержать ни одной операции). Набор операций класса является общим для всех объектов данного класса. Описание операции может также содержать еѐ сигнатуру, т.е. имена и типы всех параметров, а если операция является функцией, то и тип еѐ значения. В диаграмме классов могут участвовать связи трѐх разных категорий: ● зависимость (dependency); ● обобщение (generalization): ● ассоциация (association). Зависимостью называют связь по применению, когда изменение в спецификации одного класса может повлиять на поведение другого класса, использующего первый класс. Чаще всего зависимости применяют в диаграммах классов, чтобы отразить в сигнатуре операции одного класса тот факт, что параметром этой операции могут быть объекты другого класса. Зависимость показывается прерывистой линией со стрелкой, направленной к классу, от которого имеется зависимость. При проектировании реляционных БД зависимости не используются. 8 Связью-обобщением называется связь между общей сущностью, называемой суперклассом, или родителем, и более специализированной разновидностью этой сущности, называемой подклассом, или потомком. Класс-потомок наследует все атрибуты и операции класса-предка, но в нем могут быть определены дополнительные атрибуты и операции. Объекты класса-потомка могут использоваться везде, где могут использоваться объекты класса-предка. Это свойство называют полиморфизмом по включению, имея в виду, что объекты потомка можно считать включаемыми во множество объектов класса-предка. Графически обобщения изображаются в виде сплошной линии с большой незакрашенной стрелкой, направленной к суперклассу. Одиночное наследование является достаточным в большинстве случаев применения связи-обобщения. Однако в UML допускается и множественное наследование, когда один подкласс определяется на основе нескольких суперклассов. Ассоциацией называется структурная связь, показывающая, что объекты одного класса некоторым образом связаны с объектами другого или того же самого класса. Допускается, чтобы оба конца ассоциации относились к одному классу. В ассоциации могут связываться два класса, и тогда она называется бинарной. Допускается создание ассоциаций, связывающих сразу n классов (они называются n-арными ассоциациями). Графически ассоциация изображается в виде линии, соединяющей класс сам с собой или с другими классами. С понятием ассоциации связаны четыре важных дополнительных понятия: ● имя; ● роль; ● кратность; ● агрегация. Смысл имени уточняется с помощью черного треугольника, который располагается над линией связи справа или слева от имени ассоциации. Этот треугольник указывает направление чтения имя связи. Другим способом именования ассоциации является указание роли каждого класса, участвующего в этой ассоциации. Роль класса, как и имя конца связи в ER-модели, задается именем, помещаемым под линией ассоциации ближе к данному классу. Кратностью (multiplicity) роли ассоциации называется характеристика, указывающая, сколько объектов класса с данной ролью может или должно участвовать в каждом экземпляре ассоциации. Наиболее распространенным способом задания кратности роли ассоциации является указание конкретного числа или диапазона. Обычная ассоциация между двумя классами характеризует связь между равноправными сущностями: оба класса находятся на одном концептуальном уровне. Но иногда в диаграмме классов требуется отразить тот факт, что ассоциация между двумя классами имеет специальный вид «часть-целое». В этом случае класс «целое» имеет более высокий концептуальный уровень, чем класс «часть». Ассоциация такого рода называется агрегатной. Графически агрегатные ассоциации изображаются в виде простой ассоциации с незакрашенным ромбом на стороне класса-«целого». Бывают случаи, когда связь «части» и «целого» настолько сильна, что уничтожение «целого» приводит к уничтожению всех его «частей». Агрегатные ассоциации, обладающие таким свойством, называются композитными, или просто композициями. При наличии композиции объект-часть может быть частью только одного объекта-целого (композита). При обычной агрегатной ассоциации «часть» может одновременно принадлежать нескольким «целым». Графически композиция изображается в виде простой ассоциации, дополненной закрашенным ромбом со стороны «целого». Если не оговорено иное, то навигация по ассоциации может проводиться в обоих направлениях. Бывают случаи, когда желательно ограничить направление навигации для некоторых ассоциаций. В этом случае на линии ассоциации ставится стрелка, указывающая направление навигации. В диаграммах классов могут указываться ограничения целостности, которые должны поддерживаться в проектируемой БД. В UML допускаются два способа определения ограничений: ● на естественном языке; ● на языке OCL. Более точный и лаконичный способ формулировки ограничений обеспечивает язык OCL (Object Constraints Language). Из языка UML в OCL заимствованы, в первую очередь, следующие концепции: ● класс, атрибут, операция; ● объект (экземпляр класса); ● ассоциация; ● тип данных (включая набор предопределенных типов Boolean, Integer, Real и String); ● значение (экземпляр типа данных). Для понимания языка OCL существенны определяемые в UML традиционные для объектных моделей данных различия между объектом некоторого класса и значением некоторого типа: ● объект обладает уникальным идентификатором и может сравниваться с другими объектами только по значению идентификатора; следствием этого является возможность определения операций над множествами объектов в терминах их идентификаторов; 9 ● объект может быть ассоциирован через бинарную связь с другими объектами, что позволяет определить в OCL операцию перехода от данного объекта к связанным с ним объектам; ● в то же время значение является «чистым значением» в том смысле, что: ● при сравнении двух значений проверяются сами эти значения; ● значения не могут участвовать в связях, поскольку понятие связи определено только для объектов классов. В дополнение к скалярным типам данных, заимствованным из UML, в OCL предопределены структурные типы, которые являются разновидностями типов коллекций (collection): ● математическое множество (set), неупорядоченная коллекция, не содержащая одинаковых элементов; ● мультимножество (bag), неупорядоченная коллекция, которая может содержать повторяющиеся элементы-дубликаты; ● последовательность (sequence), упорядоченная коллекция, которая может содержать элементыдубликаты. В OCL элементами каждого из трех типов коллекций могут быть либо объекты, либо значения. В OCL поддерживаются следующие заимствованные из определения UML скалярные типы данных: ● Boolean; ● Integer; ● Real; ● String. В OCL определены три операции над объектами: ● получение значения атрибута; ● переход по соединению, ● вызов операции класса Для записи этих трех операций используется «точечная нотация». Например, результатом выражения вида <объект>.<имя атрибута> является текущее значение атрибута с именем имя атрибута, если объект имеет такой атрибут. В противном случае использование подобного выражения приводит к возникновению ошибки типа. Результатом применения к объекту операции перехода по соединению является коллекция, содержащая все объекты, которые ассоциированы с данным объектом через указываемое соединение. Это соединение идентифицируется именем роли, противоположной по отношению к данному объекту: <объект>.<имя роли, противоположенной по отношению к объекту> В OCL поддерживается обширный набор операций над значениями коллекционных типов данных. Синтаксически операции над коллекциями записываются в нотации, аналогичной точечной, но вместо точки используется стрелка (→): <коллекция>→<имя операции> (<список фактических параметров>) Плюс: ● язык позволяет формально и однозначно определять ограничения целостности БД в терминах еѐ концептуальной схемы. Минус: ● сложность языка и неочевидность некоторых его конструкций. 13. Получение схемы реляционной БД из диаграммы классов UML. (Unified Modeling Language).Здесь выполняются практически те же шаги, что и в случае преобразования в схему реляционной БД ER-диаграммы (смотри 11 вопрос). Но есть особые рекомендации: ● Прежде чем определять в классах операции, подумайте, что вы будете делать с этими определениями в среде целевой РСУБД. ● Помните, что сравнительно эффективно в РСУБД реализуются только ассоциации видов «один ко многим» и «многие ко многим». ● Для технологии реляционных БД агрегатные и в особенности композитные ассоциации неестественны. Подумайте о том, что вы хотите получить в реляционной БД, объявив некоторую ассоциацию агрегатной. ● В спецификации UML говорится о том, что, определяя однонаправленные связи, вы можете способствовать эффективности доступа к некоторым объектам. Для технологии реляционных баз данных поддержка такого объявления вызовет дополнительные накладные расходы и тем самым снизит эффективность. ● Не злоупотребляйте возможностями OCL(Object Constraints Language). Этап диаграммного моделирования обеспечивает следующие преимущества: ● на раннем этапе проектирования до привязки к конкретной РСУБД проектировщик может обнаружить и исправить логические недочѐты проекта, руководствуясь наглядным графическим представлением концептуальной схемы; ● окончательный вид концептуальной схемы, полученной непосредственно перед переходом к формированию реляционной схемы, должен стать частью документации целевой реляционной БД; наличие этой документации очень полезно для сопровождения и, в особенности, для изменения схемы БД в связи с изменившимися требованиями; ● при использовании CASE-средств концептуальное моделирование БД может стать частью всего процесса проектирования целевой информационной системы, что должно способствовать правильной структуризации процесса, эффективности и повышению качества проекта в целом. 10 14. Проектирование БД. Основные этапы. Проектирование баз данных — процесс создания схемы базы данных и определения необходимых ограничений целостности. Две проблемы проектирования БД ● проблема логического проектирования баз данных; ● проблема физического проектирования баз данных. Процесс проектирования представляет собой процесс нормализации схем отношений, причём каждая следующая нормальная форма обладает свойствами, в некотором смысле, лучшими, чем предыдущая. Основные задачи проектирования баз данных: 1. Обеспечение хранения в БД всей необходимой информации. 2. Обеспечение возможности получения данных по всем необходимым запросам. 3. Сокращение избыточности и дублирования данных. 4. Обеспечение целостности данных (правильности их содержания): исключение противоречий в содержании данных, исключение их потери и т.д. Основные этапы проектирования баз данных: 1. Концептуальное проектирование - построение информационной модели. Конкретный вид и содержание концептуальной модели базы данных определяется выбранным для этого формальным аппаратом. Обычно используются ER-диаграммы. 2. Логическое проектирование - создание схемы базы данных на основе конкретной модели данных. Для реляционной модели — набор схем отношений, обычно с указанием первичных ключей, а также «связей» между отношениями, представляющих собой внешние ключи. 3. Физическое проектирование — создание схемы базы данных для конкретной СУБД Рассмотрим этапы более подробно: 1. Определение цели создания базы данных То есть нужно определить основные темы таблиц базы данных и информацию, которую будут содержать поля таблиц. База данных должна отвечать требованиям тех, кто будет непосредственно с ней работать. 2. Определение таблиц, которые должна содержать база данных. Одним из наиболее сложных этапов - разработка таблиц, так как результаты, которые должна выдавать база данных не всегда дают полное представление о структуре таблицы. При проектировке таблиц рекомендуется руководствоваться следующими основными принципами: ● Информация в таблице не должна дублироваться. Не должно быть повторений и между таблицами. ● Каждая таблица должна содержать информацию только на одну тему. 3. Определение необходимых в таблице полей Каждая таблица должна содержать необходимые поля. Каждое поле в таблице должно содержать отдельные сведения по теме таблицы. Информацию следует разбивать на наименьшие логические единицы. 4. Задание первичного ключа для каждой таблицы Каждая таблица должна содержать поле или набор полей, которые будут однозначно идентифицировать каждую запись в таблице. Такое поле или набор полей называют первичным ключом. 5. Определение связей между таблицами Связи нужны для того, чтобы обеспечить синхронное изменение одноименных полей в разных таблицах. Самый распространенный вид связи - «один-ко-многим». 6. Обновление структуры базы данных После проектирования таблиц, полей и связей необходимо еще раз просмотреть структуру базы данных и выявить возможные недочеты. 7. Добавление данных и создание других объектов базы данных Если структуры таблиц отвечают поставленным требованиям, то можно вводить все данные. Затем можно создавать любые запросы, формы, отчеты, макросы и модули. 15. Язык SQL. Средства определения таблиц и ограничений целостности. CREATE TABLE - определить базовую таблицу. В операторе SQL CREATE TABLE специфицируются не только столбцы таблицы, но и ограничения целостности, которым должны удовлетворять данные, хранящиеся в базовой таблице. ALTER TABLE -для изменения определения базовой таблицы. DROP TABLE - уничтожить хранимую таблицу. Ограничение первичного ключа (PRIMARY KEY) это столбец или комбинация столбцов, значения которых уникально идентифицируют каждую строку в таблице. Нужен для обеспечения ее целостности. Таблица может иметь только одно ограничение PRIMARY KEY, причем ни один из включенных в первичный ключ столбцов не может принимать значение NULL. Ограничение внешнего ключа (FOREIGN KEY) это основной механизм для поддержания ссылочной целостности между таблицами реляционной базы данных. Столбец дочерней таблицы, определяется в качестве внешнего ключа в параметре FOREIGN KEY, применяется для ссылки на столбец родительской таблицы, являющийся в ней первичным ключом. Имя родительской таблицы и столбцы ее первичного ключа указываются в предложении REFERENCES. Совпадение имен столбцов для связи дочерней и родительской таблиц необязательно. Требование: соответствие столбцов по типу и размеру данных. 11 Для каждой записи в дочерней таблице должна иметься запись в родительской таблице. При этом изменение значения столбца связи в записи родительской таблицы при наличии дочерней записи блокируется, равно как и удаление родительской записи. Ограничение уникального ключа (UNIQUE) это ограничение задает требование уникальности значения поля (столбца) или группы полей (столбцов), входящих в уникальный ключ, по отношению к другим записям. В каждой строке данных столбца UNIQUE должны содержаться уникальные значения. Кроме того, при использовании ограничения UNIQUE допускается существование значения NULL, но лишь единственный раз. Триггеры также используются для обеспечения целостности данных. Триггер представляет собой хранимую процедуру, которая активизируется при наступлении определенного события. Синтаксис создания триггера: CREATE TRIGGER имя_триггера время_триггера событие_срабатывания_триггера ON имя_таблицы FOR EACH ROW Выражение_выполняемое_при_срабатывании_триггера время_триггера - определяет время свершения действия триггера. ● BEFORE - триггер выполнится до завершения события срабатывания триггера ● AFTER - после. событие_срабатывания_триггера -тут четко обозначается, при каком событии выполняется триггер .● INSERT: т.е. при операциях вставки или аналогичных ей выражениях (INSERT, LOAD DATA, и REPLACE) ● UPDATE: когда сущность (строка) модифицирована ● DELETE: когда запись удаляется (запросы, содержащие выражения DELETE и/или REPLACE) 16. Язык SQL. Средства манипулирования данными. Операторы INSERT, UPDATE и DELETE. UPDATE и DELETE. Язык SQL предназначен для манипулирования данными в реляционных базах данных, определения структуры баз данных и для управления правами доступа к данным в многопользовательской среде. Поэтому, в язык SQL в качестве составных частей входят: ● язык манипулирования данными (Data Manipulation Language, DML) ● язык определения данных (Data Definition Language, DDL) ● язык управления данными (Data Control Language, DCL). Язык манипулирования данными состоит из 4 основных команд: ● SELECT (выбрать) ● INSERT (вставить) ● UPDATE (обновить) ● DELETE (удалить) INSERT INTO — используется для добавления новых строк в таблицу. Синтаксис SQL INSERT INTO: Используя перечисление значений, с указанием столбцов: INSERT INTO ([, ... ]) VALUES (,...) Используя перечисление значений, без указания столбцов: INSERT INTO VALUES (,...) В последнем случае, в таблицу можно вставить более одной записи. Если в таблице есть другие поля требующие заполнения, но не указанные в операторе insert, то для них будет установлено значение по умолчанию, либо null, если значение по умолчанию не установлено. UPDATE — используется для обновления записей в таблице. СинтаксисSQL UPDATE UPDATE table_name SET column1=value, column2=value2,... WHERE some_column=some_value Замечание: WHERE определяет какие записи должны быть обновлены, если условие WHERE не прописано то все записи в таблице будут обновлены! DELETE — используется для удаление записей в таблице. Синтаксис SQL DELETE DELETE FROM table_name WHERE some_column=some_value Замечание: При составлении запроса на удаление, используйте условие WHERE иначе все записи могут быть удаленны. 17. Язык SQL. Общая характеристика оператора SELECT. Язык манипулирования данными состоит из 4 основных команд: ● SELECT (выбрать) ● INSERT (вставить) 12 ● UPDATE (обновить) ● DELETE (удалить) SELECT — оператор, возвращающий набор данных (выборку) из базы данных, удовлетворяющих заданному условию. В большинстве случаев, выборка осуществляется из одной или нескольких таблиц. В последнем случае говорят об операции слияния (англ. join). При формировании запроса SELECT пользователь описывает ожидаемый набор данных: его вид (набор столбцов) и его содержимое (критерий попадания записи в набор, группировка значений, порядок вывода записей и т.п.). Запрос выполняется следующим образом: сначала извлекаются все записи из таблицы, а, затем, для каждой записи набора проверяется её соответствие заданному критерию. Если осуществляется слияние из нескольких таблиц, то сначала составляется произведение таблиц, а уже затем из полученного набора отбираются требуемые записи. Особую роль играет обработка NULL-значений, когда при слиянии, например, двух таблиц — главной (англ. master) и подчинённой (англ. detail) — имеются или отсутствуют соответствия между записями таблиц, участвующих в слиянии. Для решения этой задачи используются механизмы внутреннего (англ. inner) и внешнего (англ. outer) слияния. Структура оператора Оператор SELECT имеет следующую структуру: SELECT [ ALL | DISTINCT ] select_item_commalist FROM table_reference_commalist [ WHERE conditional_expression ] [ GROUP BY column_name_commalist ] [ HAVING conditional_expression ] [ ORDER BY order_item_commalist ] [LIMIT [offset,] rows] Основные ключевые слова, относящиеся к запросу SELECT: WHERE — используется для определения, какие строки должны быть выбраны или включены в GROUP BY. GROUP BY — используется для объединения строк с общими значениями в элементы меньшего набора строк. HAVING — используется для определения, какие строки после GROUP BY должны быть выбраны. ORDER BY — используется для определения, какие столбцы используются для сортировки результирующего набора данных. 18. Язык SQL. Связь таблиц с помощью JOIN. JOIN — оператор языка SQL, позволяющий соединять записи из двух таблиц реляционной базы данных. Входит в раздел FROM оператора SELECT и отдельно от него не используется. Оператор JOIN является реализацией операции соединения реляционной алгебры. Описание оператора SELECT FIELD [,... n] FROM Table1 {INNER | {LEFT | RIGHT | FULL} OUTER | CROSS } JOIN Table2 ON <condition> В большинстве СУБД при указании слов LEFT, RIGHT, FULL слово OUTER можно опустить. Слово INNER также в большинстве СУБД можно опустить. В общем случае СУБД при выполнении соединения проверяет условие condition. Для CROSS JOIN условие не указывается. Для перекрёстного соединения (декартова произведения) CROSS JOIN в некоторых реализациях SQL используется оператор «запятая» (,): SELECT FIELD [,... n] FROM Table1, Table2 Виды оператора JOIN Для дальнейших пояснений будут использоваться следующие таблицы: 13 INNER JOIN Оператор внутреннего соединения INNER JOIN соединяет две таблицы, причём порядок таблиц для оператора неважен, поскольку оператор является симметричным. Тело результата логически формируется следующим образом. Каждая строка одной таблицы сопоставляется с каждой строкой второй таблицы, после чего для полученной «соединённой» строки проверяется условие соединения (вычисляется предикат соединения). Если условие истинно, в таблицу-результат добавляется соответствующая «соединённая» строка. Результат: OUTER JOIN Присоединение таблицы с необязательным присутствием записи в таблице. LEFT OUTER JOINК левой таблице присоединяются все записи из правой, соответствующие условию (по правилам inner join), плюс все не вошедшие записи из левой таблицы, поля правой таблицы заполняются значениями Тело результата логически формируется следующим образом. Пусть выполняется соединение левой и правой таблиц по предикату (условию) p. 1. В результат включается внутреннее соединение (INNER JOIN) левой и правой таблиц по предикату p. 2. Затем в результат добавляются те записи левой таблицы, которые не вошли во внутреннее соединение на шаге 1. Для таких записей поля, соответствующие правой таблице, заполняются значениями NULL. SELECT * FROM Person LEFT OUTER JOIN City ON Person.CityId = City.Id Результат: RIGHT OUTER JOIN К правой таблице присоединяются все записи из левой, соответствующие условию (по правилам inner join), плюс все не вошедшие записи из правой таблицы, поля левой таблицы заполняются значениями SELECT * FROM Person RIGHT OUTER JOIN City ON Person.CityId = City.Id Результат: 14 FULL OUTER JOIN К левой таблице присоединяются все записи из правой, соответствующие условию (по правилам inner join), плюс все невошедшие записи из правой таблицы, поля левой таблицы заполняются значениями NULL и плюс все не вошедшие записи из левой таблицы, поля правой таблицы заполняются значениями NULL SELECT * FROM Person FULL OUTER JOIN City ON Person.CityId = City.Id Результат: 19. Язык SQL. Предикаты раздела WHERE. Предложение WHERE содержит предикат, который может включать одно или несколько выражений и принимать одно из трех значений: TRUE, FALSE или UNKNOWN. Сравнение значения NULL с другим значением (в том числе и NULL) дает результат UNKNOWN. Другие значения сравниваются в соответствии с последовательностями сортировки для строк текста, с порядком числовых значений для числовых типов, хронологическим порядком для данных типа дата-время или по величине значения (для данных типа INTERVAL). Сравнения осуществляются с помощью операторов =, <, <=, >, >= и <> (не равно). В большинстве случаев вместо простых выражений можно использовать конструкторы значений строк. B BETWEEN A AND C Это выражение эквивалентно: (A<=B) AND (B<=C). Параметр A должен быть меньше C. Выражение B BETWEEN С AND A будет интерпретироваться как (C<=B) AND (B<=A), и оно имело бы значение FALSE при значении выражения (A<=B) AND (B<=C) равном TRUE, за исключением случая, когда все три величины одинаковы. Если один из параметров равен NULL, значение предиката не определено. A IN (C, D, …) Это выражение будет истинным, если A равняется одному из значений, включенных в список. A LIKE ‘строка’ В этом случае подразумевается, что A - строка символов, и операция заключается в поиске указанной подстроки. При этом можно использовать строку фиксированной длины или строку с шаблоном подстановки. A IS NULL Это выражение проверяет, является ли A значением NULL, В отличие от большинства других предикатов результат данного предиката может быть только TRUE или FALSE (не UNKNOWN). A оператор_сравнения SOME | ANY подзапрос SOME и ANY имеют одинаковый смысл. Результатом подзапроса является набор величин. Если для какогонибудь значения X, получаемого из подзапроса, результат операции «А оператор_сравнения X» равняется TRUE, то предикат ANY также равен TRUE. 15 A оператор_сравнения ALL подзапрос Исполняется так же, как и ANY, но для всех значений X, получаемого из подзапроса, результат операции «А оператор_сравнения X» должен равняться TRUE. EXISTS подзапрос Если в результате подзапроса найдена хотя бы одна строка, предикат равняется TRUE, в противном случае FALSE. Результат никогда не может быть UNKNOWN. Это выражение имеет смысл только для зависимого подзапроса. 20. Язык SQL. Группировка и условия раздела HAVING. Группировка Предложение GROUP BY используется для определения групп выходных строк, к которым могут применяться агрегатные функции (COUNT, MIN, AVG и т.д.). Если это предложение отсутствует и используются агрегатные функции, то все столбцы с именами, упомянутыми в SELECT, должны быть включены в агрегатные функции, и эти функции будут применяться ко всему набору строк, которые удовлетворяют запросу. В противном случае все столбцы списка SELECT, не вошедшие в агрегатную функцию, должны быть "сгруппированы" с помощью предложения GROUP BY. Все выходные строки запроса, которые сгруппированы по равенству значений столбцов, образуют единую группу (для GROUP BY все значения NULL трактуются, как равные). Агрегатная функция будет применяться к каждой из таких групп. Рассмотрим простой пример: SELECT snum, AVG (amount), MAX (amount) FROM Salespeople GROUP BY snum; Все записи с одинаковыми значениями snum (имя продавца) образуют группу, и на выходе SELECT вычисляются максимальные и средние значения для каждой группы. Предложение HAVING Если предложение WHERE определяет предикат для фильтрации строк, то предложение HAVING применяется после группировки для определения аналогичного предиката, фильтрующего группы по значениям агрегатных функции. Это предложение необходимо для проверки значений, которые получены с помощью агрегатной функции не из отдельных строк декартова произведения, определенного к предложении FROM, а из групп таких строк. Поэтому такая проверка не может содержаться в предложении WHERE. Не используйте это выражение для определения того, что должно быть определено в WHERE! SELECT col_name FROM tbl_name HAVING col_name > 0; <- неправильно! Следующий оператор определяет общую и среднюю сумму продаж для каждого продавца за каждый день, исключая дни. когда общая сумма продаж продавца меньше $100.00. SELECT snum, SUM (amount), AVG (amount), odate FROM Orders WHERE odate BETWEEN '10-01-1992' AND '10-01-1994' GROUP BY snum, odate HAVING SUM (amount) > 100.00; 21. Язык SQL. Порядок анализа SELECT-запроса СУБД. SELECT [ ALL | DISTINCT ] select_item_commalist FROM table_reference_commalist [ WHERE conditional_expression ] [ GROUP BY column_name_commalist ] [ HAVING conditional_expression ] [ ORDER BY order_item_commalist ] [LIMIT [offset,] rows] Рассмотрим порядок анализа SELECT-запроса: 1. FROM - определяет одну или несколько таблиц, из которых извлекаются данные; 2. WHERE - определяются критерии, которым должны удовлетворять строки, чтобы их можно было использовать для получения результата; 3. GROUP BY - используется для определения групп выходных строк, к которым могут применяться агрегатные функции. Все выходные строки запроса, которые сгруппированы по равенству значений столбцов, образуют единую группу; 4. HAVING - определяет критерии, которым должны удовлетворять группы строк, чтобы их можно было поместить в выходные данные с помощью запроса; 5. SELECT - анализ ключевых слов ALL и DISTINCT и формирование результата. Если в спецификации раздела SELECT отсутствует ключевое слово DISTINCT, или присутствует ключевое слово ALL, либо отсутствуют и ALL, и DISTINCT, то текущая таблица, полученная в результате выполнения пунктов 1-4, является результатом 16 выполнения раздела SELECT. В противном случае на завершающей стадии выполнения раздела SELECT в результирующей таблице удаляются строки-дубликаты. 6. ORDER BY - располагает результаты в заданном порядке; 7. LIMIT - может использоваться для ограничения количества строк, возвращенных командой SELECT. LIMIT принимает один или два числовых аргумента. Эти аргументы должны быть целочисленными константами. Если заданы два аргумента, то первый указывает на начало первой возвращаемой строки, а второй задает максимальное количество возвращаемых строк. При этом смещение начальной строки равно 0 (не 1). 22. Язык SQL. Средства авторизации доступа к данным. Метод авторизации доступа, используемый в SQL, относится к мандатным видам защиты данных. При этом подходе с каждым зарегистрированным в системе пользователем (субъектом) и каждым защищаемым объектом системы связывается мандат, определяющий действия, которые может выполнять данный субъект над данным объектом. В отличие от такого подхода, при применении дискреционного метода ограничения доступа с каждым из объектов системы связывается одна или несколько категорий пользователей, каждой из которых позволяются или запрещаются некоторые действия над объектом. В языке SQL (SQL:1999) предусмотрены возможности контроля доступа к разным объектам базы данных, в том числе к следующим объектам: ● таблицам; ● столбцам таблиц; ● представлениям; ● триггерам; ● подпрограммам, вызываемым из SQL; ● определенным пользователями типам; ● и др. Роль идентифицирует динамически образуемую группу пользователей системы баз данных, каждый из которых обладает, во-первых, привилегией на исполнение данной роли и, во-вторых, всеми привилегиями данной роли для доступа к объектам базы данных. Другими словами, наличие ролей упрощает построение и администрирование системы авторизации доступа. Для создания новой роли используется оператор CREATE ROLE: CREATE ROLE role_name [ WITH ADMIN { CURRENT_USER | CURRENT_ROLE } ] Имя создаваемой роли должно отличаться от любого идентификатора авторизации, уже определенного и сохраненного в базе данных. В случае успешного создания роли некоторый authID получает привилегию на исполнение данной роли. Если в операторе CREATE ROLE не содержится раздел WITH ADMIN , то привилегию на исполнение роли получает текущий идентификатор пользователя SQL-сессии, если значение этого идентификатора отлично от NULL ; иначе привилегия на исполнение роли дается текущему имени роли сессии. Если в состав оператора включается раздел WITH ADMIN , то можно выбрать, будет ли являться владельцем роли authID , соответствующий текущему идентификатору пользователя SQL-сессии, или authID , соответствующий текущему имени роли (при условии, что соответствующие текущий идентификатор или текущее имя не содержат NULL ). Кроме того, включение этого раздела означает, что authID -владелец роли получает право на передачу привилегии исполнения данной роли другим authID. Существующую роль можно ликвидировать с помощью оператора DROP ROLE role_name Передача привилегий 17 В случае передачи привилегий используется следующий синтаксис оператора GRANT : GRANT { ALL PRIVILEGES | privilege_commalist } ON privilege_object TO { PUBLIC | authID_commalist } [ WITH GRANT OPTION ] [ GRANTED BY { CURRENT_USER | CURRENT_ROLE } ] privilege ::= SELECT [ column_name_commalist ] | DELETE | INSERT [ column_name_commalist ] | UPDATE [ column_name_commalist ] | REFERENCES [ column_name_commalist ] | USAGE | TRIGGER | EXECUTE privilege_object ::= [ TABLE ] table_name | DOMAIN domain_name | CHARACTER SET character_set_name | COLLATION collation_name | TRANSLATION translation_name Передача ролей Для передачи ролей используется следующий вариант оператора GRANT: GRANT role_name_commalist TO { PUBLIC | authID_commalist } [ WITH ADMIN OPTION ] [ GRANTED BY { CURRENT_USER | CURRENT_ROLE } ] Изменение текущих идентификаторов пользователей и имен ролей Для изменения текущего идентификатора пользователя SQL-сессии может использоваться оператор SET SESSION AUTHORIZATION value_specification Для смены текущего имени роли SQL-сессии можно использовать оператор SET ROLE { value_specification | NONE } Выполнение SET ROLE NONE приводит к тому, что значение текущего имени роли сессии становится неопределенным. Аннулирование привилегий и ролей Для аннулирования привилегий используется оператор: REVOKE [ GRANT OPTION FOR] privilege_commalist ON privilege_object FROM { PUBLIC | authID_commalist } [ GRANTED BY { CURRENT_USER | CURRENT_ROLE } ] { RESTRICT | CASCADE } Вариант оператора REVOKE , используемый для аннулирования ролей, выглядит следующим образом: REVOKE [ ADMIN OPTION FOR ] role_name_commalist FROM { PUBLIC | authID_commalist } [ GRANTED BY { CURRENT_USER | CURRENT_ROLE } ] { RESTRICT | CASCADE } 23. Язык SQL. Средства управления транзакциями. Транзакция - группа последовательных операций, которая представляет собой логическую единицу работы с данными. Транзакция может быть выполнена либо целиком и успешно, соблюдая целостность данных и независимо от параллельно идущих других транзакций, либо не выполнена вообще и тогда она не должна произвести никакого эффекта. Транзакции обрабатываются транзакционными системами, в процессе работы которых создаётся история транзакций. Транзакции обладают следующими свойствами: ● Атомарность. Это свойство означает, что результаты всех операций, успешно выполненных в пределах транзакции, должны быть отражены в состоянии базы данных, либо в состоянии базы данных не должно быть отражено действие ни одной операции (конечно, здесь речь идет об операциях, изменяющих состояние базы данных). ● Согласованность . В классическом смысле это свойство означает, что транзакция может быть успешно завершена с фиксацией результатов своих операций только в том случае, когда действия операций не нарушают целостность базы данных, т.е. удовлетворяют набору ограничений целостности, определенных для этой базы данных. Это свойство расширяется тем, что во время выполнения транзакции разрешается устанавливать точки согласованности и явным образом проверять ограничения целостности. 18 ● Изоляция. Требуется, чтобы две одновременно выполняемые транзакции никоим образом не действовали одна на другую. Другими словами, результаты выполнения операций транзакции T1 не должны быть видны никакой другой транзакции T2 до тех пор, пока транзакция T1 не завершится успешным образом. Уровни изоляции: 1. Неподтверждённое чтение (Read Uncommitted, Dirty Read, грязное чтение) — чтение незафиксированных изменений своей транзакции и параллельных транзакций, возможны нечистые, неповторяемые чтения и фантомы 2. Подтверждённое чтение (Read Committed) — чтение всех изменений своей транзакции и зафиксированных изменений параллельных транзакций, нечистые чтения невозможны, возможны неповторяемые чтения и фантомы; 3. Повторяемое чтение (Repeatable Read, Snapshot) — чтение всех изменений своей транзакции, любые изменения, внесённые параллельными транзакциями после начала своей, недоступны, нечистые и неповторяемые чтения невозможны, возможны фантомы; 4. Упорядоченный — (Serializable, сериализуемый) — упорядоченные (сериализуемые) транзакции. Идентичен ситуации, при которой транзакции выполняются строго последовательно, одна после другой, то есть результат действия которых не зависит от порядка выполнения шагов транзакции (запрещено чтение всех данных, изменённых с начала транзакции, в том числе и своей транзакцией). Фантомы невозможны. Чем выше уровень изоляции, тем больше требуется ресурсов, чтобы их поддерживать. По умолчанию в большинстве баз данных используется уровень 1. ● Долговечность . После успешного завершения транзакции все изменения, которые были внесены в состояние базы данных операциями этой транзакции, должны гарантированно сохраняться, даже в случае сбоев аппаратуры или программного обеспечения. Средства языка SQL по управлению транзакциями (реализованные в MySQL): START TRANSACTION [WITH CONSISTENT SNAPSHOT] BEGIN [WORK] COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE] ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE] SET autocommit = {0 | 1} START TRANSACTION или BEGIN - начинают новую транзакцию; COMMIT - подтверждает выполнение транзакции; ROLLBACK - отменяет выполнение транзакции, все изменения откатываются; AND CHAIN - создает новую транзакцию как только заканчивается текущая, новая транзакция имеет такой же уровень изоляции как только что завершившаяся; RELEASE - завершает текущую сессию для клиента после завершения транзакции; Ключевое слово NO используемое вместе с CHAIN или RELEASE может быть полезно если системная переменная completion_type по умолчанию установленная на создание новой транзакции или закрытие текущей сессии. SET autocommit - включает или отключает режим автоматического завершения транзакций для текущей сессии, по умолчанию включен. После выполнения START TRANSACTION отключается до завершения транзакции или ее отмены. START TRANSACTION; SELECT @A:=SUM(salary) FROM table1 WHERE type=1; UPDATE table2 SET summary=@A WHERE type=1; COMMIT; 19