http://*****/database/dblearn/image175.gif

Это частный случай операции общего соединения.

Иногда, для операции http://*****/database/dblearn/image156.gif-соединения применяют следующий, более короткий синтаксис:

http://*****/database/dblearn/image176.gif

Пример 8. Рассмотрим некоторую компанию, в которой хранятся данные о поставщиках и поставляемых деталях. Пусть поставщикам и деталям присвоен некий статус. Пусть бизнес компании организован таким образом, что поставщики имеют право поставлять только те детали, статус которых не выше статуса поставщика (смысл этого может быть в том, что хороший поставщик с высоким статусом может поставлять больше разновидностей деталей, а плохой поставщик с низким статусом может поставлять только ограниченный список деталей, важность которых (статус детали) не очень высока).

Номер поставщика

Наименование поставщика

X

(Статус поставщика)

1

Иванов

4

2

Петров

1

3

Сидоров

2

Таблица 13 Отношение A (Поставщики)

Номер детали

Наименование детали

Y

(Статус детали)

1

Болт

3

2

Гайка

2

3

Винт

1

Таблица 14 Отношение B (Детали)

Ответ на вопрос "какие поставщики имеют право поставлять какие детали?" дает http://*****/database/dblearn/image156.gif-соединение http://*****/database/dblearn/image177.gif:

Номер поставщика

Наименование поставщика

X

(Статус поставщика)

Номер детали

Наименование детали

Y

(Статус детали)

1

Иванов

4

1

Болт

3

1

Иванов

4

2

Гайка

2

1

Иванов

4

3

Винт

1

2

Петров

1

3

Винт

1

3

Сидоров

2

2

Гайка

2

3

Сидоров

2

3

Винт

1

Таблица 15 Отношение "Какие поставщики поставляют какие детали"

НЕ нашли? Не то? Что вы ищете?

Естественное соединение

Определение 10. Пусть даны отношения http://*****/database/dblearn/image184.gifи http://*****/database/dblearn/image185.gif, имеющие одинаковые атрибуты http://*****/database/dblearn/image186.gif(т. е. атрибуты с одинаковыми именами и определенные на одинаковых доменах).

Тогда естественным соединением отношений http://*****/database/dblearn/image104.gifи http://*****/database/dblearn/image35.gifназывается отношение с заголовком http://*****/database/dblearn/image187.gifи телом, содержащим множество кортежей http://*****/database/dblearn/image188.gif, таких, что http://*****/database/dblearn/image189.gifи http://*****/database/dblearn/image190.gif.

Естественное соединение настолько важно, что для него используют специальный синтаксис:

http://*****/database/dblearn/image191.gif

Замечание. В синтаксисе естественного соединения не указываются, по каким атрибутам производится соединение. Естественное соединение производится по всем одинаковым атрибутам.

Замечание. Естественное соединение эквивалентно следующей последовательности реляционных операций:

Переименовать одинаковые атрибуты в отношениях Выполнить декартово произведение отношений Выполнить выборку по совпадающим значениям атрибутов, имевших одинаковые имена Выполнить проекцию, удалив повторяющиеся атрибуты Переименовать атрибуты, вернув им первоначальные имена

Замечание. Можно выполнять последовательное естественное соединение нескольких отношений. Нетрудно проверить, что естественное соединение (как, впрочем, и соединение общего вида) обладает свойством ассоциативности, т. е.

http://*****/database/dblearn/image192.gif

поэтому такие соединения можно записывать, опуская скобки:

http://*****/database/dblearn/image193.gif

Пример 10. В предыдущем примере ответ на вопрос "какие детали поставляются поставщиками", более просто записывается в виде естественного соединения трех отношений http://*****/database/dblearn/image194.gif(для удобства просмотра порядок атрибутов изменен, это является допустимым по свойствам отношений):

Номер поставщика

PNUM

Наименование поставщика

PNAME

Номер детали

DNUM

Наименование детали

DNAME

Поставляемое количество

VOLUME

1

