Главная » SQL, Базы данных » Наследование типов

0

■  Тип — это именованное множество значений (под этим подразумеваются все возможные значения рассматриваемого типа), наряду со связанным с ним множеством операторов, которые могут применяться к значениям и переменным рассматриваемого типа.

Кроме того, необходимо учитывать приведенные ниже свойства типов.

■  Каждый конкретный тип может быть определен системой или пользователем.

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

■  Подобные значения могут иметь произвольную сложность.

■     Физическое представление таких значений всегда скрыто от пользователя; это оз начает, что следует отличать типы от (физических) представлений. Но каждый тип имеет по меньшей мере одно возможное представление, которое явно предостав ляется в распоряжение пользователя с помощью соответствующих операторов ТНЕ_ (или некоторых логически эквивалентных средств).

■     Операции со значениями и переменными конкретного типа могут осуществляться исключительно с помощью операторов, определенных для рассматриваемого типа.

■     Кроме уже упомянутых операторов ТНЕ_, к ним относятся также следующие опе раторы:

■  по меньшей мере один оператор селектора (точнее, по одному такому операто

ру для каждого доступного пользователю возможного представления), который позволяет "выбирать" или задавать любое значение рассматриваемого типа с

, помощью соответствующего вызова селектора;

■  оператор проверки на равенство, который позволяет проверять любые два зна чения рассматриваемого типа для определения того, действительно ли они представляют собой одной тоже значение;

■      оператор присваивания, позволяющий присваивать значение рассматриваемого типа переменной, которая объявлена как относящаяся к рассматриваемому типу.

Кроме упомянутых свойств, необходимо отметить описанные ниже свойства.

■  Некоторые типы являются подтипами других типов, называемых  супертипами.

Если в — подтип А, то операторы и ограничения типа, которые относятся  к А, относятся также и к в (т.е., условно говоря, наследуются типом в), но сам тип в имеет собственные операторы и ограничения типа, которые не  относятся к А. (Этим утверждениям будет дано более точное определение чуть позже.)

Например, предположим, что заданы два типа, ELLIPSE (Эллипс) и CIRCLE (Окружность), которые имеют очевидную интерпретацию. В таком случае можно утверждать, что тип CIRCLE является подтипом типа ELLIPSE (а тип ELLIPSE — супертипом типа CIRCLE). Под этим подразумевается, что указанные типы характеризуются описанными ниже свойствами.

■     Каждая окружность представляет собой эллипс (т.е. множество всех окружно стей — это подмножество множества всех эллипсов), но противоположное утвер ждение не является истинным.

■     Таким образом, каждый оператор, который может применяться ко всем эллипсам в целом, применяется и к окружностям в частности (поскольку окружности — это эллипсы), но противоположное утверждение ложно. Например, оператор THE_CTR ("определение центра") может применяться к эллипсам, а поэтому и к окружно стям, но оператор THE_R ("определение радиуса") может относиться только к ок ружностям.

■     Кроме того, любое ограничение, которое относится к эллипсам в целом, распро страняется и на окружности в частности (опять-таки, поскольку окружности — это эллипсы), но противоположное утверждение является ложным. Например, на эл липсы распространяется ограничение а > b (где а и b, соответственно, большая и малая полуоси), то такое же ограничение должно удовлетворяться также и для ок ружностей. Безусловно, у окружностей длины полуосей а и b совпадают и равня ются радиусу r, поэтому задача удовлетворения указанного ограничения решается тривиально; фактически ограничение а = b может служить примером именно та кого ограничения, которое относится к окружностям в частности, но не к эллип сам в целом.

Примечание. Здесь и дальше в этой главе неуточненный термин  ограничение  используется именно для указания на ограничение типа. Кроме того, термины радиус и полуоси применяются неформально для обозначения тех понятий, которые следовало бы называть более точно как длина радиуса или длины полуосей.

Подведем итог: тип CIRCLE наследует операторы и ограничения от типа ELLIPSE, но он также имеет собственные операторы и ограничения, которые не применимы к типу ELLIPSE. Поэтому следует отметить, что подтип, по сравнению с супертипом, обладает подмножеством значений, но надмножеством свойств, а этот факт может иногда приводить к путанице! (Здесь и дальше в данной главе термин свойства используется в качестве удобного сокращения вместо операторы и ограничения.)

Область применения наследования типов

Почему эта тема заслуживает внимания? По-видимому, на этот вопрос есть по меньшей мере два ответа, приведенные ниже.

■  Создается впечатление, что идеи выделения подтипов и наследования выдвигаются на передний план естественным образом в самих практических задачах, поскольку нередко возникают такие ситуации, в которых все  значения определенного типа имеют некоторые свойства, тогда как определенное подмножество этих значений имеет, кроме них, особые собственные свойства. Поэтому средства выделения подтипов и наследования могут рассматриваться в качестве полезных инструментальных

средств   моделирования реальности   (или семантического моделирования — под

этим названием они упоминались в главе 14).

■  Кроме того, если мы сумеем распознать соответствующие закономерности (под этим подразумеваются закономерности выделения подтипов и  наследования) и встроить относящиеся к ним интеллектуальные средства в прикладное и системное программное обеспечение, то получим  возможность добиться определенных практических преимуществ. Например, программа, которая работает с эллипсами, сможет также работать с окружностями, даже если она была первоначально написана вообще без учета окружностей (возможно, в связи с тем, что тип CIRCLE ко времени  написания этой программы еще не был определен); это преимущество известно под названием повторного использования кода.

Но несмотря на наличие таких потенциальных возможностей, следует отметить, что исследователи еще не пришли к общему мнению в отношении того, какой должна быть формальная, строгая и абстрактная модель наследования типов. Ниже приведена характерная цитата из [20.13].

