Скачать 0.73 Mb.
|
- (объединение, пересечение и разность, соответственно). Операции применимы только к парам файлов, имеющих одинаковую структуру (схему отношения базы данных).
ПРИМЕР.(A:1,B:2)*(B:2,C:3)=(A:1,B:2,C:3); (A:1,B:2)*(C:3,D:4)=(A:1,B:2,C:3,D:4) - в случае файлов без одноименных полей, операция применима к каждой паре записей; (A:1,B:2)*(B:3,D:4) - к такой паре записей операция не применима.
ПРИМЕР. Пусть R - файл с полями (A,B), S - файл с полем (A), T=(RS) - будет файлом с полем (B): B T A S ПРИМЕР. Решение вышерассмотренной задачи «о крупных поставках» описывается реляционным выражением: [ImPst,Kol](Psts*([(KDet=1010)&(Kol>1000)]Pst))
Базовые (элементарные) формулы:
константа сравнения константа имеет смысл «поле A записи r (или константа) имеет значение больше (меньше, равно...), чем поле B записи s (или константа)». Формулы общего вида - строятся из базовых с помощью операций:
Смысл формул без кванторов известен по языку Паскаль - это логические выражения с операциями AND(),OR() и NOT(). Смысл кванторных формул - для фиксированных значений других (кроме r) переменных:
ПРИМЕЧАНИЕ. С некоторыми оговорками (уточнениями, в которых используется операция естественного соединения - декартова произведения) имеют место следующие соответствия:
Запрос НАЙТИ{(r.A,...s.B,...)/rR,sS...}F имеет смысл:
ПРИМЕР. Вышеприведенный рисунок, иллюстрирующий операцию деления T=(RS), соответствует запросу T=НАЙТИ{t.B/tR} sS rR ((r.B=t.B)(r.A=s.A)) ПРИМЕР. Решение вышерассмотренной задачи «о крупных поставках» описывается запросом реляционного исчисления кортежей: НАЙТИ{(r.ImPst,s.Kol)/rPsts,sPst} (r.KPst=s.KPst)(s.KDet=1010)(s.Kol>1000) ПРИМЕР. Найти имена поставщиков, которые поставляют все красные детали. Переформулируем постановку задачи, явно оговорив неявное и явно выделив кванторы: найти имена таких поставщиков, что для каждой детали, если она красная, то существует договор о поставке этой детали этим поставщиком. Устранив импликацию (AB)(AB), получим: найти имена таких поставщиков, что для каждой детали - либо она не красная, либо существует договор о поставке этой детали этим поставщиком. Запрос реляционного исчисления кортежей. НАЙТИ{(r.ImPst)/rPsts} detDet ((det.Cvet#'КРАСНЫЙ') dogDog ((dog.KDet=det.KDet)(dog.KPst=r.KPst))) Реализация этого запроса на SQL потребует устранения -квантора с помощью эквивалентностей x A(x) x A(x) и (AB) AB. В итоге получим формулировку, не удовлетворяющую требованиям языка реляционного исчисления кортежей, но семантически эквивалентную и подходящую для реализации на SQL: НАЙТИ{(r.ImPst)/rPsts} detDet ((det.Cvet='КРАСНЫЙ') dogDog ((dog.KDet=det.KDet)(dog.KPst=r.KPst))) SELECT Psts.ImPst FROM Psts WHERE NOT EXISTS (SELECT * FROM Det WHERE (Det.Cvet='Красный') AND NOT EXISTS (SELECT * FROM Dog WHERE (Dog.KDet=Det.KDet) AND (Dog.KPst=Psts.KPst))) Схема (лобовой) реализации этого запроса традиционными средствами уровня языка Паскаль. Структуру запроса можно представить диаграммой: Учитывая, что семантически
b:=false; RESET(File); WHILE NOT b AND NOT EOF(File) DO BEGIN READ(File,x); b:=B(x) END
b:=true; RESET(File); WHILE b AND NOT EOF(File) DO BEGIN READ(File,x); b:=B(x) END В итоге получаем программу: DBLEC\PRG01\Project1.dpr NewTable.Close; NewTable.EmptyTable; NewTable.Open; DetTable.Open; DogTable.Open; PstsTable.Open; PstsTable.First; WHILE NOT PstsTable.EOF DO BEGIN {aDet:= detDet Условие(r,det)} aDet:=true; DetTable.First; WHILE aDet AND NOT DetTable.EOF DO BEGIN aDet:=(DetTable.FieldByName('Cvet'). AsString<>’Красная’); IF NOT aDet THEN BEGIN {aDet:=eDog:= dogDog Условие(r,det,dog)} eDog:=false; DogTable.First; WHILE NOT eDog AND NOT DogTable.EOF DO BEGIN eDog:=(DogTable.FieldByName('KDet').Value= DetTable.FieldByName('KDet').Value)AND (DogTable.FieldByName('KPst').Value= PstsTable.FieldByName('KPst').Value); DogTable.Next END; aDet:=eDog END; DetTable.Next END; IF aDet THEN BEGIN NewTable.Append; NewTable.FieldByName('ImPst').Value:= PstsTable.FieldByName('ImPst').Value; NewTable.Post; END; PstsTable.Next; END; NewTable.Close; Поскольку (KPst,KDet) является первичным ключом для таблицы Dog (а значит имеется соответствующий индекс), то выделенный жирным курсивом фрагмент можно заменить на: aDet:=(DetTable.FieldByName('Cvet'). AsString<>’Красная’) OR DogTable.FindKey([PstsTable.FieldByName('KPst').Value, DetTable.FieldByName('KDet').Value]); Выражение реляционной алгебры. [ImPst](Psts*(([KPst,KDet]Dog) ([KDet]([Cvet='КРАСНЫЙ']Det)))) Схема (в лоб) соответствующей программы:
Воспользуемся представлениями (View), чтобы связать имя W1 с рабочим файлом промежуточных вычислений. (*) CREATE VIEW W1 AS SELECT KDet FROM Det WHERE Cvet='КРАСНЫЙ'
CREATE VIEW W2 AS SELECT KPst,KDet FROM Dog
Деление реализуется довольно громоздко, т.к. оно имеет -определение: W3=(W2W1) = НАЙТИ{(r.KPst)/rW2} sW1 tW2 ((t.KDet=s.KDet)(t.KPst=r.KPst)) Согласно этому определению его можно реализовать, как было описано выше. Внимание. В этом запросе W2 используется два раза НАЙТИW2 и W2. В SQL эта проблема решается с помощью псевдонима: CREATE VIEW W3 AS SELECT W2.KPst FROM W2 WHERE NOT EXISTS (SELECT * FROM W1 WHERE NOT EXISTS (SELECT * FROM W2 psevdonimW2 WHERE (psevdonimW2.KDet=W1.KDet) AND (psevdonimW2.KPst=W2.KPst))) В ObjectPascal эта проблема решается с помощью двух объектов типа TTable, управляющих доступом к таблице W2. Например, W2aTable – для работы во внешнем цикле, и W2bTable – для работы во внутреннем цикле.
SELECT Psts.ImPst FROM Psts,W3 WHERE Psts.KPst=W3.KPst Однако ж окончательный ответ можно было получить уже на предыдущем шаге, т.к. [ImPst](Psts*W3) = НАЙТИ{(r.ImPst)/rPsts} sW1 tW2 ((t.KDet=s.KDet)(t.KPst=r.KPst)) Решение задачи «о поставщиках красных деталей» в СУБД FoxPro см. DBL(FOX).doc
Фактически проектирование начинается уже в фазе анализа требований и продолжается в фазе реализации. Принято различать уровни (этапы, стадии) проектирования и соответствующих моделей.
|
Аис поз Установка. Обновление версии. Резервное копирование базы данных. Восстановление базы данных. 5 |
Windows Банк Клиент Инструкция по переходу на версию 1 Для перехода на версию 1 с предыдущих версий системы Банк-Клиент нужно сначала выполнить установку новой версии с созданием пустой... |
||
Финансовая разведка Тем не менее, криминальный рынок полон объявлений, предлагающих приобрести по сходной цене базы данных мвд, гибдд, сотовых операторов,... |
Инструкция по обновлению фк цз Фк цз в администрирование, в авторизации набрать admin, пароль hcadmin. В главном меню выбрать «Операции» – «Резервное копирование... |
||
Инструкция по обновлению фк рир Фк рир в администрирование, в авторизации набрать admin, пароль hcadmin. В главном меню выбрать «Операции» – «Резервное копирование... |
Пояснительная записка Студент Организация данных. Sql дает пользователю возможность изменять структуру представления данных, а также устанавливать отношения между... |
||
Пояснительная записка Студент Организация данных. Sql дает пользователю возможность изменять структуру представления данных, а также устанавливать отношения между... |
Методические указания к курсовой работе по дисциплине Базы данных... Дисциплина «Базы данных» для направления 230700. 62 «Прикладная информатика» подготовки бакалавра |
||
Методические указания к практическим работам по дисциплине «Базы данных» Методические указания предназначены для проведения практических занятий по дисциплине «Базы данных», для специальности ксиК |
Пер с англ. — М. Издательский Архитектура системы баз данных 65 Глава Введение в реляционные базы данных 92 |
||
Инструкция по установке и работе с программой заполнение базы данных В настоящем документе представлена краткая инструкция пользователю по установке и работе с программой Заполнение базы данных студентов... |
Лекция Язык sql 46 вставка одного запроса внутрь другого 68 как работает... Эти базы данных создаются и функционируют под управлением специальных программных комплексов, называемых системами управления базами... |
||
Методические указания для выполнения лабораторных работ и «Базы данных» Лабораторная работа №1 «Организация хранения данных в субд ms access» |
3. Заполнение базы данных, модификация данных На предыдущем этапе... ... |
||
Лабораторная работа №1: Создание баз данных В этой утилите можно выполнить типовые задачи обслуживания баз данных, такие как резервирование и восстановление. Здесь можно настраивать... |
Программа дисциплины «Информатика» Е дисциплины «Информатика» учебным планом отводится 200 часов, в том числе лекционные занятия – 34 часов, лабораторные работы – 72... |
Поиск |