Представления и их обновление — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
м (Cosmetics)
м (rollbackEdits.php mass rollback)
 
(не показано 17 промежуточных версий 2 участников)
Строка 1: Строка 1:
 
{{В разработке}}
 
{{В разработке}}
  
 +
= Представления =
 
{{Определение
 
{{Определение
|definition='''Представление''' {{---}} механизм, представляющий из себя именованный запрос. В момент каждого обращения к представлению, исполняется соответствующий ему запрос. При этом, представления могут использоваться как таблицы, на пример, в <code>select ... from</code>.  
+
|id=def1
 +
|neat = 1
 +
|definition='''Представление''' {{---}} механизм, представляющий из себя именованный запрос. В момент каждого обращения к представлению, исполняется соответствующий ему SQL-запрос. При этом, представления могут использоваться как таблицы, на пример, в <code>select ... from</code>.  
 
}}
 
}}
 +
<br>
 
Наиболее распространенные случаи применения:
 
Наиболее распространенные случаи применения:
 
* Макросы {{---}} выделение общей части нескольких запросов;
 
* Макросы {{---}} выделение общей части нескольких запросов;
 
* Независимость от данных {{---}} использование представлений вместо декомпозированной таблицы для сохранения механизма взаимодействия для чтения со стороны клиента;
 
* Независимость от данных {{---}} использование представлений вместо декомпозированной таблицы для сохранения механизма взаимодействия для чтения со стороны клиента;
 
* Сокрытие данных;
 
* Сокрытие данных;
<br>
 
  
 
== Синтаксис ==
 
== Синтаксис ==
  <font color = blue>create view <font color = red>имя<font color = blue> as <font color = red>запрос<font color = green> -- объявление представления </font>
+
Объявление представления с именем <code><font color = red>имя</font color = black></code> для представления запроса <code><font color = red>запрос</font color = black></code>:
  <font color = blue>drop view <font color = red>имя<font color = green> -- удаление представления по его имени</font>
+
  <font color = blue>create view <font color = red>имя<font color = blue> as <font color = red>запрос<font color = black>
 +
 
 +
Удаление представления по имени <code><font color = red>имя</font color = black></code>:
 +
  <font color = blue>drop view <font color = red>имя<font color = black>
  
 
==== Примеры ====
 
==== Примеры ====
<font color = green> -- Представление для подсчета текущих средних баллов студентов: </font>
+
Представление для подсчета текущих средних цен в магазинах:
  <font color = blue>create view <font color = black>AveragePoints(SId, AvgPoints) <font color = blue>as select <font color = black>SId, avg(Points) <font color = blue>from <font color = black>Points</font>
+
  <font color = blue>create view <font color = black>AveragePrice(ShopId, AvgPrice) <font color = blue>as select <font color = black>ShopId, avg(Price) <font color = blue>from <font color = black>Prices<font color = black>
  
<font color = green> -- Представление для получения имени и фамилии студента </font>
+
Представление для получения названия магазина с текущими ценами, на каждом из товаров:
<font color = green> -- с текущим количеством баллов, полученных им на каждом курсе: </font>
+
  <font color = blue>create view <font color = black>ShopItem(SN, PN, P) <font color = blue>as select <font color = black>s.Name, i.Name, p.Price</font>
  <font color = blue>create view <font color = black>StudentCourse(FN, LN, N, P) <font color = blue>as select <font color = black>s.FirstName, s.LastName, c.Name, p.Points</font>
+
  <font color = blue>from <font color = black>Shops s <font color = blue>natural join <font color = black>Prices p <font color = blue>natural join <font color = black>Items i<font color = black></font>
  <font color = blue>from <font color = black>Students s <font color = blue>natural join <font color = black>Points p <font color = blue>natural join <font color = black>Courses c<font color = black></font>
 
  
Данный пример, в частности, демонстрирует удобство использования представлений {{---}} без их использования указанное выше выражение с тремя <code>join</code> пришлось бы писать каждый раз. Также, если бы таблицы <tex>Students, Points</tex> и <tex>Courses</tex> являлись бы результатом декомпозиции таблицы <tex>StudentCourse</tex>, создание данного представления позволяет избежать необходимости изменять код взаимодействия с ней.
+
Данный пример, в частности, демонстрирует удобство использования представлений {{---}} без их использования указанное выше выражение с тремя <code>join</code> пришлось бы писать каждый раз. Также, если бы таблицы <tex>Shops, Prices</tex> и <tex>Items</tex> являлись бы результатом декомпозиции таблицы <tex>ShopItem</tex>, создание данного представления позволяет избежать необходимости изменять код взаимодействия с ней.
  
 
== Обновление представлений ==
 