Иванов

1

Болт

100

1

Иванов

2

Гайка

200

1

Иванов

3

Винт

300

2

Петров

1

Болт

150

2

Петров

2

Гайка

250

3

Сидоров

1

Болт

1000

Таблица 20 Отношение P JOIN PD JOIN D

Деление

Определение 11. Пусть даны отношения http://*****/database/dblearn/image195.gifи http://*****/database/dblearn/image196.gif, причем атрибуты http://*****/database/dblearn/image197.gif- общие для двух отношений. Делением отношений http://*****/database/dblearn/image104.gifна http://*****/database/dblearn/image106.gifназывается отношение с заголовком http://*****/database/dblearn/image198.gifи телом, содержащим множество кортежей http://*****/database/dblearn/image199.gif, таких, что для всех кортежей http://*****/database/dblearn/image200.gifв отношении http://*****/database/dblearn/image104.gifнайдется кортеж http://*****/database/dblearn/image201.gif.

Отношение http://*****/database/dblearn/image104.gifвыступает в роли делимого, отношение http://*****/database/dblearn/image106.gifвыступает в роли делителя. Деление отношений аналогично делению чисел с остатком.

Синтаксис операции деления:

http://*****/database/dblearn/image202.gif

Замечание. Типичные запросы, реализуемые с помощью операции деления, обычно в своей формулировке имеют слово "все" - "какие поставщики поставляют все детали?".

Пример 11. В примере с поставщиками, деталями и поставками ответим на вопрос, "какие поставщики поставляют все детали?".

В качестве делимого возьмем проекцию http://*****/database/dblearn/image203.gif, содержащую номера поставщиков и номера поставляемых ими деталей:

Номер поставщика

PNUM

Номер детали

DNUM

1

1

1

2

1

3

2

1

2

2

3

1

Таблица 21 Проекция X=PD[PNUM, DNUM]

В качестве делителя возьмем проекцию http://*****/database/dblearn/image204.gif, содержащую список номеров всех деталей (не обязательно поставляемых кем-либо):

Номер детали

DNUM

1

2

3

Таблица 22 Проекция Y=D[DNUM]

Деление http://*****/database/dblearn/image205.gifдает список номеров поставщиков, поставляющих все детали:

Номер поставщика

PNUM

1

Таблица 23 Отношение X DEVIDEBY Y

Оказалось, что только поставщик с номером 1 поставляет все детали.

Зависимые реляционные операторы

Как было сказано в начале главы, не все операторы реляционной алгебры являются независимыми - некоторые из них выражаются через другие реляционные операторы.

Оператор соединения

Оператор соединения определяется через операторы декартового произведения и выборки. Для оператора естественного соединения добавляется оператор проекции.

Оператор пересечения

Оператор пересечения выражается через вычитание следующим образом:

http://*****/database/dblearn/image218.gif

Оператор деления

Оператор деления выражается через операторы вычитания, декартового произведения и проекции следующим образом:

http://*****/database/dblearn/image219.gif

Таким образом показано, что операторы соединения, пересечения и деления можно выразить через другие реляционные операторы, т. е. эти операторы не являются примитивными.

Примитивные реляционные операторы

Оставшиеся реляционные операторы (объединение, вычитание, декартово произведение, выборка, проекция) являются примитивными операторами - их нельзя выразить друг через друга.

Оператор декартового произведения

Оператор декартового произведения - это единственный оператор, увеличивающий количество атрибутов, поэтому его нельзя выразить через объединение, вычитание, выборку, проекцию.

Оператор проекции

Оператор проекции - единственный оператор, уменьшающий количество атрибутов, поэтому его нельзя выразить через объединение, вычитание, декартово произведение, выборку.

Оператор выборки

Оператор выборки - единственный оператор, позволяющий проводить сравнения по атрибутам отношения, поэтому его нельзя выразить через объединение, вычитание, декартово произведение, проекцию.

Операторы объединения и вычитания

Доказательство примитивности операторов объединения и вычитания более сложны и мы их здесь не приводим.

