Вордовские лекции (1121814), страница 4
Текст из файла (страница 4)
Таблица для конъюнкции:
& | true | false | unknown |
true | true | false | unknown |
false | false | false | false |
unknown | unknown | false | unknown |
!!!Лектор не любит, когда путают конъюнкцию и дизъюнкцию, и когда забывают их значки
!!!При рассмотрении реляционной модели про Microsoft говорить нельзя
Базы данных 28.09.06
Реляционная модель данных
Дейта сначала проповедовал бога Кодда, а потом впал в ересь.
Страшнее зверя, чем многозначная логика, не бывает.
Решение: возможность расширять ТД специальными значениями. При сравнениями с другими типами дают false, с собой — true.
Если на типе данных поддерживается порядок, то легко вывести свойство, что любое значение меньше максимального и больше минимального. Выделенное значение равно и максимальному, и минимальному. И в результате Дейте, скорее всего, доказали, что это не проходит.
2 года назад пришла идея соратнику Дейта Хью Гаррелу. предположим, что только в одном атрибуте могут находиться неопределённые значения. Тогда можно ввести два отношения. Не проходит ситуация, когда встречаются и когда не знаю, и когда неприменимо, но в этом случае можно завести несколько отношений.
Критерий хороших идей — они простые.
Это работает хорошо, но только в теории. Ибо сколько потребуется дополнительных полей, если в каждом может быть неопределённое значение.
Неопределённые соотношения в текущем SQL:
В нём есть ситуации, когда
-
Null comp_op V = unknown
-
Null = Null ≡ true — дубликат
-
Null = Null ≡ false — если их пересчитывают
Не надо верить, что врождённые пороки можно исправить на уровне ПО.
Ограничения реляционной модели
Ограничения сущности
Для каждой переменной отношения должен существовать хотя бы один возможный ключ и ни в одном значении соотв отношения, ни в одном кортеже этот ключ не должен содержать неопределённого отношения.
Единственный вопрос, который можно задать на экзамене – почему должен существовать хотя бы один ключ.
Ограничения ссылок
-
«Внешний» ключ (foreign key)
С термином «ключ» связано много различных эпитетов. Очень хорошим критерием, когда человек отвечает на экзамене — он не понимает, какой природы ключ.
Пусть есть R1(a1, a2, ..., an) R2(b1, b2, ..., bn)
пусть b1 — возможный ключ
аi — внешний ключ, если при любом значении ai существует b1 — внешний ключ или ссылка.
Существует операция эквисоединения, которая позволяет по ai найти кортеж с соответствующим b1.
Как звучит ссылочное ограничение у Кодда: для любого значения внешнего ключа либо существуют совпадающее с ним значение первого (возможного) ключа, либо значение внешнего ключа является полностью неопределённым (NULL).
SQL не соотв реляционной модели. В нём можно определить таблицу, в которой вообще нет возможного ключа.
-
Дубликаты
Лектор написал маленькую полезную статью Дубликаты, неопределённые значения и другие экзотические прелести SQL.
Дубликаты возникли ещё в System R в IBM под надзором Кодда. Они появились не потому, что они были идиоты или хотели принести гадость миру, а потому, что если у кортежа при выборке не нужен возможный ключ, могут получатся дубликаты.
Лектор утверждает: Дубликаты в результате запроса никому не нужны.
В соотв с моделью дубликаты надо было бы уничтожать. Но это БД. И одно из свойств БД — очень большие объёмы. Могут быть гигабайты данных. Универсальный способ — отсортировать, а это очень дорогая операция, самая дорогая, которая существует в СУБД. И поэтому мультимножества разрешены в SQL. Но и сохранять их тоже можно. Но если их можно получить в результате запроса, то и другими способами тоже можно добавлять.
Лет 10–15 назад лектору нужно было прочитать курс по стандарту SQL, а из подручных материалов ничего, кроме SQL Server, не было. Лектор был ужасно удивлён, когда он увидел демонстрационную БД, в которой половина таблиц определена без возможного ключа. Людей в этом отношении надо воспитывать, и БД надо делать по-человечески.
Вторая возможность SQL: возможность определения возможного ключа с неопределённым значением. И если n возможных ключей, то 2n могут иметь неопределённые значения.
-
Правила сопоставления внешнего ключа с возможным
У Кодда — либо ссылается, либо не ссылается. В SQL — simple (...), partial (...), full (...).
Одна ссылка может указывать на несколько строк, если внешняя ссылка объявлена как partial.
Ограничения целостности
Спрашивается, как соблюдать ограничения целостности.
Внешние ключи: всё достаточно просто работает при вставке. Проблема, когда кортеж изменяется или меняется. Способы решения:
-
Каскадное удаление
-
Запретить удалять, пока есть потомки
-
Детей объявлять беспризорниками
Ещё одна возможность в SQL: куда-нибудь пристроить детей.
Алгебра
На время рассказа про средства манипулирования данными забыть про неопределённые значения.
В алгебре Кодда 10 операций. Делятся на группы:
-
Теоретико-множественные операции
1.1. Объединение (union)
1.2. Пересечение (intersect)
1.3. Вычитание (minus)
1.4. Декартово произведение (times)
-
Специальные реляционные операции
2.1. Ограничение (where)
2.2. Проекция (project)
2.3. Соединение (join). Одна из самых неприятных ошибок на экзамене — перепутать объединение и соединение. Операция соединения — элементами результата являются конкатенации кортежей, степень результата будет (n+m), а количество кортежей сколько получится
2.4. Деление (divide by)
-
Дополнительные операции
3.1. Присваивание — не совсем операция, но без неё трудно. В обычных ЯП это просто перенос результата, в БД же это гигантские куски внешней памяти. Как сказал Гайсарян, последней модой принято считать, что с каждой переменной связано некое абстрактное местоположение, единственным свойством которого является то, что в него можно записать, и оттуда считать. В БД присваивание связывает выражение с именем
3.2. Переименование. У Кодда не было, придумал Дейта. Эта операция очень важная. Позволяет взять отношение и переименовать атрибут.
Более содержательный рассказ
union, intersect, minus
Основной смысл этих операций понятен. Отношение — это множество, по идее, можно было бы применять эти операции к любым двум отношениям как к множествам. Например, применяем операцию к R1(a1, b1) и R2(a2, c2, d2). Мы получили бы множество, но оно не было бы отношением. Это нехорошо, потому что мы хотим построить не алгебру множеств, а алгебру отношений. Вообще,чем замечательны алгебры? Тем, что они строятся таким образом, что в любом месте, где можно использовать значение, можно использовать выражение, которое это значение производит. Посему требование, что результатом любого действия должно быть отношение. Отсюда ограничение на операнды, которое называется условием совместимости по объединению. Звучит оно так. Операндами этих операций могут быть только операнды, которые обладают одинаковыми схемами. Но в этом случае мы никогда не могли бы объединить R1(a1, b1) с R2(a2, b2). Как раз здесь начинают работать операции переименования. Почти совместимость — два операнда почти совместимы, если их заголовки обладают одинаковыми степенями, и мы можем составить взаимо однозначное соответствие между атрибутами, тогда мы можем привести операнды в соответствие, применив нужное количество раз операцию переименования. До Дейты плохо жили люди. Один из выходов — использование точечной нотации. То есть считали, что атрибуты были вида R1.a1, R2.b2. Но при этом операции объединения не были бы коммутативны, так как возникал вопрос, как именовать атрибуты результата. Но это не алгебра, так как нельзя применить операцию к любым элементам множества.
Декартово произведение
ДП — если есть два множества A{a} и B{b}, то по определению ДП А и В — множество всех возможных упорядоченных пар A×B = {(a, b)}, где a из A, b из B.
В реляционной модели эта операция не имеет смысла. Поэтому Кодд ввёл понятие расширенного ДП. Если есть R1(a1...an), R2(b1...bn), то в результате ДП получаем (a1...an, b1...bn). Фактически это объединение. Всегда ли можно выполнять эту операцию? Требуются отношения, у которых пересечение множества атрибутов пусто. Для расширенного ДП можно сделать любые отношения разными при помощи операции переименования. Если использовать точечную нотацию, то получаются громоздкие имена.
Избыточность этих трёх операций
Три операции избыточны, минус выбросить нельзя, потому что он некоммутативный, можно выбросить пересечение.
R Where condition
По определению это условие вычисляется для каждого кортежа операнда, и в результат попадают только те кортежи, для которых условие истинно.
R where (cond1&cond2) == (R where cond1) intersect (r where cond2)
R where (cond1|cond2) == (R where cond1) plus (r where cond2)
not R where (cond1) == R ninus (r where cond1)
Базы данных 29.09.06
Проекция
Есть отношение R(a1, …, an), тогда проекцией R PROJECT (ai1, …, aim) является схема, в тело отношения которой попадают кортежи, фактически из каждого кортежа выбираются атрибуты, образуются кортежи, степень которых меньше. Результатом являются отношения, посему дубликатов быть не должно. На самом деле операция сложная, так как могут получиться дубликаты, а их быть не должно. Для их удаления требуется дорогая операция сортировки. Лектор рекомендует почитать про алгоритмы внешней сортировки у Кнута или Вирта, но у Вирта хуже и меньше. Некоторый материал есть на www.citforum.ru, автор — лектор.
С точки зрения лектора, именно сложность алгоритма сортировки привела к тому, что есть в SQL. Не даром люди придумали теорию множеств, и там всё красиво и хорошо, если отступают, то получается всякая фигня.
Соединение
Бывает несколько видов соединений:
-
Соединение общего вида (theta-соединение)
-
Эквисоединения
-
Естественные соединения
В SQL есть порядка 14 видов соединений, и одно антисоединение, но эти самые важные.
Соединение общего вида потому и называется соединением общего вида, что включает в себя все виды соединений, кроме внещних соединений. Соед общ вида – операция вторичная, то есть выражается через другие, и определяется следующим образом - tcnm R1(a1...an), R2(b1...bm), причсем к ним должна быть применима операция расширенного декартового проезвидения (пересечение отношений схем пусто). R1 theta-JOIN R2 == R(a1...an, b1...bn). Эквивалентно (R1 TIMES R2) WHERE theta cond(a...ain,bj1...bjl), то есть ограничение расшир декартового произвед операндов. Это хорошее определение для математики, но плохое для программирования, так как создаётся впечатление, что так и надо реализовывать.
С точки зрения математики, нельзя перебрать элементы, можно только выяснить, входит элемент или нет. ТЗ Лектора: программирование принято называть наукой, но это не та наука, как математика, физика, биология и т. д.. Физики, математики, биологи работают для того, чтобы обогощать результатами математику,... Программирование же помогает другим людям со своими задачами. Это очень прикладная обцласть, не смотря на все фундаментальные вещи Так что это скорее, не раздел науки, а раздел инжинерии (ударение на предпоследний слог). И некоторые луди очень стесняются слова инжинерия, инжинер. Инжинерия требует практического созидания. Очень трудно жить с таким мировоззрением, так как денег не дают.
//Лектор любит, когда определения говорят лаконично
//Не надо говорить, что схемы не пересекаются. Пересечь можно всё, но результат может быть пуст или нет
Это очень фундаментальное определние, но оно очень не конструктивно.
В нашей области мы можем говорить про некоторые циклы. Ввёл это понятие ..., который ввёл цикл FOR EACH, который выдаёт каждый элемент, пока они не кончатся. В отличие от математики – множества хроанимы, и в каком-то порядке элементы лежат, поэтому нет такого множества, для которого нельзя перебрать элементы ав том порядкЕ, в котором они лежат в памяти. Если бы не это, то вообще нельзя было бы работать с мультимножествами.