УЗАГАЛЬНЕННЯ Реляційних ОПЕРАТОРІВ

У попередньому розділі була наведена наступна формулювання запросав

PACK

( ( UNPACK S_DURING { S#, DURING } ON DURING ) MINUS

( UNPACK SP_DURING { S#, DURING } ON

DURING ) ) ON DURING

Тепер необхідно відзначити, що, як виявилося, вирази, подібні до цього (які включають цілий ряд распаковок, за якими слід звичайна реляційна операція, потім знову розпакування), так часто потрібні на практиці, що придбала велику значимість ідея визначення скорочення для цих виразів (тут мова йде про подальше скорочення, оскільки, як випливає з наведеного вище опису, самі ці вирази вже по суті є скороченнями) Безумовно, завдяки такому скороченню вирази повинні стати набагато коротший Більше того, застосування скороченої форми запису відкриває можливість підвищення продуктивності таким чином: якщо у виразі застосовуються довгі інтервали з великим ступенем деталізації, то вихідні дані операції розпакування можуть стати набагато більш обємними порівняно з вхідними, а якби системі дійсно довелося матеріалізувати результат такої розпакування, то могло б виявитися, що запит виконується нескінченно довго або вимагає занадто великої обсягу памяті На відміну від цього, якщо всі вимоги до обробки даних виражені у вигляді однієї операції, то оптимізатор отримує можливість вибрати найбільш ефективну реалізацію, яка, зокрема, не вимагає матеріалізації розпакованих проміжних результатів

Тому, виходячи з викладених вище побажань, визначено наступне вираз

USING   (   ACL   )    ◄  rl   MINUS   r2   ►

Це вираз є скороченим позначенням для такого виразу

PACK

( ( UNPACK rl ON ( ACL ) ) MINUS ( UNPACK r2 ON ( ACL

) ) ) ON ( ACL )

Тут rl і r2 – реляційні вирази, що позначають відносини одного і того ж типу, a ACL – розділений комами список імен атрибутів, в якому кожен вказаний атрибут, по-перше, має деякий інтервальний тип, і, по-друге, присутній в обох відношеннях З цього випливають наведені нижче висновки

1 Якщо не вказано інше, то визначений вище оператор буде іменуватися просто як U_разность (U-скорочення від USING), АБО ДЛЯ стислості просто U_MINUS

2 Круглі дужки, в які укладено розділений комами список імен атрибутів тов в специфікації USING, можуть бути опущені, якщо такий список містить тільки одне імя атрибута

Примітка Ця угода стосується всіх скорочень U_, які будуть визначені у главі, тому ми не будемо його обумовлювати в кожному випадку

3&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp У кожному розглянутому в даному розділі контексті, в якому може появ

ляться специфікація USING, затінені кінці стрілок, ◄ і ► , служать для вказівки початку і кінця вираження, до якого застосовується специфікація

USING

4 На відміну від звичайного оператора MINUS, оператор UMINUS може виробляти результат, що має велику кардинальність в порівнянні з його лівим операндом Наприклад, припустимо, що відносини r 1 і r 2 визначені наступним чином

У такому разі застосування виразу USING A ◄ rl MINUS r2 ► призводить до отримання наступного результату

На цьому завершується розгляд оператора U_MINUS Тепер має бути очевидно, що можна визначити версії U_ всіх звичайних реляційних операторів (і в [234] таке завдання дійсно вирішена) Але заради економії місця ми тут обмежимося тільки найбільш корисними із зазначених операторів, а в якості таких ми розглядаємо (крім U_MINUS) оператори U_UNION, U_INTERSECT, U_JOIN і U_проекціі Визначення операторів U_UNION і U_INTERSECT формулюються за таким же загальному принципу, як і U_MINUS це означає, що вираз

USING  (  ACL  )   ◄  rl  op  r2 ►

є скороченим позначенням для наведеного нижче вирази

PACK

( ( UNPACK rl ON ( ACL ) ) op ( UNPACK r2 ON ( ACL )

) ) ON ( ACL )

Тут op – операція UNION або INTERSECT, а опції ACL, rl і r2 визначені як для операції U_MINUS

До речі, слід зазначити, що у разі операції U_UNION фактично немає необхідності попередньо виконувати операції UNPACK Це означає, що вираз, скороченою формою якого є операція U_UNION, можна додатково спростити до наступної форми

PACK   (   rl   UNION   r2   )   ON   (   ACL   )

Нескладно зрозуміти, чому таке спрощення можливо, але читач може спробувати самостійно опрацювати якийсь приклад, якщо він хоче переконатися в справедливості цього твердження (В дійсності, аналогічні спрощення можливі

також стосовно до деяких іншим операторам U_, але докладні відомості про це виходять за рамки даної глави)

Крім того (що трохи суперечить здоровому глузду), так само, як операція

U_MINUS може (неформально висловлюючись), збільшити кардинальність результату, так і операція U_UNION може її зменшити фактично операція U_UNION може виробляти результат з меншою кардинальними в порівнянні з будь-яким операндом (підготовку відповідного прикладу залишаємо в якості вправи для читача) Аналогічним чином, операція U_INTERSECT може виробляти результат з більшою Кардинально, ніж у будь-якого з операндів (ще одна вправа)

Тепер перейдемо до розгляду оператора U_JOIN і визначимо наступний вираз

USING  (  ACL  )  ◄  r1  JOIN   r2   ►

Це вираз є скороченим позначенням для наведеного нижче вирази

PACK

( ( UNPACK rl ON ( ACL ) ) JOIN ( UNPACK r2 ON ( ACL ) ) ) ON ( ACL )

Кожен атрибут, зазначений у розділеному комами списку атрибутів ACL, повинен ставитися до деякого інтервального типу і повинен бути присутнім як в rl, так і в r2 (і тому зєднання повинно виконуватися по всіх атрибутів, зазначеним у списку ACL, a також, можливо, з інших атрибутів)

Примітка Якщо відносини rl і r2 мають один і той же тип, то операція U_JOIN

вироджується в операцію U_INTERSECT

Нижче наведено приклад, який ілюструє використання операції U_JOIN Припустимо, що в базі даних визначена ще одна змінна відносини, S_CITY_DURING, яка має атрибути S #, CITY і DURING, потенційний ключ {S #, DURING} і наведений нижче предикат

Постачальник s # знаходився в місті CITY протягом інтервалу часу від початкової позиції інтервалу DURING до кінцевої позиції інтервалу DURING

Тепер розглянемо запит: Отримати кортежі S #-CITY-P #-DURING, такі що постачальник s # знаходився в місті CITY і був здатний поставляти деталь Р # протягом інтервалу DURING, де DURING включає четверту добу . Нижче наведена одна з можливих формулювань даного запиту

( USING DURING ◄  S_CITY_DURING JOIN SP_DURING ► )

WHERE dO4 6 DURING

Нарешті, перейшовши до операції U проекції, визначимо наступний вираз

USING  (  ACL  ◄ R { BCL   }   ►

Це вираз є скороченим позначенням для наступного виразу

PACK ( ( UNPACK r ON ( ACL ) ) { BCL } ) ON ( ACL )

Кожен атрибут, зазначений у розділеному комами списку атрибутів ACL, повинен мати певний інтервальний тип і повинен бути вказаний в списку BCL (а отже, в силу цієї обставини, повинен бути атрибутом відносини r) Як приклад знову розглянемо запит А, як показано нижче

■ Запит А Отримати пари S #-DURING для постачальників, які були здатні поставляти щонайменше одну деталь протягом щонайменше одного інтервалу часу, де DURING позначає такий інтервал

Нижче наведена формулювання даного запиту за допомогою операції U_проекціі.

USING DURING ◄  SP_DURING { S#, DURING } ►

А оскільки вже була розроблена наступна формулювання запиту в за допомогою операції U_MINUS, то вже була досягнута одна з первинних цілей даної глави, а саме, був знайдений (набагато більше) кращий спосіб формулювання запросовА і В USING DURING ◄ S_DURING {S #, DURING}

MINUS

SP_DURING { S#, DURING } ►

Реляційні операції порівняння

Строго кажучи, реляційні операції порівняння (або просто реляційні порівняння) не є реляційними операціями як такими, оскільки вони повертають істиннісне значення, а не ставлення Тим не менше, на них можна поширити таку ж трактування, яка застосовувалася в даній главі до реляційних операціями, причому фактично і вирішити таке завдання дуже бажано Справа в тому, що якщо розглянуті відносини включають інтервальні атрибути, то часто потрібно порівняти деякі розпаковані аналоги цих відносин, а не самі відносини як такі Для цієї мети спочатку визначимо аналог U_ для звичайного оператора реляційного порівняння на рівність. А саме, визначимо наступний вираз

USING   (  ACL   )    ◄   rl   =   r2   ►

Це вираз є скороченим позначенням для наведеного нижче вирази

( UNPACK rl ON ( ACL ) ) = ( UNPACK r2 ON ( ACL ) )

Кожен атрибут, зазначений у списку ACL, повинен бути інтервальним атрибутом і зобовязаний бути присутнім і щодо rl, і щодо r2 Зверніть увагу на те, що питання про застосування заключного кроку PACK не виникає, оскільки, як уже було сказано, результат операції = являє собою істиннісне значення, а не ставлення

Як приклад розглянемо стосунки rl і r2, які визначені таким чином

У такому випадку результатом порівняння rl = r2 стає FALSE, а вираз

USING А ◄ rl = г2 ► приймає значення TRUE

Зазначений вище оператор іменуватиметься для стислості як U_ = (Фактично він являє собою саме оператор еквівалентності, що визначений для п-арних відносин в самому кінці попереднього розділу) За таким же принципом можна визначити аналогічні оператори U_ для всіх інших реляційних операторів порівняння (V , c , с , г> і з ) Наприклад, якщо відносини rl і г2 залишаються такими ж, як і в прикладі застосування операції і_ =, то вираз USING А ◄ rl з r2 ► одно TRUE, а вираз USING A ◄ rl з r2 ► одно FALSE

Додаткові відомості про звичайні реляційних операціях

Ще раз розглянемо оператор U_MINUS Нагадаємо, що цей оператор визначений за допомогою наступного виразу

USING    (   ACL   )   ◄   r1   MINUS   r2   ►

Це вираз є скороченим позначенням для наведеного нижче вирази

PACK

( ( UNPACK rl ON ( ACL ) ) MINUS ( UNPACK r2 ON ( ACL

) ) ) ON ( ACL )

Тепер припустимо, що список ACL порожній (тобто в ньому взагалі не вказані атрибути),

тому що розглядається вираз приймає наступний вигляд

USING    (   )    ◄ rl   MINUS   r2  ►

У такому разі його повна форма виглядає так, як показано нижче

PACK                                                                                                                                                                                                                                                 ( ( UNPACK rl ON ( ) ) MINUS ( UNPACK r2 ON (

) ) ) ON ( )

Тепер нагадаємо, що, як зазначено в попередньому розділі, обидва вирази, UNPACK r ON () і PACK r ON (), скорочуються просто до r Тому загальний вираз скорочується до наступного виразу

rl  MINUS  r2

Іншими словами, звичайна реляційна операція MINUS фактично являє собою просто окремий випадок операції UMINUS Тому, якщо ми перевизначити синтаксичну структуру звичайного оператора MINUS наступним чином:

[   USING   (   ACL   )    ]    ◄  &ltrelation  exp&gt  MINUS  &ltrelation  exp&gt  

Глава 23 Хронологічні бази даних 951 і дозволимо виключати специфікацію USING (а також затінені кінці стрілок, ◄ і ►, що позначають початок і кінець решти вирази) тоді і тільки тоді, коли список ACL порожній, то нам більше не буде потрібно взагалі вести мову про якийсь спеціальному операторі U_MINUS, оскільки всі виклики оператора MINUS фактично стають викликами оператора U_MINUS і зявляється можливість узагальнити зміст оператора MINUS відповідним чином

Аналогічні зауваження відносяться до всіх інших реляційних операторам, а також до реляційних порівнянь, оскільки в будь-якому випадку звичайний реляційний оператор по суті є просто окремим випадком відповідного оператора U_, в якому специфікація USING взагалі не містить атрибутів, і тому можна дозволити собі виключити цю специфікацію (а також затінені кінці стрілок, що позначають початок і кінець решти вирази) Інакше кажучи, всі оператори U_ є просто безпосередніми узагальненнями своїх звичайних аналогів Тому більше взагалі немає ніякої необхідності явно згадувати оператори U_ як такі (і ці оператори дійсно більше не застосовуватимуться, окрім як час від часу, для більш чіткого позначення поняття, про яку йдеться) замість цього достатньо лише визнати, що звичайні оператори допускають, але не вимагають вказівки деякого додаткового операнда, коли вони застосовуються до відносин з інтервальними атрибутами Тому автор просить читача звернути особливу увагу на те, що до кінця цієї глави всі посилання на реляційні оператори і всі посилання на реляційні порівняння відносяться до їх узагальненим версіями (якщо явно не вказано інше) Але в якості пояснень іноді в міру необхідності будуть явно використовуватися уточнітелі звичайний (Або класичний) і узагальнений при згадці відповідних операторів і порівнянь як вже було сказано, з тієї ж причини іноді буде також явно використовуватися уточнітелі U_

Джерело: Дейт К Дж, Введення в системи баз даних, 8-е видання: Пер з англ – М: Видавничий дім «Вільямс», 2005 – 1328 с: Ил – Парал тит англ

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*