Тверской государственный университет
Опубликован: 21.08.2007 | Доступ: свободный | Студентов: 3170 / 267 | Оценка: 4.08 / 3.92 | Длительность: 15:40:00
ISBN: 978-5-9556-0110-6
Специальности: Программист, Математик
Лекция 8:

Логика предикатов и базы данных

< Лекция 7 || Лекция 8: 123 || Лекция 9 >

Запросы

Пользователи извлекают информацию из баз данных с помощью запросов. Реляционная алгебра позволяет формулировать запросы в виде соответствующих выражений. Однако их синтаксис не очень удобен для непрофессиональных пользователей. Поэтому современные системы управления базами данных используют языки с более простым и понятным синтаксисом. Одним из самых популярных таких языков является язык SQL (Structured Query Language - Структурный Язык Запросов). Сейчас он служит стандартным языком запросов для всех промышленных баз данных. Мы опишем здесь лишь простую форму основного оператора этого языка SELECT (ВЫБРАТЬ). Она имеет вид:

SELECT <список полей (атрибутов)>
FROM   <список таблиц>
WHERE  <условия выбора>,

где <список полей ( атрибутов )> - список тех полей (или атрибутов ) таблиц, значения которых будут входить в результаты запроса, <список таблиц> - список таблиц, из которых берутся значения полей (если некоторые из них имеют поля с одинаковыми именами, то их именуют как <имя таблицы>.<имя поля>), <условия выбора> - условия, которым должны удовлетворять выбираемые значения полей, они представляют из себя бескванторную формулу, построенную из атомных формул, в которых логические знаки \neg , \wedge , \vee заменены на их английские аналоги NOT, AND, OR, соответственно. В качестве переменных используются имена полей, в качестве предикатов для числовых полей используются отношения порядка: >, \ge, <, <=. В термах для числовых полей можно применять арифметические функции +, -, *, /. В термах для полей других типов обычно бывает можно использовать некоторый набор стандартных функций соответствующих типов.

Пусть, например, мы хотим получить для базы данных из примера 8.5 список фамилий всех сотрудников, работающих на 2-ом этаже. Соответствующий запрос выглядит так:

SELECT ФИО
FROM   Сотрудники, Комнаты
WHERE Номер = НомерСотрудника AND Этаж = 2.

Нетрудно построить формулу логики предикатов, реализующую этот запрос:

\varphi_1=\exists Номер \existsОтдел \exists Должность \exists Оклад  \exists НомерСотрудника \exists Этаж  \\
\exists НомерКомнаты [ (Сотрудники(Номер, ФИО, Отдел, Должность, Оклад)\wedge \\
 \wedge Комнаты(НомерСотрудника, Этаж, НомерКомнаты) ) \\ \wedge 
(( Номер = НомерСотрудника ) \wedge (Этаж = 2))].

В качестве переменных в этой формуле используются имена полей ( атрибутов ) таблиц. Свободными переменными являются выбираемые поля (в списке после SELECT ). Все остальные переменные связаны кванторами существования в кванторной приставке. Матрица формулы состоит из конъюнкции двух формул: первая представляет собой конъюнкцию предикатов-таблиц, а вторая - это формула из условий выбора. Построенная таким образом формула определяет множество состояний, на которых она истинна, а каждое из этих состяний задает набор значений свободных переменных формулы, т.е. тех полей, о которых задан запрос. Этот набор и является ответом на запрос (результатом запроса).

В нашем случае, \varphi _{1} истинна на состояниях со значениями ФИО Иванов А.А и Сидорова М.И., которые и являются ответом на исходный запрос.

Рассмотрим еще один пример. Пусть необходимо получить список сотрудников планового отдела и комнат, в которых они трудятся. Запрос на SQL выглядит так:

SELECT ФИО, НомерКомнаты
 FROM Сотрудники, Комнаты
 WHERE Номер = НомерСотрудника AND Отдел = "плановый".

По описанным выше правилам построим формулу логики предикатов, реализующую этот запрос. При этом заменим имена связанных переменных более короткими.

\varphi_2=\exists x_1\ \exists x_2\ \exists x_3\   \exists x_4 \ \exists x_5\ \exists x_6[(Сотрудники\\(x_1, ФИО, x_2, x_3, x_4)\ \wedge 
Комнаты(x_5, x_6, НомерКомнаты) )\wedge\\
((x_1 = x_5)\ \wedge\ (x_2 =\  "плановый"))].

Эта формула истинна на состояниях со следующими парами свободных переменных (ФИО, НомерКомнаты) (мы представили их в виде новой таблицы):

ФИО НомерКомнаты
Сидоров Н.П. 27
Горев С.В. 7

Таким образом, описанные выше SQL-запросы являются ни чем иным, как "синтаксическим сахаром", за которым скрываются формулы логики предикатов весьма специального вида (такие формулы называются \exists -формулами). Имеются и более сложные формы SQL-запросов, которым соответствуют формулы логики предикатов более общего вида. Но в любом случае SQL-запросы не выходят за рамки логики предикатов.