== Обновление представлений ==
Строка 37: Строка 42:
 
=== Унарные операции ===
 
=== Унарные операции ===
 
==== Фильтрация ====
 
==== Фильтрация ====
Вставка кортежа в результат <tex>R</tex> выполнения операции [[Реляционная_алгебра: унарные операции | фильтрации]] <tex>\sigma_{P}(R)</tex> возможна только при выполнении им условия <tex>P</tex> фильтра. В противном случае такая строка не окажется в результате, так как будет отфильтрована: она будет вставлена в базовую таблицу, но не появится в представлении.  
+
Вставка кортежа в результат <tex>R</tex> выполнения операции [[Реляционная алгебра: унарные операции | фильтрации]] <tex>\sigma_{P}(R)</tex> возможна только при выполнении им условия <tex>P</tex> фильтра. В противном случае такая строка не окажется в результате, так как будет отфильтрована: она будет вставлена в базовую таблицу, но не появится в представлении.  
  
 
Если кортеж удовлетворяет условию, данные можно как вставить, так и удалить.
 
Если кортеж удовлетворяет условию, данные можно как вставить, так и удалить.
  
 
==== Проекция ====
 
==== Проекция ====
В [[Реляционная_алгебра: унарные операции | проекции]] при вставки кортежа имеется набор атрибутов, на который значение проецируется; его необходимо дополнить значениями атрибутов, которые при проекции были выборшены: для этого выбираются значения по умолчанию, с которыми кортеж вставляется.
+
В [[Реляционная алгебра: унарные операции | проекции]] при вставки кортежа имеется набор атрибутов, на который значение проецируется; его необходимо дополнить значениями атрибутов, которые при проекции были отброшены: для этого выбираются значения по умолчанию, с которыми кортеж вставляется.
  
 
При удалении данных из проекции, необходимо удалить все соответствующие кортежи из базового отношения: если удалить лишь один из нескольких, в проекции этот кортеж останется.
 
При удалении данных из проекции, необходимо удалить все соответствующие кортежи из базового отношения: если удалить лишь один из нескольких, в проекции этот кортеж останется.
Строка 52: Строка 57:
  
 
=== Множественные операции ===
 
=== Множественные операции ===
 +
==== Пересечение ====
 +
Для [[Реляционная алгебра: операции над множествами | пересечения]] <tex>R_1 \cap R_2</tex> вставка кортежа выполняется как в <tex>R_1</tex>, так и в <tex>R_2</tex>. Так как [[Реляционная алгебра: унарные операции | предикатом]] пересечения является конъюнкция предикатов двух отношений, их проверка для кортежа не производится - в противном случае, кортеж не появится в ответе.
 +
 +
Аналогично, для удаления, кортеж должен быть удален из обоих отношений.
 +
 
==== Объединение ====
 
==== Объединение ====
[[Реляционная_алгебра:_операции_над_множествами | объединение]]
+
Отсюда {{---}} алгоритм вставки для [[Реляционная алгебра: операции над множествами | объединения]] <tex>R_1 \cup R_2</tex>: для каждого из отношений проверить соответствие кортежа предикатам каждой из сторон; в случае удовлетворения, вставить в соответствующее отношение. Если кортеж удовлетворяет обоим предикатам, он должен появиться и слева, и справа
==== Пересечение ====
+
 
[[Реляционная_алгебра:_операции_над_множествами | пересечение]]
+
При удалении кортеж удаляется как из <tex>R_1</tex>, так и из <tex>R_2</tex>.
 +
 
 
==== Разность ====
 
==== Разность ====
[[Реляционная_алгебра:_операции_над_множествами | разность]]
+
Для [[Реляционная алгебра: операции над множествами | разности]] <tex>R_1 \setminus R_2</tex> вставка производится в <tex>R_1</tex>.
 +
 
 +
