Вордовские лекции (1121814), страница 7
Текст из файла (страница 7)
QUEL использовался в университете Кэмбридж (Ingres). - Стоунбрейкер
Alpha - был первый декларативный язык лектора.
Этот язык был сильно математизированный. Про это можно почитать, но, спасибо Кристоферу Дейте, который написал пересказ Коддовских статей, две из которых перевёл лектор.
В SQL есть доно свойство, которое люди хвалт, но оно удручает временами. В нём разрешается писать вложенные подзапросы в разных местах. Но в языке ещё есть кванторы. В этом случае они себя ведут по-дурацки, ибо пишется целый запрос, который вырабатывает да или нет. В QUEL кванторы можно писать без подзапросов.ы
//Педедыв
В основе исчислений, самое дазовое понятие – переменная. Так как мы говорим про исчисление кортежей, то кортежная переменная. Чтобы можно было ими пользоваться, их нужно объявлять (ситаксис QUEL):
RANGE a IS r //a.b
Правильно построенная формула (Well-Formal Formula):
Простое условие – правильно формула, в скобках – простое условие:
СЛУЖАЩИЙ.СЛУ_НОМ = 2934
СЛУЖАЩИЙ.СЛУ_НОМ = ПРОЕКТ.ПРОЕКТ_РУК
Конструкции:
NOT, AND, OR, IF ... THEN
IF a THEN b = NOT a OR b;
Читатель нашёл у меня ошибку, но, естественно, он был не прав.
Из лжи следует всё, что угодно
Иногда формулировка с помощью импликаций выглядит заманчиво, затягивает, она и в sQL есть.
Приоритеты: NOT > AND > OR
если for m – WFF, сопр-простое сравнение
NOT form, comp AND form? Comp OR form, IF comp THEN form – WFF
Есть правильно построенная формула. Мы хотим определить формулу истинности, то есть те выражения, которые приводят её в TRUE. Мы довольно долго думали, и в результате придумали использовать вложенные циклы.
Следующий шаг – прямого аналога в алгебре нет – квантор.
Функция, Аргумент – множество, вырабатывает тру или фолс.
Поддерживается два квантора:
Квантор существования EXISTS
FORALL
EXISTS var(form), FORALL var(form) – WFF
Свободные и связанные переменные
Переменные, которые ни разу не встречаются под знаком квантора, называются свободными.
Связанные переменные – закрытые, только под квантором, влияют на способ вычисления формулы.
Пусть есть формула:
есть СЛУ1 и СЛУ2, определены на отношении СЛУЖАЩИЕ
Формула:
EXISTS СЛУ2(СЛУ1.СЛУ_ЗАРП > СЛУ2.СЛУ_ЗАРП) – все с неминимальной зарплатой.
Циклы:
foreach СЛУ1
foreach СЛУ2
FORALL СЛУ2(СЛУ1.СЛУ_ЗАРП >= СЛУ2.СЛУ_ЗАРП) – все с максимальной зарплатой.
Нет условия на несравнение с самим собой, ибо это не влияет.
Здесь точно внутринний цикл будет крутиться до конца, ибо квантор такой.
В одну формулу может входить несколько подформул, в которые одна и та же связанная переменная может входить в разном качестве.
EXISTS СЛУ2(СЛУ1.ПРО_НОМ = СЛУ2.ПРО_НОМ AND СЛУ1.СЛУ_НОМ != СЛУ2.СЛУ_НОМ) AND FORALL СЛУ2(IF СЛУ1.ПРО_НОМ = СЛУ2.ПРО_НОМ THEN СЛУ1.СЛУ_ЗАРП = СЛУ2.СЛУ_ЗАРП)
Нельзя обойтись одним вхождением, ибо нужны и квантор существования, и квантор всеобщности.
SQL и вложенные запросы:
Кванторы появились в SQL не так давно.
QUEL был лучше, чем SQL. Но SQL его загубил.
Зато в SQL очень давно существуют другие агрегатные функции (возвращают халявное значание, а получают множество) – COUNT, MINIMUM, MAXIMUM, AVERAGE. Для использования их нужно сформировать множество, то есть использовать подзапрос. В SQL мы с тем же самым успехом могли написать
min СЛУ2.СЛУ_ЗАРП
QUEL позволяет обходиться ьез подзапросов, когда они не нужны. Когда доберемся до System R, нам расскажут ещё про вложенные запросы. Языки рел исчисления, в отличие от SQL, позволяют для квантифицуированных запросов обойтись без подзапросов.
Что осталось сделать:
Научились строить формулы, в которых есть свободные переменныею Не хватает конструкции, которая говорит, что мы хотим получить.
БД 12.10.06
Три варианта
Целевой список (target list)
var.attr var_имя свобю переменной WFF
var == var.attr1, Var.attr2, ... , var.attrn – порядок не важен, в SQL не так.
new_name = vaar.attr – аналог RENAME
target_list WHERE WFF – выражение реляционного исчисления, аналог проекции
Та интерпретация которую лектор называет наивной, работает. Это не просчто интерпретация, это семантика.
При такой интерпретации много шагов, каждый шаг – шаг цикла. Это результирующее отношение строится кусочками, за каждый проход добавляется один кортеж. На кажом шаге мы знаем, откуда взялся кортеж -результат. Легко преобразовать язык запросов в язык обновлений. Вместо того, чтобы написать, что я хочу найти ..., можно сказать выкинуть, и эта операция будет однозначно интерпретирована. Над выражениями реляционной алгебры написать DELETE или UPDATE написать гораздо сложнее, Потому что надо пройти назад и понять, откуда взялось это выражение.
В реляционном исчислении это понятно и очевидно, ибо мы знаем, откуда всё взылось.
С одной стороны, эта штука декларативная, ибо пишем процедуру, с другой стороны он позволяет операцию отображения произвести.
Один из пунктов борьбы Дейты с SQL является механизм курсоров. В результате запросов получаются таблицы. Обычные ЯП не имеют средств работы с таблицами. По этому поводу в SQL принято компромиссное решение – вставить средство, которое позволяет итерировать таблицы, что позволяет обходить результат по одному кортежу. Очень многие средства для изменения базы данных завязан на механиз курсоров. Почему – потому что можно сказать системе, кого я имею в виду, когда говорю что-то делать. Пояему это Дейта ругает – в язык, который является реляционным мы втыкаем вещи, которые свсем опперёк. Здесь же, несморя на реляционность, внутри содержится понятие курсора, что позволяет менять таблицу.
Ещё олдин вид исчисления – исчисление доменов
Лектор не помнит, откуда пошло это нозвание, ибо у Кодда было исчисление доменов.
Основное отличие от языка исчисления кортежей в том, что облдасть определения переменной – множество значений ТД, в кортежах – отношение, там кортеж – составное значение, здесь атомарное.
Всё строится аналогично.
Отличия: как привязывается это исчисление к БД. Вводится специальный вид предикатов.
R-n-арное отношение – принимает тру тогда и только тогда, когда входит в какой-либо кортеж текущего значения R.
R{ai1 : vi1 (константа переменная), ai2 : vi2, ..., a1m : vim}
Это можно было бы расширисть сравнениями или регэкспами, ибо шаблон, но это и так достаотчно мощное вещь.
Многие годы люди очень часто называли аттрибуты доменами. В больших БД очень нетривиально придумать хорошие названия для аттрибутов и столцов. С другой стороны, когда предлагалось понятие домена – ввести семантику на уровне типов данных. То есть когда хочу иметь дело с коровами, и хочу работать с длиной хвоста и весом, то важно понимать, что это семантически разные вещи, и вес с длиной складывать нельзя. И логиячно было бы назвать домен также, как и атрибут, ибо совместно они нигде не использовались. Давным давно это рекомменндация действует – есди имён хватает, то для имён оменных переменных можно использовать имена столбцов.
Запрос:
СЛУЖАЩИЕ
WFF - <2934, 'Иванов', 22400.00, 1>
СЛУЖАЩИЕ (СЛУ_НОМ: 2934, СЛУ_ИМЯ: 'Иванов', СЛУ_ЗАРП: 22400,00, ПРО_НОМ: 1)
Тут можно ставить предикаты, кванторы и т д, над такими формулами строятся выражения, и в них учавствуют имена доменных переменных, и они все разные.
Запрос служащих с неминимальной з/п:
СЛУ_НОМ, СЛУ_ИМЯ WHERE EXISTS СЛУ_ЗАРП1(СЛУЖАЩИЕ(СЛУ_ЗАРП1) AND СЛУЖАЩИЕ(СЛУ_НОМ, СЛУ_ИМЯ, СЛУ_ЗАРП) AND СЛУ_ЗАРП>СЛУ_ЗАРП1)
Мойше Zluf придумал запрос по образцу – Query_by_example – первый язык графического изображения запросов к БД. Этот язык по мощности превосходит и язык рел алгебры, и исчисл кортежеи, ибо он умудрился создать рекурсивные запросы.
Первый графич язык – Query By Forms – фактически был Query by Example, с выброшенной рекурсией. Поячему он так попёр? Потому что никто из нормальных людей не пишет запросы на SQL.
Почему победили реляционные БД- для реляционных БД из-за их плоской структуры можно делать графические языки запросов без хороших терминалов.
Злуф жив, здоров и невредим, выпустил новый язык – Programming By Example – очень утопическая идея. Есть большой репозиторий заготовок, и трудно подобрать то, чот нужно. Есть идея в том, что пишется шаблон программы, по которому система подбирает заготовки, из которых собирается программа. Никаких практических шагов по реализации шагов не видно.
Закончили реляционную модель данных, с чем лектор нас и поздравляет.
//педедыв
Проектирование реляционных БД
Проектирование путём нормализации
Подход заключаетс в том, что БД представляется в виде таблиц, как взбредёт в голову, и потом нормализируются.
Подход на основе семантических моделей
Фактически про способы проектирования более комфортном, когда не нужно возиться с табличными представлениями, а процесс проектирования в некоей графической нотации, в которой можно сохранить о предметной области – той области внешнего мира, что нужно представить в машине, и не теряется связь с предметной областью. Высокой науки нет.
У лектора зазвони телефон.
Если БД содержит порядка 20-30 таблиц, то её надо проектировать, используя обычные ручные средства. Если 100 таблиц, то нужно использовать комбинации, рисовалки, но не их интеллект. Если в БД тысячи таблиц, там деваться уже некогда.
Если не доволишь хороший проект до конца и отдаёшь его другому, то он всё равно умудряется его изгадить.
Лектор видел объявление в хорошей фирме, где обязательным требованием было прослушивание его курса.
Проектирование путём нормализации
-
Элементы теории
-
Нормальные фромы
Элементы теории: книги Мейера, но её лектор не советует читать.
В основе всей теории лежит понятие зависимости.
Зависимости
-
Функциональные
-
Многозначные
-
Проекции/соединения – небинарные соответствия
Есть некоторый набор фактов, который касается зависимостей. На праактике абсолютно идеальные БД получаются с учётом наиболее простых зависимостей – функциональных.
Если в Китае, нет в Китае нельзя говорить, в Северной Корее одному человеку соответствует одна чашка риса в день, то это функциональная зависимость. Если ему её не дать, то он без неё умрёт, И это трагедия для страны – образуется лишний рис.
Все преподаватели курса БД на ВМК пользуются одними и теми же учебниками – это насилие, это неестественное требование.
Если учитываем зависимости проекции/соединения, то получим идеальную БД, но это определить нельзя, это от Бога, но он на такие мелочи внимания не обращает и очень трудно добиться от него такой справки.
Функциональные зависимости
Лектор избегает рекурсии, но она пронизывает весь мир и от неё надо отбиваться. Ибо наличие рекурсии очень осложняет понимание.
Есть отношение r – regular, x, y – аттрибуты
Существует функционгальная зависимость x от y z.x -> z.y (у функ зависит от х, ...) Если для каждого значения х в точсности имеется одно значение у.
СЛУ_НОМ | СЛУ_ИМЯ | СЛУ_ЗАРП | ПРО_НОМ | ПРОЕКТ_РУК |
2934 | Иванов | 22400 | 1 | Иванов |
2935 | Петорв | 29600 | 1 | Иванов |
2936 | Сидоров | 18060 (было 18000) | 1 | Иванов |
2937 | Федоров | 21000 | 1 | Иванов |
2938 | Иванов | 22500 | 1 | Иванов |
2939 | Сидоренко | 18000 | 2 | Иваненко |
2940 | Федоренко | 20000 | 2 | Иваненко |
2941 | Иваненко | 22000 | 2 | Иваненко |
СЛУ_НОМ -> СЛУ_ИМЯ