Основная идея наследования типов является довольно простой … [и все  же, несмотря  на  его]  центральную  роль  в  современных  …  системах,  механизм наследования   продолжает   оставаться   весьма   спорным…    [Какая-либо] всесторонняя трактовка наследования все еще отсутствует.

Изложение данного материала в настоящей главе основано на модели, разработанной автором совместно с Хью Дарвеном (Hugh Darwen) и подробно описанной1 в [3.3]. Поэтому необходимо учитывать, что другими авторами и в других источниках такие термины, как подтип и наследование, могут  использоваться в толкованиях, отличных от применяемых в настоящей книге. Призываем читателя быть внимательным!

Некоторые предварительные сведения

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

■     Типизация значений.

Как было указано в главе 5, если v представляет собой значение, то v можно рассматривать как своего рода объект, обозначенный флажком, на котором указано: "Я — целое число", "Я — номер поставщика" или "Я — окружность" (и т.д.). Итак, если не применяется наследование, то каждое значение относится к одному и только к одному типу, а при использовании наследования значение может принадлежать одновременно к нескольким типам. Например, определенное значение может одновременно относиться к типам ELLIPSE И CIRCLE.

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

■     Типизация переменных.

Каждая переменная имеет один и только один объявленный тип. Например, переменная может быть объявлена следующим образом.

VAR   E   ELLIPSE   ;

Здесь объявленным типом переменной Е является ELLIPSE. Итак, если не используется наследование, то все возможные значения некоторой переменной относятся к одному и только к одному типу, а именно к  соответствующему объявленному типу. Если же применяется наследование, то любая конкретная переменная может иметь значение, которое одновременно относится к нескольким типам, например, текущим значением переменной Е может оказаться эллипс, который фактически является  окружностью и поэтому относится одновременно к типам ELLIPSE и CIRCLE.

■     Различия между одинарным и множественным наследованием.

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

■     Наследование скаляров, кортежей и отношений.

Безусловно,  понятие  наследования  распространяется  не  только  на  скалярные2 значения, но и на нескалярные, поскольку в конечном итоге нескалярные значения состоят из скалярных. В частности, это понятие  распространяется также на значения кортежей и отношений. Но даже тема  наследования скаляров является достаточно сложной (и этот факт также  достоин удивления), поэтому в данной главе основное внимание уделено наследованию скаляров и в ней неуточненные термины тип, значение,  переменная, оператор и выражение относятся именно к скалярным типам, значениям, переменным, операторам и выражениям. Для ознакомления с  подробным описанием всех видов наследования, включая не только скаляры, но и кортежи и отношения, обратитесь к [3.3].

2  Напомним, что скалярными называются такие значения, которые не имеют компонентов, видимых пользователю. Не позволяйте сбить себя с толку в связи с тем, что некоторые  скалярные типы имеют возможные представления, имеющие, в свою очередь, видимые пользователю компоненты (как описано в главе 5), поскольку эти компоненты являются  компонентами возможного представления, а не компонентами типа, несмотря на тот факт, что мы иногда недопустимо трактуем их так, как если бы они действительно были компонентами типа.

774     Часть V. Дополнительные темы

Наследование структуры и функций.

Напомним,  что  скалярные  значения  могут  иметь  внутреннее  (т.е.  физическое) представление, или структуру произвольной сложности, например, как уже было сказано выше, эллипсы и окружности, которые в определенных обстоятельствах могут на законных основаниях  рассматриваться как скалярные значения, безусловно, могут обладать весьма сложной внутренней структурой. Но эта внутренняя структура всегда скрыта от пользователя. На основании этого можно сделать вывод, что если речь идет о наследовании (по меньшей мере, в той степени, в которой рассматривается модель, предложенная автором), под этим не подразумевается наследование структуры, поскольку с точки зрения  пользователя тип не имеет структуры, которую можно было бы наследовать! Иными словами, нас интересует то,  что  иногда  в  литературе  называется  наследованием  функций  (behavioral inheritance), а не наследованием структуры (structural inheritance), где под функциями подразумеваются операторы, но напомним, что в рассматриваемой модели, по меньшей мере, наследуются также ограничения.

Примечание. Автор не исключает возможности наследования структуры, но  э та тема  рассматривается  как  относящаяся  только  к  вопросам   реализации  и  не имеющая отношения к самой модели.

"Подтаблицы и супертаблицы".

Теперь читателю должно быть ясно, что рассматриваемая модель  наследования касается того, что в терминах теории реляционных баз данных можно было назвать наследованием доменов (напомним, что домены и типы — это одно и то же). Но, столкнувшись с вопросом о том, существует ли возможность наследования в реляционном контексте,  большинство специалистов сразу же предполагает, что речь идет о какой-то разновидности наследования таблиц. Например, в языке SQL предусмотрены средства поддержки определенных объектов, называемых в  этом языке подтаблицами и супертаблицами, согласно которым определенная таблица в может унаследовать все столбцы некоторой другой таблицы А, а затем быть дополнена некоторыми собственными столбцами (см. главу 26). Но, по мнению автора, понятие подтаблиц и супертаблиц представляет собой нечто совсем иное, и хотя оно и может представлять определенный интерес (несмотря на то, что автор относится к нему скептически [14.13]), но не имеет ничего общего с наследованием типов как таковым.

Приведем еще одно, последнее предварительное замечание — тема наследования типов фактически относится к проблематике изучения данных в целом и не ограничивается изучением лишь данных, хранимых в базе данных, в частности. Поэтому для упрощения большинство примеров этой главы выражено в терминах локальных данных (обычных переменных программ и т.д.), а не данных из базы данных.

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

По теме:

  • Комментарии