- •Часть 1
- •Глава 1. Управление базами данных.
- •1.1. Вводный пример
- •1.2. Что такое система баз данных
- •1.3. Что такое база данных
- •Свойства
- •1.4. Почему база данных
- •1.5.Независимость данных
- •1.6. Реляционные и другие системы
- •1.7. Резюме
- •1.5. А)
- •Глава 2.
- •2.1. Цель
- •2.2. Три уровня архитектуры
- •2.3. Внешний уровень
- •2.4. Концептуальный уровень
- •2.5. Внутренний уровень
- •2.6. Отображения
- •2.7. Администратор базы данных
- •2.8. Система управления базой данных
- •2.9. Система управления передачей данных
- •2.10. Архитектура клиент/сервер
- •2.11. Утилиты
- •2.12. Распределенная обработка
- •2.13. Резюме
- •Глава 3.
- •3.1. Введение
- •3.2. Реляционные системы
- •3.3. Замечание относительно терминологии
- •3.4. Реляционная модель
- •3.5. Оптимизация
- •3.6. Каталог
- •3.7. Базовые таблицы и представления
- •3.8. Язык sql
- •3.9. База данных поставщиков и деталей
- •3.10. Резюме
3.7. Базовые таблицы и представления
Мы уже видели, что из данного множества таблиц, таких как DEPT и EMP, реляционные выражения позволяют получить множество других, например путем соединения двух таблиц. Пришло время ввести еще несколько новых терминов. Исходные (данные) таблицы называются базовыми таблицами; а таблицы, полученные из них путем выполнения каких-либо реляционных выражений, называются производными таблицами. Поэтому базовые таблицы существуют независимо, в то время как производные таблицы зависят от базовых. Следовательно, если быть более точным, производная таблица — это такая таблица, которая определяется в терминах других таблиц и, в конечном счете, в терминах базовых таблиц, а базовая таблица — это такая таблица, которая не является производной.
Реляционные системы, очевидно, должны предоставлять средства для создания в первую очередь базовых таблиц. В SQL, например, эта функция выполняется оператором CREATE TABLE (здесь TABLE используется в узком смысле, как базовая таблица). Базовые таблицы, конечно, должны быть именованными (т.е. их имена указываются в операторах создания). Большинство производных таблиц, наоборот, неименованные. Однако реляционные системы обычно поддерживают один определенный вид производных таблиц, называемый представлением, которое имеет имя. Таким образом, представление — это именованная таблица, которая, в отличие от базовой, не может существовать сама по себе, а определяется в терминах одной или нескольких именованных таблиц (базовых таблиц или других представлений).
Например, инструкцию
CREATE VIEW TOPEMPS AS ( EMP WHERE SALARY > 33K ) [ EMP#, ENAME, SALARY ] ;
можно использовать для определения представления TOPEMPS. Когда эта инструкция выполняется, выражение, следующее за ключевым словом as и фактически определяющее представление, не вычисляется, а просто "запоминается" системой (обычно путем сохранения в каталоге под указанным именем TOPEMPS). Однако для пользователя это теперь такая же реальная таблица базы данных с именем TOPEMPS, со строками и столбцами, как и показанная на рис. 3.5, но только в незатемненных участках. Иными словами, имя TOPEMPS обозначает виртуальную таблицу, т.е. таблицу, которая была бы результатом, если бы выражение, определяющее представление, было на самом деле вычислено.
TOPEMPS
-
EMP#
ENAME
DEPT#
SALARY
E1
E2
E3
E4
Lopez
Cheng
Finzi
Saito
D1
D1
D2
D2
40K
42K
30K
35K
Рис. 3.5. TOPEMPS как представление базовой таблицы EMP (незатемненные участки)
Однако будьте внимательны: отмечая, что имя TOPEMPS обозначает "таблицу, которая была бы результатом, если бы выражение, определяющее представление, было на самом деле вычислено", мы вовсе не хотим сказать, что она ссылается на отдельную копию данных, т.е. мы не имеем в виду, что выражение, определяющее представление, на самом деле вычисляется. Наоборот, представление — это просто "окно" в основной таблице EMP. Более того, естественно, что любые изменения в основной таблице будут автоматически и немедленно видны через такое "окно" (конечно, если эти изменения относятся к незатемненной части таблицы EMP); аналогично, изменения в TOPEMPS будут автоматически и немедленно применены к реальной таблице EMP и, следовательно, будут видны через "окно".
Ниже показан пример запроса, использующего представление TOPEMPS:
( TOPEMPS WHERE SALARY < 42K ) [ ЕМР#, SALARY ]
Результат будет выглядеть подобно следующему:
ЕМР#
|
SALARY
|
Е1
|
40K
|
Е4
|
35K
|
Операции с представлениями, подобные рассмотренным, фактически осуществляются изменением ссылок на представление с помощью выражения, которое определяет представление (т.е. выражения, сохраненного в каталоге). Поэтому в рассмотренном примере выражение
( TOPEMPS WHERE SALARY < 42K ) [ ЕМР#, SALARY ]
модифицируется системой к виду
(((EMP WHERE SALARY > 33K ) [ ЕМР#, ENAME, SALARY ] )
WHERE SALARY < 42K ) [ EMP#, SALARY ]
После определенного количества перегруппировок это выражение упрощается и принимает следующий вид:
( ЕМР WHERE SALARY > ЗЗК AND SALARY < 42К ) [ ЕМР#, SALARY ]
А вычисление этого выражения приводит к результату, показанному ранее. Иными словами, первоначальная операция над представлением практически конвертируется в эквивалентную операцию над соответствующей базовой таблицей. Затем такой эквивалент операции выполняется обычным способом (точнее, оптимизируется и выполняется обычным способом).
Теперь TOPEMPS — очень простое представление, состоящее, как обычно, из подмножества строк и столбцов основной базовой таблицы. Однако в принципе определение представления может быть произвольной сложности. Например, вот представление, определение которого включает соединение двух основных базовых таблиц:
CREATE VIEW JOINEXl AS ( ( ЕМР JOIN DEPT ) WHERE BUDGET > 7M ) [ EMP#, DEPT# ] ;
Мы еще вернемся к общему вопросу определения и обработки представлений в главе 17.
Между прочим, сейчас можно объяснить замечание в главе 2 относительно того, что термин "представление" ("view") имеет довольно специфическое значение в реляционном контексте, не совпадающее со значением, приписанным ему в архитектуре ANSI/SPARC. На внешнем уровне этой архитектуры база данных воспринимается как "внешнее представление", определяемое внешней схемой (и разные пользователи могут иметь разные внешние представления). В реляционных системах, наоборот, представление, как пояснялось выше, является специально именованной производной виртуальной таблицей. Поэтому реляционным аналогом "внешнего представления" ANSI/SPARC обычно служит множество из нескольких таблиц, каждая из которых является представлением в реляционном смысле. "Внешняя схема" состоит из определений таких представлений.
Архитектура ANSI/SPARC является довольно общей и учитывает произвольные изменения между внешним и концептуальным уровнями. В принципе, даже типы структур данных, поддерживаемые на двух уровнях, могут быть разными: например, концептуальный уровень может быть основан на отношениях, в то время как пользователь может иметь внешнее представление базы данных в виде иерархии. Однако на практике большинство систем использует одинаковые типы структур в качестве базовых на обоих уровнях, и реляционные продукты не являются исключением из этого общего правила — представление по-прежнему остается таблицей, как и базовая таблица. А поскольку одинаковые типы объектов поддерживаются на обоих уровнях, то на двух уровнях применяется один и тот же подъязык данных (обычно SQL). Действительно, тот факт, что представление — это тоже таблица, так же важен для реляционных систем, как для математики важен факт, что подмножество также является множеством.
Замечание. Однако продукты SQL и стандарт SQL, похоже, часто игнорируют этот момент, поскольку нередко ссылаются на "таблицы и представления" (в том смысле, что представление не является таблицей). Советуем не делать этой распространенной ошибки и использовать термин "таблицы" лишь для базовых таблиц.
Есть еще один заслуживающий внимания вопрос, который касается базовых таблиц и представлений. Различие между базовой таблицей и представлением часто характеризуется так:
• базовые таблицы "реально существуют" в том смысле, что они представляют данные, которые действительно хранятся в базе данных;
• представления, наоборот, "реально не существуют", а просто предоставляют различные способы просмотра "реальных" данных.
Однако такая характеристика, хотя это вряд ли имеет значение в неформальном смысле, неточно отражает истинное положение дел. Верно, что пользователи могут представлять таблицы как физически существующие; действительно, конечная цель реляционного подхода состоит в том, чтобы обеспечить представление пользователей о базовых таблицах, как о физически существующих, не заботясь о том, как эти таблицы физически представлены в памяти. Но (и это весьма существенное "но"!) — подобные рассуждения нельзя толковать так, что базовая таблица — это физически хранимая таблица (т.е. множество физически примыкающих, физически хранимых записей, каждая из которых состоит из прямой копии строки базовой таблицы). Как объяснялось выше, базовые таблицы лучше всего представлять как абстракцию некоторого множества хранимых данных, в которой скрыты все детали уровня хранения. В принципе, базовая таблица и ее хранимый дубликат могут отличатся в разной степени.
Простой пример поможет прояснить этот вопрос. Снова рассмотрим базу данных отделов и служащих. Большинство сегодняшних систем, вероятно, реализовали бы эту базу данных в виде двух хранимых файлов, по одному для каждой таблицы базы данных. Но нет абсолютно никаких причин против создания одного хранимого файла хранимых иерархических записей, каждая из которых состоит из номера отдела, названия и бюджета для некоторого отдела с последующим номером служащего, именем и зарплатой для каждого служащего, работающего в этом отделе.