ЗМІННІ ВІДНОСИНИ

Тепер звернемося до змінних відносини (relation variable, або скорочено relvar) Як було зазначено в розділі 3, змінні відносини мають два різновиди – базові змінні відносини та подання (Звані також, відповідно, реальними і віртуальними змінними відносини) У даному розділі нас в основному цікавить саме базові змінні відносини (подання докладно розглядаються в розділі 10), але слід зазначити, що все сказане тут стосовно до змінним відносини без додаткового уточнення поширюється на всі змінні відносини в цілому, включаючи подання

Визначення базової змінної відносини

Нижче показаний синтаксис визначення базової змінної відносини

VAR &ltrelvar name&gt BASE  &ltrelation   type&gt

&ltc andidate k ey  def  list&gt [    &ltforeign key  def list&gt   ]

Параметр з позначенням типу відносини &ltrelation   type&gt приймає наступну форму

RELATION  {  &ltattribute commalist&gt  }

Тут параметр &ltattribute commalist&gt – Розділений комами список атрибутів Це вираз фактично являє собою виклик генератора типу RELATION, як описано в розділі 63) Параметр &ltcandidate key def  list&gt і необовязковий параметр <foreign key def list&gt описані в одному з наступних абзаців Нижче як приклад наведено визначення базових змінних відносини для бази даних постачальників і деталей (які були також показані на рис 39)

VAR S BASE RELATION

{ S# S#,

SNAME NAME, STATUS

INTEGER, CITY CHAR

} PRIMARY KEY { S#

}

VAR P BASE RELATION {Р # Р #, PNAME NAME,

COLOR COLOR, WEIGHT WEIGHT, CITY CHAR }

