ВИЗНАЧЕННЯ ТИПУ

У мові Tutorial D нові типи можуть бути введені або за допомогою оператора TYPE, застосування якого вже було показано в деяких прикладах попереднього розділу, або за допомогою певного генератора типу Відкладемо обговорення генераторів типу і повязаного з цим питання про те, як слід визначати нескалярние типи, до розділу 56, а в цьому розділі розглянемо більш докладно оператор TYPE Нижче як прикладу наведено визначення скалярного типу WEIGHT

TYPE WEIGHT POSSREP { D DECIMAL (5,1)

CONSTRAINT D &gt 00 AND D &lt 50000 }

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

Примітка Наведене вище пропозиція в цілому являє собою обмеження типу для типу WEIGHT Загалом обмеження типу для типу т являє собою не що інше, як визначення безлічі значень, з яких складається тип т Якщо якесь оголошення POSSREP не містить явної специфікації CONSTRAINT, то за замовчуванням

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

Але приклад визначення типу WEIGHT наводить ще на одну думку В розділ 39 глави

3 було зазначено, що ваги деталей задані в фунтах Але було б недоцільно повязувати саме поняття цього типу з поняттям одиниць, яке, взагалі кажучи, є незалежним від нього (тут під терміном одиниці маються на увазі одиниці виміру) Насправді, згідно з рекомендаціями, наведеними в [33], ми повинні надати користувачам можливість трактувати ваги як вимірювані або в фунтах, або (припустимо) у грамах, передбачаючи окремі можливі уявлення для кожного з них, як показано нижче

TYPE WEIGHT

POSSREP LBS { L DECIMAL (5,1)

CONSTRAINT L &gt 00 AND L &lt 50000

} POSSREP GMS { G DECIMAL (7,1)

CONSTRAINT G &gt 00 AND G &lt 22700000

AND MOD ( G, 454 )= 00 }

Слід зазначити, що обидва оголошення POSSREP включають специфікацію CONSTRAINT і ці дві специфікації є логічно еквівалентними (MOD – це оператор, який приймає два числових операнда і повертає залишок від ділення першого операнда на другий з метою спрощення передбачається, що 1 фунт = 454 грама) З цього визначення випливають наведені нижче висновки

■ Якщо W-вираз типу WEIGHT, то оператор THE_L (W) поверне значення DECIMAL (5, 1), що представляє відповідну вагу в фунтах, а оператор THE_G (W) поверне значення DECIMAL (7, 1), що представляє ту ж вагу в грамах

176    Частина II Реляційна модель

■ Якщо N-вираз типу DECIMAL (5, 1), то обидва вирази, LBS (N) і

GMS (454 * N), повертають одне і теж значення WEIGHT

Нижче наведені описи синтаксису Tutorial D, застосовуваного для визначення

скалярного типу

&lttype def&gt                                             ::= TYPE &lttype name&gt

&ltpossrep def list&gt  

&ltpossrep  def&gt

: : =   POSSREP  [  &ltpossrep name&gt  ]

{   &ltpossrep  component  def commalist&gt

[  &ltpossrep constraint  def&gt  ]   }

&ltpossrep  component   def&gt

::=   [  &ltpossrep component name&gt  ]  &lttype name&gt

&ltpossrep  constraint  def&gt

: : =   CONSTRAINT &ltbool

exp&gt

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

1 У цьому синтаксисі використовуються і списки (list), і списки, розділені комами ми (commalist) Термін розділений комами список був визначений у главі 4 (розділ 46) термін список визначається аналогічно, таким чином Пред покладемо, що &ltxyz&gt позначає довільну синтаксичну категорію (тобто все, що може перебувати в лівій частині деякого породжує правила у формі Бекуса-Наура) У такому випадку вираз &ltxyz  list&gt позначає після довність від нуля або більше категорій &ltxyz&gt, в якій кожна пара смеж них категорій &ltxyz&gt розділена одним або декількома пропусками

2 Список повинен містити щонайменше одне определе ня можливого подання &ltpossrep  def&gt, а розділений комами список

&ltpossrep  component  def  commalist&gt повинен містити щонайменше одне визначення компонента можливого подання &ltpossrep component

def&gt.

3 Квадратні дужки [ і ] показують, що укладений у них матеріал є ється необовязковим (як зазвичай прийнято в системі позначень у формі БекусаНаура) На відміну від цього, фігурні дужки { і } позначають самі себе інакше кажучи, вони є синтаксичними символами в обумовленому мовою, а не (як звичайно) символами метамови Вірніше, фігурні дужки використовуються для включення розділених комами списків елементів, якщо розділений за пятими список призначений для позначення безлічі певного роду (При цьому, крім усього іншого, мається на увазі, що порядок, в якому еле ти присутні в розділеному комами списку, є несуттєвим, а також мається на увазі, що жоден елемент не може зявитися в списку більше одного разу)

4 Загалом вираз (Скорочення від boolean expression – логічні ське вираз) позначає істиннісне значення (TRUE або FALSE) У даному контексті вираз не повинно вказувати на будь-які змін ві, але конструкції з позначенням імен компонентів можливого представле ня &ltpossrep  component  name&gt з містить їх визначення &ltpossrep

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

Примітка Логічні вирази називаються також умовними, істиннісними

або булевими виразами

5 Відзначимо, що у визначеннях типу < type  def&gt абсолютно нічого не сказано про фізичних уявленнях Замість цього подібні подання повинні бути визначені у складі концептуального-внутрішнього відображення (див розділ 2, розділ 26)

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

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

TYPE S#  POSSREP { CHAR } TYPE NAME POSSREP { CHAR } TYPE P#   POSSREP { CHAR }

TYPE COLOR                                        POSSREP    {    CHAR }

TYPE QTY POSSREP { INTEGER }

(Як було зазначено в розділі 3, атрибут постачальника STATUS і атрибути CITY постачальника і деталі визначені в термінах вбудованих типів, а не визначаються користувачем типів, тому визначення типів, відповідні цим атрибутам, не показані)

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

DROP TYPE &lttype name&gt

Тут конструкція < type name&gt повинна позначати визначається користувачем, а не вбудований тип Ця операція викликає видалення з каталогу записи з описом цього типу, а це означає, що надалі розглянутий тип стає невідомим для системи З метою спрощення передбачається, що операція DROP TYPE закінчується невдачею, якщо розглянутий тип все ще десь використовується, зокрема, якщо на його основі визначено деякий атрибут деякої змінної відносини в тій чи іншій базі даних

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

значення типу INTEGER) Тому єдине, що відбувається при виконанні так званої операції визначення типу (Наприклад, оператора TYPE мови Tutorial D), являє собою не що інше, як введення деякого імені, за допомогою якого надалі можна буде посилатися на це безліч значень Аналогічним чином, оператор DROP TYPE фактично знищує не відповідають значення, а просто імя, введене за допомогою відповідного оператора TYPE

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

*

*