Відносини

Спочатку розглянемо точне визначення термінакортежЯкщо дана колекція типів Ti (i = 1, 2, .., п), які не обовязково всі повинні бути різними, то значенням кортежу (або коротко кортежем), певним за допомогою цих типів (назвемо його t), є безліч впорядкованих трійок у формі , де Ai – імя атрибута, Ti – імя типу та vi – значення типу Ti Крім того, кортеж t повинен відповідати наведеним нижче вимогам

■ Значення п має ступінь, або арность t

■ Упорядкована трійка є компонентом t

■ Упорядкована пара являє собою атрибут t і однозначно визна ляется імям атрибута Ai (імена атрибутів Ai і Aj збігаються, тільки якщо i = j) Значення vi – це значення атрибуту, відповідне атрібуту1 Ai кортежу t Тип Ti – це відповідний тип атрибута

■ Повний безліч атрибутів становить заголовок t

■&nbsp&nbsp&nbsp&nbsp Тип кортежу t визначений заголовком t, а сам заголовок і цей тип кортежу мають такі ж атрибути (і тому такі ж імена і типи атрибутів) і таку ж сте пень, як t Нижче показано точне визначення імені типу кортежу

TUPLE {А1 Т1, А2 Т2, .., An Тп}

А нижче показаний приклад кортежу

У цьому кортежі атрибути мають імена MAJOR_P #, MINOR_P # і QTY відповідними іменами типів є: р #, ще один екземпляр р # і QTY, а відповідними значеннями – Р # {Р2), Р # (Р4) і QTY (7) (для спрощення в цій таблиці вказані значення були замінені, відповідно, скороченими позначеннями Р2, Р4 і 7) Наведений вище кортеж має ступінь три, а його заголовок має наступний вид

Нижче наведено визначення типу цього кортежу