Ограничения целостности

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

  • ограничение на ключи: в таблице не должно быть двух строк с одинаковым значением некоторого поля (оно назывется ключом). В общем виде ограничение на ключи утверждает, что в таблице не должно быть двух строк с одинаковыми значениями нескольких заданных полей (такой набор полей также называется ключом таблицы);
  • ограничение на ссылки : значение некоторого поля в одной таблице должно быть среди значений некоторого поля в другой таблице. Это ограничение не позволит удалить из второй таблицы запись, на которую имеется ссылка из первой таблицы;
  • ограничение на значение : значение некоторого поля в таблице должно удовлетворять заданному условию (принадлежать определенному интервалу, быть больше (меньше) заданного числа, быть строкой длины не больше (не меньше) заданной, быть строкой, удовлетворяющей некоторому образцу и т.п.).

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

  1. В таблице Сотрудники ключом является поле Номер:

    \Phi_1=\forall  Номер\ \forall x\ \forall y\ \forall z\ \forall v\ \forall x_1\ \forall y_1\ \forall z_1\ \forall v_1 [(Сотрудники\\( Номер, x, y, z, v) \wedge \  Сотрудники( Номер, x_1, y_1, z_1, v_1)) \rightarrow \\( (x=x_1)\ \wedge\ (y = y_1)\ \wedge\  
(z = z_1)\ \wedge\ (v = v_1))].
  2. Каждый сотрудник, для которого определена комната в таблице Комнаты, должен присутствовать в таблице Сотрудники:

    \Phi_2= \forall  НомерСотрудника\ \forall x\ \forall y [ Комнаты\\(НомерСотрудника, x, y) \rightarrow \\ 
\exists z\  \exists u\  \exists v\  \exists w ( Сотрудники( Номер, z, u, v, w)\ \wedge \ ( Номер= \\ 
 НомерСотрудника))].
  3. Оклад каждого сотрудника должен лежать в интервале (1000, 25000):

    \Phi_3=\forall x\ \forall y\ \forall z\ \forall v\ \forall  Оклад\ (Сотрудники( x, y, z, v,  Оклад)\ \rightarrow\\ \indent ( (1000 <  Оклад)\ \wedge\ ( Оклад < 25000))).

Задачи

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

Задача 8.2. Пусть имеются отношения R и S со схемами R(A1, ..., An, B1, ..., Bm) и S(B1, ..., Bm), соответственно. Частным R \div S от деления отношения R на отношение S называется отношение с атрибутами A1, ..., An , каждый кортеж которого t в соединении с любым кортежом s отношения S входит в R. Постройте выражение реляционной алгебры, эквивалентное R \div S, и формулу логики предикатов, выражающую это отношение.

Задача 8.3. Напишите SQL-запросы и соответствующие формулы для получения информации из базы данных (Сотрудники, Комнаты) из примера 8.5 и получите ответы на эти запросы.

  • Найти всех сотрудников с окладом больше 5500.
  • Найти все отделы, в которых есть сотрудники с окладом > 8000.
  • Составить список должностей и получаемых по ним окладов.
  • Составить список сотрудников торгового отдела, получающих зарплату от 6000 до 6500 и работающих не на 3-ем этаже.
  • Составить список комнат, в которых есть сотрудники с окладом меньше 5500 или больше 7500.

Задача 8.4. Определите, какие из приведенных ограничений целостности \Phi _{1}, \Phi _{2}, \Phi _{3} выполняются для приведенного выше состояния базы данных (Сотрудники, Комнаты).

Задача 8.5. Напишите формулы, выражающие следующие ограничения целостности для базы (Сотрудники, Комнаты), и определите, какие из них выполняются для приведенного выше ее состояния.

  • В таблице Комнаты набор полей (НомерСотрудника, Комната) является ключом.
  • Для каждого сотрудника из таблицы Сотрудники в таблице Комнаты определено его место работы.
  • Номера всех комнат на 2-ом этаже больше 10, но меньше 20, а номера всех комнат на 3-ем этаже больше 20.
< Лекция 7 || Лекция 8: 123 || Лекция 9 >
Елена Алексеевская
Елена Алексеевская

Это в лекции 3.

Татьяна Дембелова
Татьяна Дембелова

Почему в вводной лекции курса Основы дискретной математики одним из свойств отношения частичного порядка упоминается антирефлексивность? Посмотрела в других источниках, там -0  рефлексивность... http://ru.wikipedia.org/wiki/%D0%9E%D1%82%D0%BD%D0%BE%D1%88%D0%B5%D0%BD%D0%B8%D0%B5_%D0%BF%D0%BE%D1%80%D1%8F%D0%B4%D0%BA%D0%B0