Запросы, невыразимые средствами реляционной алгебры

Несмотря на мощь языка реляционной алгебры, имеется ряд типов запросов, которые принципиально нельзя выразить только при помощи операторов реляционной алгебры. Это вовсе не означает, что ответы на эти запросы нельзя получить вообще. Просто, для получения ответов на подобные запросы приходится применять процедурные расширения реляционных языков.

Дополнительные операции реляционной алгебры,предложенные Дейтом, включают следующие операции.
 Операция переименования позволяет изменить имя атрибута отношения и имеет вид:
 RENAME <исходное отношение> <старое имя атрибута> AS <новое имя атрибута>, где <исходное отношение> задается именем отношения либо выражением реляционной алгебры.
 В последнем случае выражение заключают в круглые скобки. Например:
 RENAME Город_П AS Город_размещения_Поставщика.
 Замечание.
 Для удобства записи выражений одновременного переименования нескольких атрибутов Дейтом введена операция множественного переименования, которая представима следующим образом:
 RENAME <отн.> <ст. имя атр.1> AS <нов. имя атр.1>,<ст. имя атр.2> AS <нов. имя атр.2>,... ,<ст. имя arp. N> AS <нов. имя aTp. N>.
 Операция расширения порождает новое отношение, похожее на исходное, но отличающееся наличием добавленного атрибута, значения которого получаются путем некоторых скалярных вычислений. Операция расширения имеет вид:
 EXTEND <исходное отношение> ADD <выражение> AS <новый атрибут>, где к исходному отношению добавляется (ключевое слово ADD) <новый атрибут>, подсчитываемый по правилам, заданным <выражением>.
 Исходное отношение может быть задано именем отношения и с помощью выражения реляционной алгебры, заключенного в круглые скобки. При этом имя нового атрибута не должно входить в заголовок исходного отношения и не может использоваться в <выражении>. Помимо обычных арифметических операций и операций сравнения, в выражении можно использовать различные функции, называемые итоговыми, такие как:
 COUNT (количество), SUM (сумма), AVG (среднее), МАХ (максимальное), MIN (минимальное).
 Например:
 EXTEND (PJOIN SP) ADD (Вес * Количество) AS Общий_Вес.
 Замечания.