TUPLE { MAJOR_P# P#, MINOR_P# P#, QTY QTY }

Примітка У неформальному викладі прийнято виключати імена типів з заголовка кортежу і показувати імена атрибутів Тому показаний вище кортеж може бути неформально представлений таким чином

У мові Tutorial D для позначення розглянутого кортежу може використовуватися наступний вираз

TUPLE {MAJOR_P # Р # (Р2), MINOR_P # Р # (Р4), QTY QTY (7)}

(Це вираз може служити прикладом виклику селектора кортежу см розділ

“Генератор типу TUPLE.) У даному виразі заслуговує особливої ​​уваги те, що

1 Безумовно, існує логічне відмінність між імям атрибута і атрибутом як таким Але незважаючи на цей факт, у неформальному спілкуванні часто використовується вирази типу атрибут Ai для позначення атрибута, що має імя Ai (насправді подібні вирази вже зустрічалися кілька разів в попередньому розділі)

типи атрибутів кортежу визначені однозначно з використанням заданих значень атрибутів (наприклад, атрибут MINOR_P # НАЛЕЖИТЬ До типу р #, оскільки до типу Р # належить відповідне значення атрибуту)

Властивості кортежів

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

■ Кожен кортеж містить точно одне значення (відповідного типу) для каж дого зі своїх атрибутів

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

■ Кожна підмножина кортежу являє собою кортеж (а кожне подмножест під заголовка є заголовком) Більш того, ці властивості є істинними стосовно, зокрема, до порожніх підмножини (Див наступний абзац)

Додаткові визначення Кортеж ступеня один називається одноелементна, кортеж ступеня два – Двоелементною, кортеж ступеня три – трьохелементні (і тд) в загальному кортеж ступеня п називають n-елементним2 Кортеж нульової ступеня (Тобто кортеж без компонентів) називають нуль-елементним або нуль-арним Коротко проілюструємо останнє визначення Нижче наведений нуль-арний кортеж в системі позначень мови Tutorial D

TUPLE   {    }

Іноді для позначення кортежу нульової ступеня застосовується більш наочне уявлення, таке як 0-елементний кортеж. Це дозволяє підкреслити той факт, що даний кортеж не має компонентів На перший погляд може здатися, що нульелементние кортежі майже не мають практичного значення, але фактично виявляється, що це поняття є виключно важливим Додаткова інформація по цій темі наведена в розділі 64

Генератор типу TUPLE

У мові Tutorial D передбачений генератор типу TUPLE, який може бути викликаний у визначенні (наприклад) деякого атрибута змінної відносини або деякої змінної кортежа3 Нижче наведено приклад застосування останнього варіанту

2 Замість терміну кортеж іноді використовується термін n-елементний кортеж (і за цим принципом формуються, наприклад, вирази чотирьохелементний кортеж, двоелементний кортеж і тд) Але зазвичай прийнято опускати прикметник з позначенням кількості елементів

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

VAR ADDR TUPLE { STREET CHAR, CITY CHAR, STATE CHAR, ZIP CHAR }

Виклик генератора типу TUPLE має таку загальну форму

TUPLE  {  &ltattribute commalist&gt  )

Тут кожен параметр &ltattribute&gt з позначенням атрибута складається з імені атрибута &ltattribute name&gt, за яким слідує імя типу &lttype  name&gt.  Тип кортежу виробляється в результаті конкретного виклику генератора типу TUPLE наприклад, тип, тільки що показаний у визначенні змінної ADDR, безумовно, є згенерованим типом

Кожен тип кортежу має повязаний з ним оператор селектора кортежуНижче наведено приклад виклику селектора для типу кортежу, показаного у визначенні змінної ADDR

TUPLE    {    STREET     1 6 0 0   Pennsylvania A v e ,    CITY    Washington, STATE    DC, ZIP   20500  }

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

Операції з кортежами

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

■ По суті, всі операції реляційної алгебри (див розділ 7)

■ Потенційні ключі (див главу 9)

■ Зовнішні ключі (див також главу 9)

■ Функціональні та інші залежності (див глави 11-13)

Крім того, на цих операціях засновані визначення багатьох інших понять Нижче наведено точне визначення операції перевірки кортежів на рівність

■ Операція перевірки кортежу на рівність Кортежі tl і t2 є рівними (тобто вираз tl = t2 приймає істинне значення) тоді і тільки тоді, коли вони мають однакові атрибути А1, А2, . , An і для всіх i (i = 1, 2,

. , П) значення vl атрибута Ai в кортежі tl дорівнює значенню v2 атрибута Ai в

кортежі t2

■ Крім того (це твердження може здатися очевидним, але має бути виражене явно), кортежі tl і t2 є дублікатами по відношенню один до одного тоді і

тільки тоді, коли вони рівні у вказаному вище сенсі (це означає, що вони

дійсно нічим не відрізняються один від одного)

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

Слід також враховувати, що до кортежів не можуть застосовуватися оператори порівняння на нерівність, <" і ">” (Тобто типи кортежу не належать до категорії порядкових

типів )

На додаток до сказаного вище, в [33] запропоновані аналоги деяких широко відомих реляційних операцій (які будуть розглядатися в розділі 7) – проекція кортежу, зєднання кортежів і тд Ці операції в основному не вимагають пояснення, тому зупинимося на тому, що розглянемо тут тільки один приклад – проекцію кортежу (ця операція, ймовірно, має найбільше практичне значення) Припустимо, що змінна ADDR має визначення, вказане в попередньому підрозділі, а її поточне значення можна представити таким чином

TUPLE { STREET 1600 Pennsylvania Ave’,

CITY Washington, STATE DC, ZIP 20500 }

У цьому випадку проекція кортежу

ADDR   {   CITY,    ZIP   }

визначає наступний кортеж

T U P LE    {    C I TY    W as h i n g t o n ,    Z I P    2 0500                                         }

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

ZIP  FROM ADDR

дозволяє отримати таке значення

‘20500

Посилання на тип кортежу

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

ADDR   {   CITY,    ZIP   }

Як вже було сказано, це вираз дозволяє отримати кортеж, що утворюється з поточного значення ADDR шляхом виділення проекції за атрибутами STREET та STATE, a тип кортежу для цього похідного кортежу має наступне точне визначення

TUPLE { CITY CHAR, ZIP CHAR }

Аналогічні зауваження відносяться до всіх можливих виразів з кортежами

Операції WRAP і UNWRAP

Розглянемо такі типи кортежів

TUPLE { NAME NAME, ADDR TUPLE { STREET CHAR, CITY CHAR, STATE CHAR, ZIP CHAR } }

TUPLE { NAME NAME, STREET CHAR, CITY CHAR, STATE CHAR, ZIP CHAR }

Надалі будемо використовувати для цих типів кортежів, відповідно, позначення ТТ1 і ТТ2 Слід, зокрема, відзначити, що тип ТТ1 включає атрибут, який сам відноситься до певного типу кортежу (Але ступінь ТТ1 дорівнює двом, а не пяти) Тепер припустимо, що NADDR1 і NADDR2 – змінні кортежу типів ТТ1 і ТТ2, відповідно У такому випадку можуть бути виконані описані нижче операції

■ Вираз

NADDR2 WRAP { STREET, CITY, STATE, ZIP } AS ADDR

приймає поточне значення змінної NADDR2 і згортає компоненти STREET, CITY, STATE і ZIP цього значення для отримання компонента ADDR, значенням якого є один кортеж Тому результатом такого виразу є змінна типу ТТ1, і у звязку з цим (наприклад) наступний оператор присвоювання стає допустимим

NADDR1 := NADDR2 WRAP { STREET, CITY, STATE, ZIP } AS ADDR

■ Вираз

NADDRl   UNWRAP   ADDR

приймає поточне значення змінної NADDRl і розгортає компоненти значення змінної ADDR (значенням якої є кортеж) для отримання чотирьох окремих компонентів STREET, CITY, STATE і ZIP, тому результат даного виразу відноситься до типу ТТ2, і у звязку з цим (наприклад) наступний оператор присвоювання стає допустимим

NADDR2 := NADDRl UNWRAP ADDR

Порівняння типів кортежів і можливих уявлень

Уважний читач міг помітити певну аналогію між синтаксисом генератора типу TUPLE, який описаний в цьому розділі, і синтаксисом оголошеного можливого подання, який розглядається в розділі 5 (в обох синтаксичних визначеннях використовуються розділені комами списки елементів, а кожен елемент визначає імя деякого обєкта та імя відповідного типу), тому у читача може виникнути питання про те, чи маємо ми справу з двома поняттями або тільки з одним Насправді це два окремих поняття (і синтаксичне схожість визначень не має значення) Наприклад, якщо X відноситься до типу кортежу, то на практиці цілком може знадобитися отримати проекцію деякого значення цього типу, як описано в попередньому підрозділі Але якщо X – можливе подання для деякого скалярного типу т, то завдання отримання проекції значення цього скалярного типу т не виникає Додаткові відомості з цієї теми наведені в [33]

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

*

*