Удаление также производится из <tex>R_1</tex>.
 +
 
 
=== Соединения ===
 
=== Соединения ===
 +
При вставке кортежа в [[Реляционная алгебра: соединения, деление#.D0.95.D1.81.D1.82.D0.B5.D1.81.D1.82.D0.B2.D0.B5.D0.BD.D0.BD.D0.BE.D0.B5_.D1.81.D0.BE.D0.B5.D0.B4.D0.B8.D0.BD.D0.B5.D0.BD.D0.B8.D0.B5 | естественное соединение]] <tex>R_1 \Join R_2</tex> часть его атрибутов, соответствующих <tex>R_1</tex>, при удовлетворении предикату, вставляются в него, аналогично для <tex>R_2</tex>.
 +
 +
Таким же образом, при удалении, из каждой из частей удаляются соответствующие атрибуты кортежа.
 +
 +
Алгоритмы вставки и удаления базируются на ограничениях целостности:
 +
* один-к-одному: вставка и удаление производятся как для левой, так и для правой части;
 +
* один-ко-многим: кортеж вставляется в часть «многие», а в части «один» соответствующие данные уже могут присутствовать;
 +
* многие-ко-многим: с точки зрения реальных баз данных, данное отношение [[Преобразование модели сущность-связь в физическую модель#.D0.A1.D0.B2.D1.8F.D0.B7.D0.B8_.D0.BC.D0.BD.D0.BE.D0.B3.D0.B8.D0.B5-.D0.BA.D0.BE-.D0.BC.D0.BD.D0.BE.D0.B3.D0.B8.D0.BC_2 | преобразуется]] в join-table, имеющую отношение «один-ко-многим» с обеих из своих сторон;
 +
 
=== Обновления и SQL ===
 
=== Обновления и SQL ===
 +
С точки зрения SQL:
 +
* Унарные операции:
 +
** обновляемые;
 +
* Множественные операции:
 +
** необновляемые, несмотря на теоретическую возможность для обновления и пересечения и, с определенными ограничениями, для разности;
 +
* Соединения
 +
** один-к-одному {{---}} обновляемые;
 +
** один-ко-многим {{---}} обновляемые только со стороны «многие»;
 +
** многие-ко-многим {{---}} необновляемые (там, где поддерживаются);
 +
 
== Материализованные представления ==
 
== Материализованные представления ==
=== Объявление материализованных представлений ===
+
{{Определение
text
+
|id=def2
 +
|definition='''Материализованное представление''' {{---}} в отличие от [[#def1 | представления]], является «слепком» данных на определенный момент времени, который хранящимся физически в виде отдельной таблицы и не изменяется при изменении базовой версии.
 +
}}
 +
Преимущества:
 +
* быстрота выборки: материализованное представление может быть сформировано на основе сложного подзапроса, и, из-за того, что данные будут сохранены, этот запрос не будет пересчитываться повторно;
 +
* возможность «фиксации» данных;
 +
 
 +
Недостатки:
 +
* для работы с актуальными данными, появляется необходимость обновления материализованное представление;
 +
* физически хранимые данные могут занимать большие объемы памяти;
 +
 
 +
=== Синтаксис ===
 +
<font color=blue>create materialized view <font color=red>имя</font>
 +
<font color=red>[</font>
 +
<font color=blue>    refresh <font color=red>[{<font color=blue>fast<font color=grey>|<font color=blue>complete<font color=red>}] [<font color=blue>on <font color=red>{<font color=blue>commit<font color=grey>|<font color=blue>demand<font color=red>}]</font>
 +
<font color=red>    [<font color=blue>start with <font color=red>время] [<font color=blue>next <font color=red>время]</font>
 +
<font color=red>]</font>
 +
<font color=blue>as <font color=red>запрос<font color = black>
 +
 
 +
Некоторые БД поддерживают указание времени первого и последующих обновлений:
 +
<font color=red>[<font color=blue>start with <font color=red>время] [<font color=blue>next <font color=red>время]<font color=black>
 +
 
 +
Режимы обновления:
 +
* <code>fast</code>: инкрементальные обновления в зависимости того, какие фрагменты данных были изменены в базовых таблицах этого отношения. Не рекомендуется использовать в условиях частого обновления исходной таблицы, для некоторых запросов данный режим может не поддерживаться;
 +
* <code>complete</code>: полный пересчет;
 +
 
 +
Частота обновлений:
 +
* <code>commit</code>: при завершении любой операции;
 +
* <code>demand</code>: при вызове команды <code>refresh materialized view</code>;
 +
 
 +
<font color=blue>refresh materialized view <font color=red>имя<font color = black>
 +
 
 +
==== Пример ====
 +
Материализованное представление для подсчета текущих средних цен в магазинах, обновляемое раз в день:
 +
<font color=blue>create materialized view <font color=black>AveragePrice</font>
 +
<font color=blue>refresh next <font color=black>dateadd(day, now(), 1)</font>
 +
<font color=blue>as select <font color=black>ShopId, avg(Price) <font color=blue>from <font color=black>Prices <font color=blue>group by <font color=black>ShopId<font color=black>
 +
 
 +
== См. также ==
 +
* [[Реляционная алгебра: унарные операции]]
 +
* [[Реляционная алгебра: операции над множествами]]
 +
* [[Реляционная алгебра: соединения, деление]]
 +
* [[Преобразование модели сущность-связь в физическую модель]]
 +
* [[Базы данных]]
 +
 
 +
== Литература ==
 +
# https://www.kgeorgiy.info/courses/dbms/
 +
# Введение в системы баз данных, 8-е издание.: Пер. с англ. — М.: Издательский дом "Вильяме", 2005. — 1328 с.
 +
# Gulutzan P., Pelzer T.(1999) SQL-99 complete, really. Gilroy,CA:CMP Books
 +
 
 +
[[Категория: Базы данных]]

Текущая версия на 19:13, 4 сентября 2022

Эта статья находится в разработке!

Представления

Определение:
Представление — механизм, представляющий из себя именованный запрос. В момент каждого обращения к представлению, исполняется соответствующий ему SQL-запрос. При этом, представления могут использоваться как таблицы, на пример, в select ... from.


Наиболее распространенные случаи применения:

  • Макросы — выделение общей части нескольких запросов;
  • Независимость от данных — использование представлений вместо декомпозированной таблицы для сохранения механизма взаимодействия для чтения со стороны клиента;
  • Сокрытие данных;

Синтаксис

Объявление представления с именем имя для представления запроса запрос:

create view имя as запрос

Удаление представления по имени имя:

drop view имя

Примеры

Представление для подсчета текущих средних цен в магазинах:

create view AveragePrice(ShopId, AvgPrice) as select ShopId, avg(Price) from Prices

Представление для получения названия магазина с текущими ценами, на каждом из товаров:

create view ShopItem(SN, PN, P) as select s.Name, i.Name, p.Price
from Shops s natural join Prices p natural join Items i

Данный пример, в частности, демонстрирует удобство использования представлений — без их использования указанное выше выражение с тремя join пришлось бы писать каждый раз. Также, если бы таблицы [math]Shops, Prices[/math] и [math]Items[/math] являлись бы результатом декомпозиции таблицы [math]ShopItem[/math], создание данного представления позволяет избежать необходимости изменять код взаимодействия с ней.

Обновление представлений

Рассмотрим пример: в результате декомпозиции имевшейся таблицы [math]T[/math] получились таблицы [math]T_1[/math] и [math]T_2[/math]. Было создано представление [math]T[/math], объединяющее результаты запроса из двух таблиц в тот вид, в котором данные присутствовали в изначальной.
Так же существует необходимость использовать не только операции чтения, но и записи, такие, чтобы:

  • их результаты отражались [math]T_1[/math] и [math]T_2[/math];
  • вставка была взаимообратна удалению;
  • делать запись как если бы представление было таблицей;


Будем рассматривать обновления, как предварительное удаление (без проверки целостности) и последующую вставку обновленных данных.

Унарные операции

Фильтрация

Вставка кортежа в результат [math]R[/math] выполнения операции фильтрации [math]\sigma_{P}(R)[/math] возможна только при выполнении им условия [math]P[/math] фильтра. В противном случае такая строка не окажется в результате, так как будет отфильтрована: она будет вставлена в базовую таблицу, но не появится в представлении.

Если кортеж удовлетворяет условию, данные можно как вставить, так и удалить.

Проекция

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

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

Переименование

Для выполнения вставки, происходит переименование атрибутов в исходном кортеже, после чего он вставляется.

При удалении соответствующий кортеж удаляется.

Множественные операции

Пересечение

Для пересечения [math]R_1 \cap R_2[/math] вставка кортежа выполняется как в [math]R_1[/math], так и в [math]R_2[/math]. Так как предикатом пересечения является конъюнкция предикатов двух отношений, их проверка для кортежа не производится - в противном случае, кортеж не появится в ответе.

Аналогично, для удаления, кортеж должен быть удален из обоих отношений.

Объединение

Отсюда — алгоритм вставки для объединения [math]R_1 \cup R_2[/math]: для каждого из отношений проверить соответствие кортежа предикатам каждой из сторон; в случае удовлетворения, вставить в соответствующее отношение. Если кортеж удовлетворяет обоим предикатам, он должен появиться и слева, и справа

При удалении кортеж удаляется как из [math]R_1[/math], так и из [math]R_2[/math].

Разность

Для разности [math]R_1 \setminus R_2[/math] вставка производится в [math]R_1[/math].

Удаление также производится из [math]R_1[/math].

Соединения

При вставке кортежа в естественное соединение [math]R_1 \Join R_2[/math] часть его атрибутов, соответствующих [math]R_1[/math], при удовлетворении предикату, вставляются в него, аналогично для [math]R_2[/math].

Таким же образом, при удалении, из каждой из частей удаляются соответствующие атрибуты кортежа.

Алгоритмы вставки и удаления базируются на ограничениях целостности:

  • один-к-одному: вставка и удаление производятся как для левой, так и для правой части;
  • один-ко-многим: кортеж вставляется в часть «многие», а в части «один» соответствующие данные уже могут присутствовать;
  • многие-ко-многим: с точки зрения реальных баз данных, данное отношение преобразуется в join-table, имеющую отношение «один-ко-многим» с обеих из своих сторон;

Обновления и SQL

С точки зрения SQL:

  • Унарные операции:
    • обновляемые;
  • Множественные операции:
    • необновляемые, несмотря на теоретическую возможность для обновления и пересечения и, с определенными ограничениями, для разности;
  • Соединения
    • один-к-одному — обновляемые;
    • один-ко-многим — обновляемые только со стороны «многие»;
    • многие-ко-многим — необновляемые (там, где поддерживаются);

Материализованные представления

Определение:
Материализованное представление — в отличие от представления, является «слепком» данных на определенный момент времени, который хранящимся физически в виде отдельной таблицы и не изменяется при изменении базовой версии.

Преимущества:

  • быстрота выборки: материализованное представление может быть сформировано на основе сложного подзапроса, и, из-за того, что данные будут сохранены, этот запрос не будет пересчитываться повторно;
  • возможность «фиксации» данных;

Недостатки:

  • для работы с актуальными данными, появляется необходимость обновления материализованное представление;
  • физически хранимые данные могут занимать большие объемы памяти;

Синтаксис

create materialized view имя
[
    refresh [{fast|complete}] [on {commit|demand}]
    [start with время] [next время]
]
as запрос

Некоторые БД поддерживают указание времени первого и последующих обновлений:

[start with время] [next время]

Режимы обновления:

  • fast: инкрементальные обновления в зависимости того, какие фрагменты данных были изменены в базовых таблицах этого отношения. Не рекомендуется использовать в условиях частого обновления исходной таблицы, для некоторых запросов данный режим может не поддерживаться;
  • complete: полный пересчет;

Частота обновлений:

  • commit: при завершении любой операции;
  • demand: при вызове команды refresh materialized view;
refresh materialized view имя

Пример

Материализованное представление для подсчета текущих средних цен в магазинах, обновляемое раз в день:

create materialized view AveragePrice
refresh next dateadd(day, now(), 1)
as select ShopId, avg(Price) from Prices group by ShopId

См. также

Литература

  1. https://www.kgeorgiy.info/courses/dbms/
  2. Введение в системы баз данных, 8-е издание.: Пер. с англ. — М.: Издательский дом "Вильяме", 2005. — 1328 с.
  3. Gulutzan P., Pelzer T.(1999) SQL-99 complete, really. Gilroy,CA:CMP Books