http://*****/Index.files/bb1.jpgПользуясь операцией расширения, можно выполнить переименование атрибута. Для этого нужно в выражении указать имя атрибута, в конструкции AS определить новое имя этого атрибута, затем выполнить проекцию полученного отношения на множество атрибутов, исключая старый атрибут. Таким образом, запись (EXTEND S ADD Город_П AS Город) [П#, Имя, Статус, Город] эквивалента конструкции S RENAME Город_П AS Город.
http://*****/Index.files/bb1.jpgПодобно тому, как это сделано для операции переименования, Дейт определил операцию множественного расширения, которая позволяет в одной синтаксической конструкции вычислять несколько новых атрибутов. Формально операция пред-ставима следующим образом:
 EXTEND <отн.> ADD <выр.1> AS <атр.1>, <выр.2> AS <атр.2>,... ,<выр. N> AS <атр. N>.
 Операция подведения итогов SUMMARIZE выполняет "вертикальные" или групповые вычисления и имеет следующий формат:
 SUMMARIZE <исх. отн> BY (<список атрибутов;") ADD <выр.> AS <новый атрибут>, где исходное отношение задается именем отношения либо заключенным в круглые скобки выражением реляционной алгебры, <список атрибутов> представляет собой разделенные запятыми имена атрибутов исходного отношения A1, A2, ..., AN, <выр.> - скалярное выражение, аналогичное выражению операции EXTEND, а <новый атрибут> - имя формируемого атрибута.
 В списке атрибутов и в выражении не должен использоваться <новый атрибут>.
 Результатом операции SUMMARIZE является отношение R с заголовком, состоящим из атрибутов списка, расширенного новым атрибутом. Для получения тела отношения R сначала выполняется проецирование (назовем проекцию R1) исходного отношения на атрибуты A1, A2,..., AN, после чего каждый кортеж проекции расширяется новым (N+1)-M атрибутом. Поскольку проецирование, как правило, приводит к сокращению количества кортежей по отношению к исходному отношению (удаляются одинаковые кортежи), то можно считать, что происходит своеобразное группирование кортежей исходного отношения: одному кортежу отношения R1 соответствует один или более (если было дублирование при проецировании) кортежей исходного отношения. Значение (N+1)-гo атрибута каждого кортежа отношения R формируется путем вычисления выражения над соответствующей этому кортежу группой кортежей исходного отношения.
 Пример 8. Подведение итогов.
 Пусть требуется вычислить количество поставок по каждому из поставщиков.

SUMMARIZE SP BY (П#) ADD COUNT AS Количество_поставок

П#

Количество_поставок

S1

6

S2

2

S3

1

S4

3

 Отметим, что функция COUNT определяет количество кортежей в каждой из групп исходного отношения.
 Операция множественного подведения итогов, подобно соответствующим операциям переименования и расширения, выполняет одновременно несколько "вертикальных" вычислений и записывает результаты в отдельные новые атрибуты. Простейшим примером такой операции может служить следующая запись:
 SUMMARIZE SP BY (Д#) ADD SUM Количество AS Общее_число_прставок AVG Количество AS Среднее_число_поставок.
 К основным операторам, позволяющим изменять тело существующего отношения, отнесем операции:
http://*****/Index.files/bb1.jpgреляционного присвоения,
http://*****/Index.files/bb1.jpgвставки,
http://*****/Index.files/bb1.jpgобновления,
http://*****/Index.files/bb1.jpgудаления.
 Операцию присвоения можно представить следующим образом:
 <выражение-цель>:= <выражение-источник>, где оба выражения задают совместимые (точнее, эквивалентные) по структуре отношения.
 Типичный случай выражений: в левой части - имя отношения, а в правой - некоторое выражение реляционной алгебры. Выполнение операции присвоения сводится к замене предыдущего значения отношения на новое (начальное значение, если тело отношения было пустым), определенное выражением-источником.
 С помощью операции присвоения можно не только полностью заменить все значения отношения-цели, но и добавить или удалить кортежи. Приведем пример, в котором в отношение S дописывается один кортеж:
 S:=S UNION {{< П# : 'S6' >, < Имя: 'Борис' >, < Статус: '50' >, <Город_П : 'Мадрид' >}}.
 Более удобными операциями изменения тела отношения являются операции вставки, обновления и удаления.
 Операция вставки INSERT имеет следующий вид:
 INSERT <выражение-источник> INTO <выражение-цель>, где оба выражения должны быть совместимы по структуре.
 Выполнение операции сводится к вычислению <выражение-источник> и вставке полученных кортежей в отношение, заданное <выражение-цель>. Пример:
 INSERT (S WHERE Город_П='Москва') INTO Temp.
 Операция обновления UPDATE имеет следующий вид:
 UPDATE <выражение-цель> <список элементов>, где <список элементов> представляет собой последовательность разделенных запятыми операций присвоения <атрибут> := <скалярное выражение>.
 Результатом выполнения операции обновления является отношение, полученное после присвоения соответствующих значений атрибутам отношения, заданного целевым выражением.
 Например, UPDATE P WHERE Тип='каленый' Город := 'Киев'. Эта операция предписывает изменить значение атрибута Город (независимо от того, каким оно было) на новое значение - 'Киев' таких кортежей отношения P, атрибут Тип которых имеет значение 'каленый'.
 Операция удаления DELETE имеет следующий вид:
 DELETE <выражение-цель>, где <выражение-цель> представляет собой реляционное выражение, описывающее удаляемые кортежи.
 Например, DELETE S WHERE Статус < 20.
 Операция реляционного сравнения может использоваться для прямого сравнения двух отношений. Она имеет синтаксис:
 <выражение1> ? <выражение2>, где оба выражения задают совместимые по структуре отношения, а знак? - один из следующих операторов сравнения: = (равно), ? (не равно), < (собственное подмножество), < (подмножество), >. (надмножество), > (собственное надмножество).
 Например, сравнение: "Совпадают ли города поставщиков и города хранения деталей?" можно записать так:
  S [Город_П] = Р [Город_Д].

В теории баз данных известно, что исходное отношение может быть получено из набора соответствующих ему нормализованных путем их естественного соединения [6]. Причем, в силу коммутативности и ассоциативности операции соединения, порядок их соединения не имеет значения.

Таким образом, (3) примет вид:

q = (EXTEND (r1 JOIN r2, JOIN … JOIN rs) ADD f(A1, A2, …, Ak) AS N) [ L, N ] (4)

Полученное соотношение позволяет вести расчет величины n множеству абонентов, используя для этого не отдельные значения характеристик, а их множества. Другими словами при расчете программа оперирует не с отдельными значениями переменных, а с векторами, составленными из множества значений одного атрибута, взятых для всех абонентов. Такой подход позволяет сократить количество операций чтения/записи и тем самым повысить скорость выполнения операции в целом. Поясним этот факт следующими рассуждениями.

4. Проектирование БД с использованием классической теории нормализации. Определение функциональной зависимости. Определение полной функциональной зависимости. Ключи и суперключи. Замыкание множества зависимостей. Аксиомы Армстронга. Правила вычисления замыкания. Проблемы проектирования реляционных схем – аномалии модификации. Нормальные формы, определение. Первая нормальная форма, вторая нормальная форма, третья нормальная форма, нормальная форма Бойса-Кодда. Многозначная зависимость, четвертая нормальная форма, взаимоотношение нормальных форм.

Задача проектирования базы данных методом нормализации

Умаров Амантур Амангельдыевич, администратор баз данных,
фирма АББА (Республика Казахстан, г. Туркестан)

В данной работе описывается задача проектирования базы данных частного предприятия с использованием классического метода — метода нормализации. В ходе проектирования основное внимание уделяется вопросам оптимизации структур данных, что играет немаловажную роль при разработке коммерческих приложений.

Введение.

Данная статья посвящена анализу проектирования базы данных частного предприятия. В качестве инструмента моделирования структуры данных использован метод нормализации. Этот метод считается фундаментальным и широко используется на практике.

Базы данных (БД) составляют в настоящее время основу компьютерного обеспечения информационных процессов, входящих практически во все сферы человеческой деятельности. Тематика СУБД поистине безгранична и многогранна.

Хотя многие считают, что реляционные СУБД, являясь наиболее распространенным современным аппаратом построения информационных систем, не представляют уже интереса в научном отношении, остается еще много не решенных или частично решенных проблем. Об этом свидетельствует поток статей, посвященных тематике чисто реляционных систем, а также активная деятельность компаний-производителей коммерческих реляционных систем, стремящихся улучшать свои продукты и придавать им новые качества. Продолжающая работа исследователей затрагивают вопросы оптимизации запросов, новых алгоритмов выполнения реляционных отношений, оптимизации структур данных и другие аспекты, непосредственно определяющие эффективность СУБД [1]

В предлагаемой статье сделана попытка решения вопроса оптимизации структур данных. Понятие «оптимизация структуры данных» обозначает спроектировать такую систему базы данных, структура данных которой должна быть предельно простой и понятной. А именно этот критерий является одним из самых важных критериев разработки коммерческих приложений (банковских систем, Интернет - магазинов, систем электронных платежей, и т. д.), поскольку позволяет программе занимать совсем малую память и выполнять запросы быстрее.

Постановка задачи.

Одной из типичных задач проектирования коммерческих приложений может быть задача об организации работы предприятия (фирмы), занимающейся продажей компьютерной техники. Для этого, на мой взгляд, необходимо ответить на эти вопросы:

Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 9 10 11 12 13 14