Программирование >>  Хронологические базы данных 

1 ... 38 39 40 [ 41 ] 42 43 44 ... 348


ривать отношение как таблицу, то кортежам будут соответствовать строки этой таблицы, а атрибутам - ее столбцы. Количество кортежей в таблице называется ее кардинальностью, а количество атрибутов - степенью. Домен - это совокупность значений, из которой берутся значения для определенных атрибутов определенного отношения. Например, домен, обозначенный на рис. 5.1 как Si, - это множество всех допустимых номеров поставщиков, и каждое значение, принимаемое атрибутом Si, принадлежит этому множеству (аналогично каждое значение атрибута SI в отношении поставок (см. рис. 3.8) также принадлежит этому множеству).

Все сказанное ранее подытожено на рис. 5.2. Однако следует отметить, что эти понятия эквивалентны показанным на рисунке только приблизительно (и каждый из терминов имеет точное определение). Так, отношение и таблица - это не одно и то же, хотя, как вы знаете из части I, на практике данные понятия часто отождествляются.

Формальный реляционный термин

Неформальный эквивалент

отношение

таблица

кортеж

строка или запись

кардинальность

количество строк

атрибут

столбец или поле

степень

количество столбцов

первичный ключ

уникальный идентификатор

домен

совокупность допустимых значений

Рис. 5.2. Термины, использующиеся для описания структуры таблиц баз данных

5.2. Домены

Домен - это не что иное, как тип данных (или, для краткости, - просто тип); в частности, возможно, простой, определяемый системой, подобно типам INTEGER и CHAR. В общем случае этот тип определяется пользователем, как, например, типы SI, Р, WEIGHT и QTY в базе поставщиков и деталей. В действительности термины домен и тип данных взаимозаменяемы, и в этой книге будут использоваться оба термина (хотя нам больше нравится термин тип; термин домен будет употребляться, в основном, как дань истории).

Итак, что же такое тип? Прежде всего, это множество значений - всех возможных значений рассматриваемого типа. Например, тип INTEGER - это множество всех целых чисел, тип Si - множество всех номеров поставщиков и т.д. Говоря о каком-либо типе данных, мы не должны также забывать о допустимых операторах, которые могут корректно применяться к значениям этого типа. Другими словами, значениями заданного типа можно манипулировать только с помощью операторов, определенных для этого типа. Рассмотрим, например, тип INTEGER (который для простоты будем считать определяемым системой).

Для сравнения целых чисел системой предоставляются операторы = , < и т.д.

Арифметические действия над целыми числами выполняются с помощью операторов + , * и т.д.



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

Многие системы позволяют определять собственные типы, как, например, тип S#. Возможно, нам понадобится определить операторы = и < для сравнения номеров поставщиков. С другой стороны, для данного типа наверняка не потребуется определять операторы + и * . Это означает, что выполнение арифметических действий над номерами поставщиков поддерживаться не будет (действительно, зачем может потребоваться складывать или перемножать номера поставщиков?).

Тем не менее следует различать типы данных сами по себе и физическое представление значений этих типов внутри системы. (Фактически типы являются моделями, в то время как физическое представление значений - это их реализация.) Например, номера поставщиков физически могут быть представлены как символьные строки, однако это не значит, что над ними можно выполнять те же операции, что и над строками. Выполнение любых операций возможно лишь в том случае, если для заданного типа были определены соответствующие операторы. И безусловно, определяемые для заданного типа операторы должны зависеть от реального смысла или семантики рассматриваемого типа и ни в коем случае не от его физической реализации. Более того, физическое представление типа должно быть скрыто настолько, насколько в этом заинтересован пользователь.

К настоящему моменту вы, должно быть, уже догадались, что предметом нашего обсуждения является то, что в программировании называется строгим контролем типов или строгой типизацией. Разные авторы определяют этот термин несколько по-разному. Мы же дадим ему следующее определение: строгий контроль типов имеет место, если каждое значение принадлежит какому-либо типу и при выполнении любой операции система проверяет, принадлежит ли каждый из операндов этой операции допустимому для нее типу. Рассмотрим, например, следующие выражения.

Р.WEIGHT + SP.QTY /* Вес детали плюс количество деталей */

Р.WEIGHT * SP.QTY /* Вес детали, умноженный на количество деталей */

Первое выражение не имеет никакого смысла, поэтому система должна его отвергнуть. Второе выражение имеет смысл - оно дает суммарный вес всех деталей конкретной поставки. Таким образом, определяя операторы для веса и количества деталей (в сочетании), следует включить в определение оператор * , но нет необходимости определять оператор + .

Ниже приводится еще один пример, на этот раз для операторов сравнения (в частности, для оператора равенства).

Р.WEIGHT = SP.QTY P.CITY = S.CITY

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



и в этом случае первое выражение, в отличие от второго, смысла не имеет. Таким образом, оператор = для веса и количества деталей (в сочетании) определять наверняка не следует, тогда как для сравнения городов он, скорее всего, понадобится. (Здесь мы придерживаемся мнения, высказанного в [3.3] и состоящего в том, что для каждого типа должен быть определен оператор = , поскольку всегда должна существовать возможность проверки, совпадают ли два заданных значения одного и того же типа.)

Следует отметить тот факт, что выше ничего не было сказано о природе значений, составляющих тип данных. Фактически они могут быть произвольными. Мы склонны считать, что они являются простейшими, как, например, числа или строки, однако ничто в реляционной модели не запрещает им иметь более сложный вид. Можно использовать домены, состоящие из аудио- и видеозаписей, карт, чертежей, архитектурных планов, представлений геометрических точек и т.д. Единственное требование, которому должны удовлетворять эти значения, следующее: манипулирование ими может осуществляться исключительно посредством операторов, определенных для рассматриваемого домена (физическая реализация должна быть скрыта).

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

Вопрос о том, какие типы данных поддерживаются, ортогонален вопросу о поддержке реляционной модели.

Каждое значение имеет тип

Каждое значение данных обязательно имеет некоторый тип. Другими словами, если V- значение, то оно как бы обладает неким признаком, который гласит: Я- целое число или Я - номер поставщика , или Я - геометрическая точка . Заметьте, что по определению заданное значение обязательно принадлежит лишь одному типу и никогда не может изменить свой тип (отсюда следует, что разные типы данных никогда не пересекаются, т.е. не имеют общих значений).

Каждый тип данных может быть либо скалярным, либо нескалярным. Нескалярными являются все типы, явно определенные таким образом, что в них есть компоненты, видимые для пользователя. В частности, в этом смысле нескалярными являются типы отношений. Например, отношение, представленное на рис. 5.1, принадлежит определенному типу и этот тип, несомненно, имеет видимые компоненты (а именно - атрибуты St, SNAME, STATUS и CITY). Скалярные же типы, напротив, видимых пользователю компонентов не имеют. Подведем итоги.

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

В отношении вопроса о том, какие операторы и для каких типов являются допустимыми, нами замечено, что исторически в большинстве изданий по базам данных, в том числе в нескольких первых изданиях этой книги, рассматриваются операторы сравнения ( > /= и т.д.) и не рассматриваются другие операторы, подобные * и

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



1 ... 38 39 40 [ 41 ] 42 43 44 ... 348

© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки.
Яндекс.Метрика