FROM zakaz, dogovor, postav
WHERE (zakaz.nomer_dogovora=dogovor.nomer_dogovora)
AND (postav.nomer_postav=dogovor.nomer_postav)
Рассмотрим четыре операции над отношениями [20]:
¨ Селекция;
¨ Проекция;
¨ Теоретико-множественное объединение;
¨ Соединение.
Селекция (selected_on – подвергнутые селекции по) уменьшает количество строк в таблице, и ее можно представить как результат разрезания таблицы по горизонтали и удаления ненужных кортежей. Формально селекция записывается так:
R selected_on [<предикат>] {синтаксис языка запросов (SQL)}
Здесь <предикат> - это логическое выражение, которое может содержать сравнения значений одних атрибутов со значениями других в том же кортеже или с константами. В результате сохраняются только строки, удовлетворяющие <предикату>.
Операция селекции соответствует программам, которые выбирают записи из файлов и печатают эти записи. Однако условия отбора могут относится только к отдельно взятым записям. Например, невозможно выбрать запись, исходя из того, что значение какого-либо ее поля равно или больше, чем значение этого поля в предидущей записи. В действительности почти невозможно смоделировать поведение автомата с конечным числом состояний, который изменяет свое состояние для каждой записи, изменяя тем самым критерии отбора для следующей записи.
Проекция (projected_to – спроецированное на) уменьшает количество столбцов в таблице; данную операцию можно представить себе как разрезание по вертикали название операции имеет своим источником понятие проекции множества точек N-мерного пространства в пространство с меньшим количеством измерений. Например, в результате проекции множества точек плоскости (Х,У) на ось Х получается множество точек, расположенных на этой оси. К сожалению, значения проекций некоторых “точек” могут совпадать; это произойдет в том случае, когда проекция удалит столбец, входящий в ключ, так что оставшиеся части двух “укороченных” кортежей могут быть идентичными. Тогда придется удалить дубликаты и тем самым уменьшить количество строк, т.е. размер БД. Если хотя бы один из возможных ключей при выполнении проекции останется незатронутым, то дубликатов не будет.
Формально проекция записывается следующим образом:
R projected_to <имя-атрибута>{, <имя-атрибута>}
Где список <имен-атрибутов> означает имена сохраняемых столбцов.
Операция проекции соответствует программе отбора несколько иного рода, чем операция селекции, а именно, она печатает определенные поля из каждой записи. Удаление дубликатов обычно достигается в результате сортировки записей по требуемым полям, после чего записи пропускаются до тех пор, пока не изменится значение поля. На практике при одном просмотре файла операция проекции обычно происходит с операцией селекции.
Теоретико-множественное объединение (union) имеет два операнда; она берет строки двух таблиц и размещает их друг за другом, формируя одну длинную таблицу. Это возможно лишь в том случае, когда обе таблицы имеют один и тот же тип, т.е. имеют совпадающие названия (имена) и типы столбцов. Такие таблицы называют “совместимыми по объединению”. Все дубликаты строк должны быть удалены из отношения-результата. Данная операция аналогична объединению множеств в алгебре, но она является дополнительной по отношению к ограничению, так как имеется возможность восстановить отношение путем объединения двух дополняющих друг друга результатов операции селекции.
Операция теоретико-множественного отношения соответствует известной операции “слияния” файлов. Если известно, что файлы не пересекаются, и если порядок записей не играет роли, то достаточно скопировать один файл в конце другого. Однако, как правило, файлы поддерживаются в порядке первичных ключей, и тогда используются простые алгоритмы слияния., считывающие поочередно записи из каждого файла в зависимости от того, в каком из файлов запись имеет ключ с меньшим значением полей, так что в новый файл записи также будут помещаться в порядке первичных ключей.
Соединение (joined_to – соединение с) имеет два операнда; она определена для любых двух таблиц. Если эти две таблицы не имеют столбцов с совпадающими именами, то соединение ведет себя, как декартово произведение, соединяя каждую строку первой таблицы поочередно с каждой строкой второй таблицы. Если имена всех столбцов этих двух таблиц совпадают, то соединение ведет себя как теоретико-множественное пересечение, и создает таблицу, состоящую из тех строк, которые встречаются в каждой из рассматриваемых двух таблиц (такая таблица может быть и пустой, аналогично пустому множеству). Если у двух таблиц-операндов совпадают лишь некоторые имена столбцов, то в результате соединения получается таблица, содержащая все имена столбцов первой таблицы, а также все те имена столбцов второй таблицы, которые не встретились в первой. Строки результата выбираются из первой таблицы, а дополнительные значения конкатенируются (присоединяются) из тех строк второй таблицы, у которых значения в общих столбцах совпадают. До некоторой степени соединения является дополнением проекции, если осуществить проекцию “исходного” отношения так, чтобы получился набор отношений, каждое из которых сохраняет первичный ключ исходного, то соединение этого отношения восстановит исходное при дополнительном условии, что каждый столбец исходного отношения встречается хотя бы в одной из проекций.
При формулировании запросов операция соединения является решающей, если в запросе используется более одного отношения. Как правило, для формирования запроса используется соединение нескольких таблиц, а затем селекция требуемых строк, и , наконец, проекция на требуемые столбцы при печати.
Операция соединения больше всего соответствует операции “селективной выборки”, при выполнении которой список ключей представлен в виде записей в файле транзакций [19], и требуется выбрать или записать в выходной файл соответствующие записи из основного файла. Ключи в файле транзакций могут совпадать, например, с посторонним ключом в основном файле или же с частью первичного ключа, и в этих случаях для каждой записи в файле транзакций может быть выбрано несколько записей из основного файла. Таким образом, используется соединение как обобщенное пересечение [20].
Алгоритмы, которые выполняют вышеперечисленные операции, реализуются на уровне системы управления базой данных. Их содержание формируется на основе определений этих операций. Для их реализации используются или стандартные функции языка программирования , или формируется SQL-запрос. Более подробно реализация будет рассмотрена в следующей главе.
3.3. Проектирование алгоритмов расчёта задолженности по оплате поставок и определения оптимальной заявки.
Данные алгоритмы представлены в виде блок-схем на рис 3.1 и рис 3.2 соответственно:
да
нетда