PRIMARY KEY { P#}

VAR SP BASE RELATION { S# S#, P# P#, QTY QTY }

PRIMARY KEY { S#, P# } FOREIGN KEY { S# }

REFERENCES S FOREIGN KEY { P#

} REFERENCES P

Пояснення

1 Ці три базові змінні відносини мають такі типи (відносини)

RELATION { S# S#, SNAME NAME, STATUS INTEGER, CITY CHAR } RELATION { P# P#, PNAME NAME, COLOR COLOR,

WEIGHT WEIGHT, CITY

CHAR } RELATION { S# S#, P# P#, QTY QTY }

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

3 Всі можливі значення будь-якої окремо взятої змінної відносини належать до одного й того ж типу відносини, а саме до типу відносини, вказаною у визначенні змінної відносини (вказаному побічно, якщо дана змінна відносини є поданням), і тому мають однаковий заголовок

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

5 Визначення потенційних ключів детально розглядаються в розділі 9, а на даний момент ми будемо просто припускати, що визначення кожної базової змінної відносини включає одне і тільки одне визначення потенциаль ного ключа, <candidate key def&gt в наступній конкретній формі

PRIMARY KEY   {    &ltattribute name commalist&gt   }

6 Визначення зовнішнього ключа також розглядаються в розділі 9

7 Введення визначення нової змінної відносини змушує систему внести в свій каталог записи з описом цієї змінної відносини

8 Як було зазначено в розділі 3, змінні відносини, як і відносини, мають відповідний предикат Таким є предикат, загальний для всіх ставлення ний, які являють собою можливі значення розглянутої змінної відносини Наприклад, у випадку змінної відносини постачальників S предикат виглядає приблизно таким чином

Постачальник з номером постачальника S # працює за контрактом, має імя SNAME і статус STATUS, а також знаходиться в місті CITY

9 Передбачається, що передбачені засоби визначеннязастосовуваних за замовчуванням значень для атрибутів базових змінних відносини Застосовуваним за замовчуванням значенням заданого атрибута є таке значення, яке має бути поміщено в позицію відповідного атрибута, якщо користувач явно не надасть потрібне значення при вставці деякого кортежу Підходяща синтаксична конструкція мови Tutorial D для визначення застосовуваних за замовчуванням значень може приймати форму нової конструкції у визначенні базової змінної відносини, скажімо,  DEFAULT

{  &ltdefault  spec  commalist&gt  }, Де кожна специфікація застосовуваного за замовчуванням значення&ltdefault  speo  приймає форму tribute  name&gt

(<Ім'я атрибута> <застосовуване за замовчуванням значення>) Наприклад, у визначенні змінної відносини постачальників s може бути задана

конструкція DEFAULT {STATUS О, CITY ‘}

Примітка Атрибути потенційних ключів зазвичай не мають заданих за замовчуванням значень, хоча з цього правила є винятки (див главу 19)

Нижче наведено синтаксис операції видалення існуючої базової змінної відносини

DROP VAR  &ltrelvar name&gt   

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

Примітка Для спрощення передбачається, що операція DROP закінчується невдачею, якщо розглянута змінна відносини все ще використовується в іншому місці,

наприклад, якщо на неї є посилання в якомусь визначенні подання, заданому десь в базі даних

Оновлення змінних відносини

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

&ltrelation assignment&gt

::=  &ltrelation assign  cormalist&gt

; &ltrelation assign&gt

::= &ltrelvar name&gt  := &ltrelation exp&gt

Ця операція має таку семантіку7: по-перше, обчислюються всі реляційні вирази

&ltrelation exp&gt в правих частинах операцій реляційного присвоювання &ltrelation   assign&gt,

по-друге, виконуються операції assign&gt в тій

7 За винятком тієї ситуації, яка відзначена у виносці 9 в розділі 5

послідовності, в якій вони записані Виконання окремої операції

&ltrelation assign&gt зводиться до того, що ставлення, отримане в результаті обчислення виразу&ltrelation  exp&gt  в правій частині, присвоюється змінної відносини, позначеної імям &ltrelvar name&gt в лівій частині (з заміною попереднього значення цієї змінної відносини) Безумовно, саме ставлення і змінна відносини повинні належати до одного і того ж типу

Як приклад припустимо, що дані ще дві базові змінні відносини, S і SP, що мають, відповідно, такі ж типи, як і змінна відносини постачальників S і змінна відносини поставок SP, як показано нижче

VAR S BASE RELATION

{ S# S#, SNAME NAME, STATUS INTEGER, CITY CHAR }

… VAR SP1 BASE RELATION

{ S# S#, P# P#, QTY QTY } ..

Нижче наведені деякі допустимі приклади застосування операції привласнення відносини assignment&gt.

1&nbsp S := S , SP1 := SP

2&nbsp S := S WHERE CITY = London

3&nbsp S := S WHERE NOT ( CITY = Paris )

Слід зазначити, що кожна окрема операція &ltrelation assign&gt може одночасно розглядатися, по-перше, як вибірка відносини, заданого в правій частині, і, по-друге, як оновлення змінної відносини, зазначеної в лівій частині

Тепер припустимо, що в другій і в третій приклади внесені такі зміни –

в кожному випадку змінна відносини S в лівій частині замінена змінної отноше ня S, як показано нижче

2&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp S := S WHERE CITY = London

3&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp S := S WHERE NOT ( CITY = Paris )

Зверніть увагу на те, що обидві ці операції привласнення фактично оновлюють змінну відносини S – одна з них по суті видаляє всіх постачальників, які не перебувають у Лондоні, а інша фактично видаляє всіх постачальників, які не перебувають у Парижі Для зручності в мові Tutorial D підтримуються явно задані операції INSERT, DELETE і UPDATE, але кожна з цих операцій визначена як скорочення для деякого присвоювання відносини &ltrelation assign&gt. Далі наведено кілька прикладів

1&nbsp INSERT S RELATION { TUPLE { S# S# (S6),

SNAME NAME (Smith),

STATUS 50,

CITY Rome } }

Еквівалентна операція привласнення представлена ​​наступним чином

S := S UNION RELATION { TUPLE { S# S# (S6), SNAME NAME (Smith), STATUS 50, CITY Rome } }

;

До речі, слід зазначити, що ця операція привласнення завершиться успішно, якщо зазначений кортеж з даними про постачальника S6 вже існує в змінної відносини

S На практиці бажано було б уточнити семантику операції INSERT таким

чином, щоб вона активізувала виняток, якщо робиться спроба вставити вже існуючий кортеж. Але для спрощення ми тут це уточнення ігноруємо Аналогічні зауваження відносяться також до операторів DELETE І UPDATE

2&nbsp DELETE S WHERE CITY = Paris

Еквівалентна операція привласнення представлена ​​наступним чином

S   :=  S  WHERE NOT  (  CITY  =   Paris   )   

3&nbsp UPDATE   S   WHERE  CITY   =    Paris

{  STATUS   :=   2   *

STATUS, CITY   :=

‘Rome    }    

Еквівалентна операція привласнення представлена ​​наступним чином

S := WITH ( S WHERE CITY = Paris ) AS T1 ,

( EXTEND Tl ADD ( 2 * STATUS AS NEW_STATUS,

‘Rome AS NEW_CITY ) ) AS

T2 T2 { ALL BUT STATUS, CITY } AS T3 , ( T3

RENAME ( NEW_STATUS AS STATUS, NEW_CITY AS CITY ) ) AS

T4 : ( S MINUS Tl ) UNION T4

Цілком очевидно, що в останньому випадку еквівалентний оператор присвоювання стає досить складним фактично в ньому використовуються деякі засоби, які будуть детально розглядатися тільки в наступному розділі З цієї причини в даному розділі не дано більш докладний опис даної теми

Для використання надалі нижче наведені трохи спрощені відомості про синтаксис операцій INSERT, DELETE І UPDATE

INSERT     &ltrelvar     name&gt     &ltrelation     exp> DELETE &ltrelvar name&gt [ WHERE &ltbool exp&gt ] UPDATE   &ltrelvar name&gt   [   WHERE  &ltbool   exp&gt

]

{    &ltattribute  update  commalist&gt    }

Параметр з визначенням операції оновлення атрибута &ltattribute    update&gt в свою чергу приймає наступну форму

&ltattribute name&gt  :=  <Еxр>

Крім того, логічне вираження в операторах DELETE і UPDATE може включати посилання на атрибути цільової змінної відносини, що мають цілком очевидну семантику

На завершення цього підрозділу слід підкреслити, що всі операції реляційного присвоюванні, і отже, операції INSERT, DELETE і UPDATE НАЛЕЖАТЬ ДО рівню множества8 Наприклад, операція UPDATE, неформально висловлюючись, оновлює безліч

8 Між іншим, слід зазначити, що за визначенням форми CURRENT операторів DELETE і UPDATE в мові SQL (див розділ 46) ставляться до рівня кортежу (або, швидше, до рівня рядка) і тому їх застосовувати не рекомендується

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

1 Мова фактично може йти тільки про оновлення безлічі кортежів, яке просто виявилося безліччю з кардинальними один

2 Іноді оновлення безлічі кортежів з кардинальними один є немож можно

Припустимо, наприклад, що на змінну відносини постачальників поширюється таке обмеження цілісності (див главу 9), що постачальники si і S4 повинні мати однаковий статус У такому випадку будь-яка однокортежная операція UPDATE, в якій робиться спроба змінити статус лише одного з цих двох постачальників, повинна закінчитися невдачею Замість цього повинна бути передбачена операція, в якій дані обох постачальників оновлюються одночасно, як показано нижче

UPDATE S WHERE S# = S# (S1) OR Si = S# (S4) { STATUS := <Деяке значення> }

У додаток до сказаного вище слід зазначити, що вираз оновлення кортежу, або безлічі кортежів у змінній відносини, яке ми тільки що привели, є фактично досить сумнівним Як і відносини, кортежі являють собою значення і не можуть бути оновлені за визначенням Тому коли мова йде (наприклад) про оновлення кортежу t з перетворенням його в t “, фактично під цим мається на увазі, що відбувається заміна кортежу t (тобто значення кортежу t) іншим кортежем t (який, в свою чергу, також являє собою значення кортежу) 9 Аналогічні поправки відносяться і до таких виразів, як оновлення атрибута А в деякому кортежі У цій книзі будуть як і раніше використовуватися вираження оновлення кортежів і оновлення атрибутів кортежів, оскільки така практика дуже зручна, але слід враховувати, що таке слововживання є лише скороченням, причому досить сумнівним

Змінні відносини та їх інтерпретація

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

9 Безумовно, сказане тут аж ніяк не означає, що не можна оновлювати змінні-кортежі Але як було описано в розділі 62, поняття змінної-кортежу в реляційної моделі не визначено і реляційні бази даних не включають такі змінні

замкнутості світу (Зване також інтерпретацією замкнутого світу) голосують,

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

Джерело: Дейт К Дж, Введення в системи баз даних, 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>

*

*