Третий манифест Кристофера Дейта и Хью Дарвена
Формальные определения
Формальные определенияПоскольку этот раздел носит очень формальный характер, Д&Д начинают его с повтора некоторых необходимых определений. Пусть r - отношение, A - имя атрибута r, T - тип атрибута A, v - значение типа T. Тогда:
Заметим, что заголовок - это множество, тело - это множество, и кортеж - это множество. Элемент заголовка - это упорядоченная пара вида ; элемент тела - это кортеж; элемент кортежа - это упорядоченный триплет вида . Любое подмножество заголовка - это заголовок, любое подмножество тела - это тело, и любое подмножество кортежа - это кортеж.
Теперь можно определить операции. Каждое из определений состоит из (a) формальной спецификации ограничений (если они имеются), применимых к операндам соответствующей операции; (b) формальная спецификация заголовка результата операции; (c) формальную спецификацию тела результата и (d) неформальное обсуждение формальных спецификаций.
Hs = Hr
Bs = { ts : exists tr ( tr П Br and ts = tr ) }
Операция >NOT< производит дополнение s заданного отношения r. Заголовком s является заголовок r. Тело s включает все кортежи с этим заголовком, не входящие в тело r.
Hs = Hr minus { }
Ds = { ts : exists tr exists v
( tr Br and v T and tr and ts = tr minus { } ) }
Операция >REMOVE< производит отношение s, формируемое путем удаления указанного атрибута A из данного отношения r. Операция эквивалентна взятию проекции r на все атрибуты, кроме A. Заголовок s получается вычитанием из заголовка r пары . Тело s состоит из таких кортежей, которые соответствуют заголовку и каждый из которых является подмножеством некоторого кортежа r.
Hr. Hs = ( Hr minus { } ) union { } Bs = { ts : exists tr exists v ( tr Br and v T and tr and ts = ( tr minus { } ) union { } )
Операция >RENAME< производит отношение s, которое отличается отзаданного отношения r только именем одного атрибута, которое изменяется с A на B. Заголовок s такой же, как заголовок r за исключением того, что пара заменяется на пару . Тело s включает все кортежи тела r, но в каждом из этих кортежей триплет заменяется на триплет .
Hs = Hr1 union Hr2 Bs = { ts : exists tr1 exists tr2 ( ( tr1 Br1 and tr2 Br2 ) and ts = tr1 union tr2 ) }
Операция >AND< является реляционной конъюнкцией, производящей результат, называвшийся ранее в литературе естественным соединением заданных отношений r1 и r2. Заголовок s является объединением заголовков r1 и r2. Тело s состоит из всех кортежей, соответствующих заголовку s и являющихся надмножеством некоторого кортежа из тела r1 и некоторого кортежа из тела r2. Операцию >AND< можно было бы логически назвать conjoin (конъюнктивным соединением).
Hs = Hr1 union Hr2 Bs = { ts : exists tr1 exists tr2 ( ( tr1 Br1 or tr2 Br2 ) and ts = tr1 union tr2 ) }
Операция >OR< является реляционной дизъюнкцией, являясь обобщением того, что ранее в литературе называлось объединением (в этом частном случае заданные отношения r1 и r2 имеют одинаковые заголовки, и результат s является объединением этих двух отношений в традиционном смысле). Заголовок s есть объединение заголовков r1 и r2. Тело s состоит из всех кортежей, соответствующих заголовку s и являющихся надмножеством либо некоторого кортежа из тела r1, либо некоторого кортежа из тела r2. Операцию >OR< можно было бы логически назвать disjoin (дизъюнктивным соединением).
Наконец, определим "макро"-операцию >COMPOSE<. Пусть s есть r1 >COMPOSE< r2 (r1 и r2 должны удовлетворять тем же требованиям, что и для >AND<). Пусть общими атрибутами для r1 и r2 являются A1, A2, …, An (n і 0). Тогда s определяется как результат выражения
( r1 >AND< r2 ) >REMOVE< An … >REMOVE< A2 >REMOVE< A1
При n = 0 r1 >COMPOSE< r2 - это то же самое, что r1 >AND< r2, что, в свою очередь, то же самое, что r1 TIMES r2 в алгебре Кодда.
Мотивация и обоснование
Мотивация и обоснованиеДля простоты в этом разделе используется не слишком формальный подход. В частности, вместо введенного в третьей главе формального определения кортежа здесь под кортежем понимается разделяемый запятыми список значений. Поскольку в этой главе активно используются идеи логики предикатов, требуется сделать короткие замечания по поводу терминологии:
Разработка алгебры A мотивируется следующими целями:
Вот более подробное обсуждение четырех принципиальных отличий A от предшествовавших алгебр.
Отсутствие TIMES
Когда в логике два предиката соединяются связкой and, нужно обращать внимание на имена заменителей. Любое имя заменителя, которое появляется в обоих предикатах, должно пониматься как обозначающее одно и то же в новообразованном предикате. Например, рассмотрим два предиката, выраженные на естественном языке: "Служащий E работает в отделе D" и "Служащий E работает над проектом J".
Связка этих двух предикатов с использованием and порождает триадный, а не тетрадный предикат: "Служащий E работает в отделе D и служащий E работает над проектом J". Этот предикат можно представить в сокращенной форме "Служащий E работает в отделе D над проектом J", чтобы подчеркнуть тот факт, что мы не можем подставить некоторого конкретного служащего для E, который работает в отделе D, не подставив того же служащего для E, работающего над проектом J. Это наблюдение позволяет заметить, что заменители тесно связаны с хорошо известной операцией естественного соединения и, конечно, с операцией >AND< алгебры A.
Что касается операции TIMES, она, конечно, является частным случаем соединения (>AND< в алгебре A). Более точно, TIMES соответствует связке через and двух предикатов без общих заменителей, например, "Служащий E работает в отделе D, и у проекта J имеется бюджет B".
Кстати, приведенная выше сокращенная формулировка предиката может привести к ошибочному заключению, что проект J каким-то образом связан с отделом D. Кодд называл этот вид ошибок "ловушкой связи", а позже его иногда называли "ловушкой соединений", что не очень удачно, поскольку ситуация не уникальна для соединений и реляционных операций вообще.
Отсутствие UNION
Предикаты естественного языка могут комбинироваться не только с помощью and, но и с помощью or. Триадному предикату "Служащий E работает в отделе D или служащий E работает над проектом J" соответствует тернарное отношение. Если служащий EX работает в отделе DX, то кортеж (EX, DX, J) входит в тело этого отношения для всех возможных проектов J независимо от того, работает ли реально служащий EX над проектом J (и даже независимо от того, выполняется ли проект J в это время в компании). Аналогично, если служащий EX работает над проектом JX, то кортеж (EX, D, JX) входит в тело отношения для всех возможных отделов D независимо от того, работает ли реально служащий EX в отделе D (и даже независимо от того, существует ли отдел D в это время в компании).
Операция >OR< вводится в алгебру A как двойник операции or. Классическая операция UNION является частным случаем >OR< и соответствует связыванию через or двух предикатов, которые содержат в точности один и тот же набор заменителей, например, "Служащий E работает в отделе D или служащий E прикомандирован к отделу D".
Здесь и далее Д&Д умышленно оставляют в стороне вычислительные проблемы выполнения операции.
Отсутствие MINUS
Пусть WORKS_IN - это отношение с атрибутами E (служащий) и D (отдел), а соответствующий предикат - "Служащий E работает в отделе D". Тело логического дополнения (>NOT<) этого отношения состоит из всех возможных кортежей в форме (E, D), для которых неверно, что служащий E работает в отделе D.
Чтобы показать возможность устранения операции MINUS, рассмотрим следующий пример. Предположим, что в придачу к отношению WORKS_IN имеется отношение WORKS_ON с атрибутами E и J (проект), а соответствующий предикат - "Служащий E работает над проектом J". Рассмотрим теперь унарное отношение, соответствующее монадному предикату "Служащий E работает в некотором отделе, но не работает ни над каким проектом". К алгебре Кодда это отношение можно было бы получить, спроецировав отношения WORKS_IN и WORKS_ON на атрибут E и взяв затем соответствующую разность. В алгебре A мы сначала проецируем WORKS_ON на E, а затем берем >NOT< от этой проекции; соответствующим предикатом будет "Не существует такого проекта, над которым бы работал служащий E". Потом это отношение можно соединить (>AND<) с отношением WORKS_IN, и проекция этого соединения на E даст искомый результат.
Отсутствие restrict (WHERE), EXTEND и SUMMARIZE
При выполнении restrict (WHERE), EXTEND и SUMMARIZE требуются вызовы некоторых операций. В случае restrict эти операции возвращают значения (инстинностные значения), используемые для предотвращения появления некоторых кортежей в результирующем отношении; в случае EXTEND и SUMMARIZE операции возвращают значения, на основе которых определяются некоторые атрибуты результирующего отношения.
Для целей Д&Д имеет смысл и может быть полезно рассматривать такие операции как отношения. Рассмотрим операцию Op, являющуюся скалярной функции (операцию, возвращающую в точности один результат, являющийся скалярным значением). Предположим, что у Op имеется n параметров. Тогда можно трактовать Op как отношение с n+1 атрибутами, по одному на каждый параметр и один на результат. Конечно, атрибуты, соответствующие параметрам, образуют возможный ключ этого отношения; однако это возможный ключ может не быть единственным. Например, если PLUS - это отношение с атрибутами X, Y и Z, тип каждого из которых INTEGER, и это отношение соответствует скалярной функции "+" целой арифметики и предикату "X + Y = Z", то возможными ключами отношения являются комбинации {X, Y}, {X, Z} и {Y, Z}, а в тело отношения входит по одному кортежу (X, Y, Z) для всех возможных комбинаций X, Y, Z, удовлетворяющих предикату.
Замечание: По аналогии с relvar можно относиться к отношениям типа PLUS как к relcon, или как к реляционным константам: они именованы, но их значения не изменяются во времени. И, конечно, упоминавшиеся возможные ключи - это ключи реляционной константы, а не реляционной переменной.
Итак, скалярная функция является частным случаем отношения. Более точно, любой отношение можно рассматривать как операцию, отображающее некоторое подмножество его атрибутов на оставшиеся атрибуты; если это отображение является функциональным (много-к-одному), то отношение можно считать функцией. Поскольку у множества из n элементов имеется 2n подмножеств, отношение степени n можно считать представлением 2n различных операций, некоторые из которых функции, а некоторые - нет (в общем случае). Например, если рассматривать PLUS как операцию, отображающую Z в X и Y, то это отображение не функционально (не поддерживаются функциональные зависимости ZX и ZY), и соответствующая операция не является функцией.
В следующем разделе показывается, что при подобной трактовке операций и наличии операций алгебры A >AND<, >REMOVE< и >RENAME< можно отказаться от непосредственной поддержки операций restrict, EXTEND и SUMMARIZE.
Новая реляционная алгебра
Новая реляционная алгебра
Введение
В четвертой главе предлагается новая реляционная алгебра, которую Дейт и Дарвен (Д&Д) называют A - двойной рекурсивный акроним от ALGEBRA, что, в свою очередь, раскрывается в "A Logical Genesis Explains Basic Relational Algebra". Основная цель, которая преследовалась при разработке алгебры A, состояла в том, чтобы более четко показать связь этой дисциплины с логикой первого порядка.
Алгебра A отличается от оригинальной алгебры Кодда четырьмя основными аспектами:
Кроме перечисленных трех операций в состав алгебры A входят операции >RENAME<, >REMOTE< и >COMPOSE<, а также операция транзитивного замыкания >TCLOSE<.
Обращение с операциями как с отношениями
Обращение с операциями как с отношениямиОбратимся снова к отношению PLUS с целочисленными атрибутами X, Y и Z, соответствующему предикату "X + Y = Z". Пусть TWO_AND_TWO - это (уникальное) отношение, тело которого состоит из единственного кортежа
{ < X, INTEGER, 2 >,
Тогда выражение
TWO_AND_TWO >COMPOSE< PLUS
произведет отношение, тело которого состоит из единственного кортежа
{ < Z, INTEGER, 4> }
Тем самым, на самом деле была вызвана операция "+" с аргументами X = 2 и Y = 2, и был получен результат Z = 4 (заметим, что у результата имеется имя Z; Д&Д изучают возможные последствия этого для языка D). Конечно, этот результат является встроенным как значение атрибута внутри кортежа отношения. Чтобы извлечь результат в виде чистого скалярного значения, необходимо выйти за пределы алгебры A и применить операции (требуемые RM-утверждениями 7 и 6 соответственно) для (a) извлечения указанного кортежа из указанного отношения и (b) для извлечения значения указанного атрибута из указанного кортежа. В терминах языка TUTORIAL D эти извлечения можно выполнить следующим образом:
Z FROM ( TUPLE FROM ( result ) )
где result обозначает результат вычисления A-выражения TWO_AND_TWO >COMPOSE< PLUS.
Однако для целей этого раздела Д&Д интересуются обхождением с операциями как с отношениями в чисто реляционном контексте. В частности, этот подход позволяет объяснить суть классической реляционной операции EXTEND чисто реляционным образом.
Рассмотрим выражение TWO_AND_TWO >AND< PLUS.
Результатом этого выражения является отношение, тело которого состоит в точности из одного кортежа
{ < X, INTEGER, 2 >, < Y, INTEGER, 2 >, < Z, INTEGER, 2 > }
Следует отчетливо понимать, что это выражение A логически эквивалентно следующему расширению на языке TUTORIAL D:
EXTEND TWO_AND_TWO ADD X + Y AS Z
Этого примера достаточно, чтобы показать, каким образом можно отказаться от операции EXTEND.
Более того, то же самое выражение логически эквивалентно следующем ограничению на языке TUTORIAL D:
PLUS WHERE X = 2 AND Y = 2
Этого примера достаточно, чтобы показать, каким образом можно отказаться от restrict.
Что касается операции SUMMARIZE, то хорошо известно, что любое суммирование можно выразить в терминах EXTEND, а не самой SUMMARIZE (детали обсуждаются в пятой и шестой главах). Из этого следует, что можно отказаться и от SUMMARIZE.
В конце раздела Д&Д отмечают, что не только со скалярными функциями можно обращаться как с отношениями. Вот примеры:
Рассмотрим эти примеры немного глубже. Очевидно, что SORT можно воспринимать как отношение с атрибутами, например, X и Y типа RATIONAL. Но это отношение не является функцией, поскольку отсутствует функциональная зависимость YаX (например, одновременно присутствуют кортежи (4.0, +2.0) и (4.0, -2.0)). (С другой стороны, функциональная зависимость XаY поддерживается.) Это отношение содержит:
Из этого следует, что выражение
SQRT >COMPOSE< { { < X, RATIONAL, 4.0 > } }
по сути дела представляет вызов операции SQRT, но при вызове образуются два результата. Более точно, производится унарное отношение со следующим телом:
{ { < Y, RATIONAL, +2.0 > },
< Y, RATIONAL, -2.0 > } }
(При желании теперь можно по отдельности выбрать из результата каждый из этих кортежей, а потом по отдельности извлечь из этих кортежей каждое из двух скалярных значений.) Одним из выводов Д&Д является то, что в реляционном языке D может оказаться разумным поддерживать расширенную форму EXTEND, не обязательно гарантирующую появление ровно одного выходного кортежа для каждого входного кортежа.
Очевидно, что можно обращаться как с отношением и с операцией ADDR_OF. Это отношение имело бы атрибуты E, STREET, CITY, STATE и ZIP, а атрибут E был бы возможным ключом. Поэтому выражение
{ { < E, EMPLOYEE, e > } } >COMPOSE< ADDR_OF
(e обозначает некоторого служащего) на самом деле представляет вызов операции ADDR_OF, возвращающий не скалярное значение. Одним из выводов Д&Д является то, что в языке D может оказаться разумным поддерживать расширенную форму EXTEND, не обязательно гарантирующей появление ровно одного дополнительного атрибута.
Очень строгие OO-суждения
Очень строгие OO-сужденияОтрицательные OO-утверждения
Отрицательные OO-утвержденияКак видно, это очередной "наезд" на объектно-ориентированный мир. Но утверждение не слишком корректное, поскольку в объектном мире никто и никогда не утверждал, что у значений должны существовать ID. Говорится про "object identity", то есть про существование уникальной идентификации объектов. Но Д&Д вообще не хотят соглашаться с наличием понятия объекта.
Очень строгие RM-суждения
В языке D следует поддерживать такие возможности, но без какой-либо гарантии того, что a) эти выводимые ключи не составляют точного надмножества множества реальных возможных ключей и b) выводимый возможный ключ обнаружен для каждого реального возможного ключа.
В следующий раз мы обсудим соответствующий механизм, предлагаемый Д&Д в их Tutorial D.
У меня имеются сильные сомнения относительно реальности последнего суждения. В прошлом предпринимались многочисленные попытки реализации SQL с использованием реляционной алгебры, и они приводили к необходимости очень сильных расширений алгебры. При той реляционной чистоте, которую Д&Д требуют от языка D, его возможностей, скорее всего, не хватит для реализации огромного и разнородного языка SQL.
Отрицательные RM-утверждения
Отрицательные RM-утвержденияЭто один из первых намеков Д&Д на то, что не должны поддерживаться неопределенные значения (NULL). С моей точки зрения, при всех отрицательных явлениях, порождаемых неопределенными значениями, пока Д&Д не удалось предложить альтернативный работающий подход.
Положительные OO-утверждения
Положительные OO-утвержденияЭтот раздел явно подчеркивает трактовку Д&Д OO как "Other Orthogonal", а не как "Object-Oriented". По сути дела, ни одно из положительных OO-утверждений не имеет прямого отношения к объектной ориентации.
При этом:
Последнее OO-утверждение снова явно направлено на избавление от неопределенных значений. Но, во-первых, лично для меня совершенно неочевидно, что при сложении пустого набора чисел должно получиться значение 0. По-моему, это как минимум неясно с позиций интуиции. Во-вторых, во второй части этого утверждения появляется словосочетание "неопределенный результат", но что это значит, формально не поясняется.
Положительные RM-утверждения
Третий манифест
Положительные RM-утверждения
В состав системных скалярных типов должен входить тип truth value (с двуми значениями true и false). Для этого типа должны поддерживаться все требуемые логические операции.
Прочие скалярные операции - операции только чтения.
автоматически должен быть определен набор операций только чтения и обновления такой, что:
Такой набор операций должен обеспечиваться для каждого возможного представления, объявленного в определении T.
Генерируемый тип TUPLE {H} называется типом кортежей, и имя этого типа - TUPLE {H}. К этому типу, его значениям и переменным применима терминология степени, атрибутов и заголовков (RM-утверждение 12), вводимая в RM-утверждении 9. Типы кортежей TUPLE {H1} и TUPLE {H2} совпадают в том и только в том случае, когда H1 = H2. Применимые операции должны включать аналоги операций реляционной алгебры RENAME, project, EXTEND и JOIN (RM-утверждение 18), а также операции присваивания кортежей (RM-утверждение 21) и сравнения кортежей (RM-утверждение 22); кроме того, должна иметься (a) операция выбора кортежей (RM-утверждение 9), (b) операция извлечения из указанного кортежа значения указанного атрибута (этот кортеж должен иметь степень один - см. RM-утверждение 9) и (c) операции "nesting" и "unnesting" для кортежей.
RM- утверждение 10) должна иметься возможность использования генерируемого типа RELATION {H} для определения (или, в случае значений, для выбора):
Генерируемый тип RELATION {H} называется типом отношения, и имя этого типа - TUPLE {H}. К этому типу, его значениям и переменным применима терминология степени, атрибутов и заголовков (RM-утверждение 13), вводимая в RM-утверждении 10. Типы отношения RELATION {H1} и RELATION {H2} совпадают в том и только в том случае, когда H1 = H2. Применимые операции должны включать операции реляционной алгебры (RM-утверждение 18), а также операции реляционного присваивания (RM-утверждение 21) и реляционного сравнения (RM-утверждение 22); кроме того, должна иметься (a) операция выбора отношения (RM-утверждение 10), (b) операция извлечения из указанного отношения указанного кортежа (это отношение должно иметь мощность один - см. RM-утверждение 10) и (c) операции "nesting" и "unnesting" для отношений..
Мощность множества триплетов в t, или число атрибутов t называется степенью t. Множество упорядоченных пар , получающихся путем удаления компонента v из каждого триплета, является заголовком t. Кортеж t называется соответствующим этому заголовку (принадлежит к соответствующему типу кортежа - см. RM-утверждение 6). Степень заголовка - это степень кортежа, а атрибуты и соответствующие типы заголовка - это атрибуты и соответствующие типы кортежа t. При заданном заголовке H должна быть доступна операция selector для выбора произвольного кортежа, соответствующего H.
При заданном заголовке отношения H должна быть доступна операция selector для выбора произвольного отношения, соответствующего H.
Объявленный тип этой переменной кортежа есть TUPLE {H}. Атрибутами переменной кортежа являются атрибуты H, соответствующие типы - объявленные типы этих атрибутов, степень переменной кортежа - степень H. В языке D должны иметься доступные для пользователей средства определения переменных кортежей. При определении переменной кортежа должна производиться инициализация переменной некоторым значением - явно указанным в операции определения переменной или не указываемым явно, определенным в реализации.
В каждом случае типы источника и цели должны совпадать. В дополнение к этому в языке D должна поддерживаться множественная форма операции присваивания, в которой несколько отдельных присваиваний выполняются в некоторой указанной последовательности как часть одной логической операции.
Во всех случаях, кроме "", операнды должны быть одного типа, а в случае "" кортеж и отношение должны иметь одинаковые заголовки.
|
>REMOVE<, >RENAME< и >COMPOSE<
>REMOVE<, >RENAME< и >COMPOSE<>REMOTE<
Операция >REMOTE< является двойником в алгебре A квантора существования логики предикатов. Она соответствует операции project Кодда. Отличие состоит в том, что в >REMOTE< указываются не атрибуты, которые должны сохраниться в результате, а атрибуты, которые следует удалить. Мотивация Д&Д является психологической: проекция отношения с атрибутами X и Y на X эквивалентна квантификации существования по Y. Например, проекция WORKS_IN на E эквивалентна предикату на естественном языке "Существует некоторый отдел D такой, что служащий E работает в отделе D".
>RENAME<
>RENAME< ("переименовать некоторый атрибут некоторого отношения") - это еще одна примитивная операция алгебры A. Такая операция существенна для любого конкретного синтаксиса реляционных выражений, в котором атрибуты различаются по именам.
>COMPOSE<
"Макро"-операция >COMPOSE< является комбинацией >AND< и >REMOTE<. При выполнении операции к общим атрибутам отношений, для которых выполняется >AND<, затем применяется >REMOTE<. Имя операции >COMPOSE< отражает то суждение, что такая реляционная композиция является естественным обобщением функциональной композии (композицией двух функций f (…) и g (…) -- в таком порядке -- является функция f (g (…) )). Операция реляционной композиции упоминалась в ранних статьях Кодда, но в последствии по некоторым причинам он ее устранил; Д&Д сочли эту операцию полезной для поддержки их намерения трактовать операции как отношения.
Транзитивное замыкание
Транзитивное замыканиеАлгебра A отходит от оригинальной алгебры Кодда еще в одном отношении: она включает явную операцию транзитивного замыкания >TCLOSE<. Чтобы объяснить, как работает операция, рассмотрим отношение MM (рис. 1). Это отношение является примером того, что иногда называют диграфовым отношением, поскольку его можно представить как направленный граф.
MM MAJOR_P# : P# MINOR_P# : P# ------------------------------------- P1 P2 P1 P3 P2 P3 P2 P4 P3 P5 P4 P6
Рис. 1 Отношение MM
Из интуитивных соображений иногда удобнее преобразовать направленный граф (рис. 2) в виде числой иерархии с возможно повторяющимися узлами (рис. 3). Конечно, эти два графа информационно эквивалентны.
Рис. 2 Граф отношения MM
Рис. 3 Граф отношения MM в виде иерархии
Поскольку MM является бинарным отношением, к нему можно применить операцию транзитивного замыкания. Операция описывается следующим образом:
{ < X, T, x >,
входит в r+ том и только в том случае, когда он входит в r или существует последовательность значений z1, z2, …, zn (все типа T) таких, что кортежи
{ < X, T, x >, < Y, T, z1 > }
{ < X, T, z1 >, < Y, T, z2 > }
……………………
{ < X, T, zn >, < Y, T, y > }
все входят в r. Другими словами кортеж "(x, y)" входит в результат, только если существует путь в графе из узла x в узел y. Вот результат транзитивного замыкания отношения MM (рис. 4).
MAJOR_P# : P# MINOR_P# : P# ----------------------------- P1 P2 P1 P3 P2 P3 P2 P4 P3 P5 P4 P6 P1 P4 P1 P5 P1 P6 P2 P5 P2 P6
Рис. 4 Транзитивное замыкание MM
|
Третий манифест Кристофера Дейта и Хью Дарвена: предпосылки и обзор
1999 гТретий манифест Кристофера Дейта и Хью Дарвена: предпосылки и обзор
Летом 1998 г. в издательстве Addison-Wesley вышла книга Криса Дейта и Хью Дарвена "Foundation for Object/Relational Databases: The Third Manifesto". В этой книге глубоко и обоснованно развиваются идеи, первоначально сформулированные в статье тех же авторов [1]. На мой взгляд, книга содержит ряд спорных утверждений и предположений, но прошедшие со дня ее выхода месяцы показали наличие достаточно активного интереса к книге, и имеются основания полагать, что она повлияет на будущие теорию и практику баз данных.
Поскольку для широкого круга русских читателей книга практически недоступна, я решил в нескольких статьях познакомить вас с основными идеями книги. Это будет не просто пересказ, поскольку по мере возможности я буду комментировать спорные (с моей точки зрения) места. В тексте эти комментарии выделяются курсивом.
Первая статья посвящается вводной главе книги "Предпосылки и обзор", в которой описываются причины, побудившие авторов к ее написанию, и приводится краткий обзор базовых идей, а также второй главе "Объекты и отношения", где обсуждаются связь понятий "объект" и "отношение".
Предпосылки и обзор
Причины написания книги
Указываемой первичной причиной является неудовлетворенность предлагаемыми другими исследователями и авторами подходами к интеграции реляционной и объектной технологии. Публикации [1] предшествовали два манифеста - Манифест объектно-ориентированных систем баз данных [2] и Манифест систем баз данных третьего поколения [3], в каждом из которых предлагался некоторый базис для развития будущих СУБД. Но при этом:
Это первое спорное утверждение. Как известно, объектно-ориентированные и другие нереляционные СУБД достаточно успешно существуют и используются.
1999 г
Третий манифест Кристофера Дейта и Хью Дарвена: немного формализма
Продолжаю знакомить вас с книгой Криса Дейта и Хью Дарвена "Foundation for Object/Relational Databases: The Third Manifesto". В этой статье мы рассмотрим третью и четвертую главы книги - "Третий манифест" и "Новая реляционная алгебра". Третья глава читается не очень легко. Она написана в очень формальном стиле и не содержит пояснений. Но без этого материала трудно понять следующие, неформальные и дискуссионные главы. Мне очень нравится четвертая глава, где вводится новая, минимизированная версия реляционной алгебры. По-моему, создание этой алгебры относится к высшим достижениям авторов книги. По причине формального характера этих глав в предлагаемом вашему вниманию сокращенном пересказе содержится не слишком много моих собственных комментариев. В обзоре главы про алгебру их нет вообще, поскольку у меня действительно отсутствуют какие-либо замечания по поводу этого материала.
В отличие от этого, Д&Д категорически утверждают, что в интересах будущего развития требуется полностью отказаться от SQL. Осознавая наличие громадного числа SQL-ориентированных баз данных и приложений, которые будут продолжать использоваться в течение долгого времени, Д&Д соглашаются с тем, что требуется уделять некоторое внимание продолжению поддержки наследства SQL.
Назад к реляционному будущему
Основным тезисом книги является то, что мы должны отказаться от SQL и вернуться к реляционным истокам. Д&Д считают, что необходимую основу обеспечивает Реляционная Модель Данных, впервые представленная миру Эдвардом Коддом в 1969 г. Признавая желательность объектно-ориентированных свойств в системах баз данных, Д&Д полагают, что эти свойства являются ортогональными к реляционной модели. Не требуются какие-либо переделки реляционной модели, чтобы можно было определить язык, который
Если предположить существование такого языка D (а позже в книге приводится неформальное описание языка Tutorial D), то, по мнению Д&Д, он должен соответствовать ряду положительных и отрицательных утверждений (prescriptions и proscriptions). Авторы выделяют утверждения, происходящие из реляционной модели (RM Prescriptions), и те, которые к ней не относятся, - Other Orthogonal (OO) Prescriptions.
Обратите внимание, что везде далее в книге OO используется именно в смысле Other Orthogonal, а не Object-Oriented, хотя, конечно, в основном имеются в виду объектные свойства.
При этом утверждения категории RM считаются необсуждаемыми, но что касается OO-утверждений, то отсутствие общепризнанной модели делает их в некотором роде "пробными".
Кроме того, в книге содержится набор Весьма Строгих Утверждений, которые тоже разбиты на категории RM и OO.
Некоторые руководящие принципы
Во всей своей книге Д&Д следуют некоторым руководящим принципам, среди которых основным и определяющим является максима, принадлежащая, как думают авторы, Людвигу Витгенштейну:
ВСЕ ЛОГИЧЕСКИЕ РАЗЛИЧИЯ ЯВЛЯЮТСЯ БОЛЬШИМИ РАЗЛИЧИЯМИ
Это особенно важно к контексте реляционной модели, являющейся формальной системой, а основой любой формальной системы является логика.
Следствием этой максимы является тот принцип, что логические ошибки являются большими ошибками. В индустрии баз данных делалось и делается большое число таких ошибок.
Д&Д считают верным принцип, основанный на противоположном толковании максимы Витгенштейна: все различия, не являющиеся логическими, представляют собой небольшие различия. Одним из результатов следования этому принципу является то, что при определении Tutorial D Д&Д обращали больше внимания на логичность построения языка, а не на его синтаксис.
Наконец, еще один фундаментальный принцип, которому очень трудно следовать, почерпнут из Мифического человекомесяца Фреда Брукса - это принцип концептуальной целостности.
Некоторые решающие логические различия
Модель и реализация
В книге главным образом обсуждаются аспекты модели, а не реализации. Кроме того, под реализацией понимается реализация "системы" (т.е. СУБД), а не некоторого приложения, работающего под управлением этой системы.
Думаю, что с таким определением модели не согласятся математики, хотя на интуитивном уровне оно правильно. Вообще говоря, поскольку модель - это формальная система, ее определение тоже должно быть формальным.
Значения и переменные
Люди часто путают эти простые и фундаментальные понятия.
В соответствии с Кливлэндом в книге используются следующие определения:
Значения могут быть произвольно сложными; например, значение может быть массивом, стеком, списком, геометрической точкой, документом и т.д. Аналогичные замечания относятся и к переменным.
Как отмечают Д&Д, большая путаница по поводу значений и переменных имеется в объектном мире, где различают тип переменной и тип объекта, являющегося текущим значением этой переменной; объекты и значения; признают наличие операций, воздействующих на состояние объекта. Именно по причине этой путаницы авторы книги стараются вообще не использовать термин "объект".
Значения, кодировки и появления
Логическое различие проводится между значением как таковым и кодировкой этого значения, появляющимися в некотором конкретном контексте. Одно и то же значение, или, вернее, кодировки одного и того же значения могут одновременно появляться в нескольких разных контекстах, и сами эти кодировки не обязательно все одинаковы. Например, целое значение "3" является единственным во множестве целых чисел, но произвольное число переменных может содержать некоторую кодировку этого целого числа как свое текущее значение. Некоторые из этих переменных могут содержать десятичную кодировку этого целого числа, а другие, например, двоичную. Следовательно, имеется логическое различие между кодировкой значения и появлением этой кодировки в некотором контексте, а также между кодировками, появляющимися в разных контекстах.
Умышленно опущенные темы
Имеется много практически необходимых аспектов систем управления данными, которые не имеют отношения к логической основе таких систем. К этим аспектам, в частности, относится следующее:
Книга не ориентирована на обсуждение подобных аспектов.
Сводка утверждений и очень строгих суждений
Положительные RM-утверждения
Отрицательные RM-утверждения
Положительные OO-утверждения
Отрицательные OO-утверждения
Очень строгие RM-суждения
Очень строгие OO-суждения
Объекты и отношения
Введение
Чтобы иметь возможность достаточно детально обсудить вопрос интеграции объектов и отношений, необходимо понять, какая концепция в реляционном мире является двойником концепции класса объектов в объектном мире. Этот вопрос имеет определяющее значение, поскольку именно класс объектов является фундаментальной концепцией объектного мира, и все остальные объектные понятия в большей или меньшей степени зависят от этой концепции.
Можно предложить два возможных ответа на поставленный вопрос:
В главе показывается, что первый ответ - правильный, а второй - нет.
Что за проблему мы пытаемся решить?
Исходным положением является то, что для будущих баз данных потребуются гораздо более сложные виды данных, чем те, которые поддерживаются в современных коммерческих базах данных. Возникает потребность хранить графические данные, аудио- и видеоданные и т.д. Каким образом можно поддерживать новые виды данных, оставаясь в классической реляционной среде? Д&Д принимают как аксиому то, что мы хотим остаться в классической реляционной среде; было бы неразумно забыть о результатах многолетних исследований и разработок в этой области.
Отношения и relvars
Прежде всего необходимо устранить недоразумение, существующее с начала реляционной эры. Рассмотрим отношение MMQ, показанное на рис. 1:
| MMQ | MAJOR_P# : P# | MINOR_P# : P# | QTY : QTY |
| P1 | P2 | 5 | |
| P1 | P3 | 3 | |
| P2 | P3 | 2 | |
| P2 | P4 | 7 | |
| P3 | P5 | 4 | |
| P4 | P6 | 8 |
Как видно, каждое отношение состоит из двух частей - заголовка и тела, где заголовок - это множество пар имя-столбца:имя-домена, а тело - множество строк, соответствующих этому заголовку. Для отношения MMQ:
Замечание Д&Д: Из соображений точности изложения в книге используется термин "отношение", а не термин "таблица", и термины "атрибут" и "кортеж", а не "столбец" и "строка". Исключения из этого правила допускаются только в тех случаях, где точность необязательна.
Как видно из дальнейшего изложения эти исключения встречаются чрезвычайно часто.
Вот важный способ понимания природы отношений (хотя, возможно, необычный). Для заданного отношения R заголовок R задает предикат (истинностную функцию), а каждая строка тела R - это истинное высказывание, получаемое из предиката путем подстановки некоторых значений доменов вместо параметров этого предиката. Например, для отношения MMQ предикат мог бы выглядеть следующим образом:
part MAJOR_P# contains QTY of part MINOR_P#
(деталь MAJOR_P# содержит QTY деталей MINOR_P#)
Соответствующими истинными высказываниями являются следующие:
part P1 contains 5 of part P2
(деталь P1 содержит 5 деталей P2);
part P1 contains 3 of part P3
(деталь P1 содержит 3 детали P3) и т.д.
Коротко говоря,
Поэтому
Хорошей, хотя и не вполне строгой аналогией является то, что домены для отношений - то же самое, что существительные для предложений.
Вернемся теперь к исторически существующей путанице между значениями отношений и переменными отношений. Если мы говорим на некотором языке программирования
DECLARE N INTEGER … ;
то N - это не целое число, это целая переменная, значениями которой являются целые числа. Точно так же, когда мы говорим на языке SQL
CREATE TABLE R … ;
то R - это не отношение, а переменная отношения, значениями которой являются отношения. Когда мы обновляем R (например, вставляем строку), то на самом деле заменяем старое значение-отношение R на новое, другое значение-отношение.
Трудность в том, что когда люди говорят об отношениях, они очень часто имеют в виду переменные отношений. Однако здесь имеется логическое различие, т.е. большое различие. Например, значение данного отношения (множество строк) не меняется во времени, в то время, как значение переменной данного отношения, конечно, меняется. Подобно отношению и в отличие от переменной отношения значение данного домена (множество скаляров) также не меняется во времени, и поэтому некоторые люди полагают, что домены и отношения имеют одну и ту же природу. И, наконец, введенные в заблуждение смешением понятий отношений и переменных отношений, некоторые люди еще больше заблуждаются, считая, что у переменных доменов и переменных отношений одна и та же природа.
Стремясь внести в эти вопросы максимальную ясность, Д&Д используют в своей книге термин relvar как сокращенную форму от relation variable (переменная отношения).
Домены и объектные классы
Многие люди слабо разбираются в том, что такое домен. Обычно они считают, что домен - это всего лишь пул значений, из которого берутся реальные значения столбцов отношений. Этого недостаточно. Домен - это то же самое, что тип данных, возможно, определенный в систем тип (такой как INTEGER или CHAR), но в более общем случае простой определенный пользователем тип (такой как P# или QTY на рис. 1). Поэтому далее Д&Д используют термины "тип" и "домен" попеременно.
Важно понимать, что понятие типа данных включает связанное понятие операций, которые допускается применять к значениям этого типа (со значениями типа можно работать только посредством применения операций, определенных для этого типа).
Если система поддерживает домены должным образом, то ее пользователи должны иметь возможность определять собственные домены. И для домена P#, вероятно, были бы определены операции "=", "<" и т.д., но не операции "+", "*" и т.д., поскольку арифметические операции над номерами деталей, скорее всего, бессмысленны.
Тщательно различаются тип (или домен) и представление или кодировка значений этого типа внутри системы. Конечно, операции, определяемые для данного типа, зависят от смысла или семантики этого типа, а не от способа представления значений типа в системе. Представления (кодировки) значений типа должны скрываться от пользователя.
То, что говорилось выше, называется в языках программирования строгой типизацией. Для Д&Д это означает, что (a) у каждого значения имеется тип и (b) при попытке выполнения любой операции система проверяет, что операнды имеют типы, правильные для этой операции.
До сих пор ничего не говорилось о природе значений, принадлежащих домену. Эти значения могут быть всем, чем угодно (простыми или как угодно сложными). Единственное требование: значениями домена можно манипулировать только посредством определенных для него операций.
Следующее утверждение настолько важно, что Д&Д повторяют его в другой формулировке:
Вопрос о том, какие поддерживаются типы данных ортогонален вопросу поддержки реляционной модели.
Итак, в реляционном мире домен - это тип данных, определяемый системой или пользователем, обладающий произвольной внутренней сложностью, и значениями этого типа можно манипулировать только с помощью определенных для него операций. Объектный класс обладает точно такими же характеристиками. Другими словами, домены и объектные классы - это одно и то же. Поэтому Д&Д уверены, что при должной поддержке доменов реляционные системы смогут управлять всеми видами данных, которыми могут управлять объектные системы, но реляционные системы смогут управлять и такими видами данных, которыми не могут управлять объектные системы (временные ряды, биологические и финансовые данные и т.д.). Истинная "объектно/реляционная" система - это ни что иное, как истинная реляционная система.
Хочу заметить, что здесь c Д&Д можно поспорить. Конечно, при отсутствии общепринятой объектной модели можно считать, что класс - это то же самое, что тип данных.
Но достаточно часто либо (a) понятие класса нагружается еще и смыслом "контейнера", хранящего все существующие экземпляры (объекты) класса, либо (b) одновременно поддерживаются понятия и типа данных, и класса объекта в разных смыслах. И это только небольшая часть возражений, которые я мог бы предъявить Д&Д от имени "объектного мира".
Relvars и объектные классы
В предыдущем разделе был поставлен знак равенства между объектными классами и доменами. Однако многие считают, что объектным классам соответствуют relvars. Д&Д считают это серьезной логической ошибкой. Из чего она проистекает?
Рассмотрим следующее определение класса на гипотетическом объектном языке:
CREATE OBJECT CLASS EMP ( EMP# CHAR (5) , ENAME CHAR (20) , SAL NUMERIC , HOBBY CHAR (20) , WORKS_FOR CHAR (20) ) … ;
Здесь EMP#, ENAME и т.д. - это переменные экземпляра (называемые также членами или атрибутами), значения которых в каждом "экземпляре" класса EMP в любой момент времени составляют общее значение этого экземпляра в данный момент времени. В "чистой" объектной системе эти переменные экземпляра являются частными (т.е. скрытыми от пользователя), но в следующем ниже обсуждении предполагается, что они "публичные".
Вообще говоря, это не является принципиальным. Во многих объектных системах объявление публичной переменной экземпляра трактуется как неявное определение двух неявных методов соответствующего класса "get" и "set" для каждой такой переменной. Если говорить не слишком строго, то при использовании надлежащего подхода наличие публичных переменных не противоречит принципам инкапсуляции.
Теперь рассмотрим простое реляционное определение relvar на языке SQL:
CREATE TABLE EMP ( EMP# CHAR (5) , ENAME CHAR (20) , SAL NUMERIC , HOBBY CHAR (20) , WORKS_FOR CHAR (20) ) ;
Эти два определения выглядят очень похоже, наводя на мысль, что определяется одно и то же. Однако второе определение допускает ряд возможных расширений (приводимые расширения основаны на конкретном коммерческом продукте, название которого Д&Д не оглашают, но судя по общему направлению дискуссии, это Informix Universal Server).
Первое расширение состоит в допущении составных столбцов, значениями которых являются строки, т.е. значениями столбцов могут быть строки другой (или той же самой) relvar. Например, исходное определение EMP можно заменить на следующее:
CREATE TABLE EMP ( EMP# CHAR (5) , ENAME CHAR (20) , SAL NUMERIC , HOBBY CHAR (20) , WORKS_FOR CHAR (20) ) ;
CREATE TABLE ACTIVITY ( NAME CHAR (20) , TEAM INTEGER ) ;
CREATE TABLE COMPANY ( NAME CHAR (20) , LOCATION CITYSTATE ) ;
CREATE TABLE CITYSTATE ( CITY CHAR (20 ) , STATE CHAR (2) ) ;
Сразу заметим, что это противоречит жесткому требованию Д&Д того, что relvar не является доменом.
Первое расширение является грубой аналогией той концепции, которая позволяет объектам содержать другие объекты, иногда называемой концепцией иерархии объектов. Хотя Д&Д характеризуют первое расширение как "столбцы, содержащие строки", по их мнению, более точно было бы говорить про "столбцы, содержащие указатели на строки" (более подробно см. ниже).
Аналогичные замечания относятся к второму возможному расширению, в котором допускаются столбцы со значениями-отношениями, т.е. столбцы, значениями которых являются множества строк из некоторой другой (или той же самой) relvar. Например, если у каждого служащего может быть несколько хобби, то определение EMP могло бы выглядеть следующим образом:
CREATE TABLE EMP ( EMP# CHAR (5) , ENAME CHAR (20) , SAL NUMERIC , HOBBY SET OF ( ACTIVITY) , WORKS_FOR COMPANY ) ;
Третье расширение допускает наличие методов, ассоциированных с relvars (термин "метод" является обычной для объектного мира заменой термина "операция"). Например,
CREATE TABLE EMP ( EMP# CHAR (5) , ENAME CHAR (20) , SAL NUMERIC , HOBBY SET OF ( ACTIVITY) , WORKS_FOR COMPANY ) METHOD RETIREMENT_BENEFITS ( ) : NUMERIC ;
Программный код, релизующий метод, можно было бы написать, например, на языке Си.
Наконец, еще одно расширение допускает определение подклассов. Например, допускаются следующие определения:
CREATE TABLE PERSON ( SS# CHAR (9) , BIRTHDATE DATE , ADDRESS CHAR (50) ) ;
CREATE TABLE EMP AS SUBCLASS OF PERSON ( EMP# CHAR (5) , ENAME CHAR (20) , SAL NUMERIC , HOBBY SET OF ( ACTIVITY) , WORKS_FOR COMPANY ) METHOD RETIREMENT_BENEFITS ( ) : NUMERIC ;
Теперь EMP обладает тремя дополнительными столбцами, унаследованными от PERSON. Если бы у PERSON были методы, они были бы также унаследованы. Таблицы PERSON и EMP представляют пример того, что называется супертаблицой и подтаблицей соответственно.
Конечно, при наличии таких расширительных определений потребовались бы и манипуляционные расширения, например:
Сколько места потребовалось для краткого обзора того, как идея "relvar = класс" воплощается на практике! И что же здесь неправильно?
Прежде всего это неправильно, поскольку relvar - это переменная, а класс - это тип. Равно как значение отношения не есть домен, так и relvar - не есть домен. Уже из этого видно, что идея проваливается. Но можно привести еще несколько соображений:
NUMERIC - это истинные тип данных (истинный, хотя и примитивный, домен); он накладывает независимые от времени ограничения на значения столбца SAL. COMPANY - это не истинный тип данных; ограничения, накладываемые им на значения столбца WORKS_FOR зависят от текущего значения relvar COMPANY. Здесь снова проявляется разница между relvar и доменом.
Вот еще ряд вопросов по тому же поводу:
Все это следует из того, что мы вышли за пределы реляционной модели, в которой фундаментальным объектом является отношение, содержащее значения. В нашем случае "отношение" содержит значения и указатели. Другими словами, мы подорвали концептуальную целостность реляционной модели.
На самом деле, ясно, что когда люди отождествляют relvars и классы, они имеют в виду базовые relvars и забывают про порождаемые. На проводить различие между базовыми и порождаемыми relvars - это серьезнейшая ошибка.
Заметим, что это не очень сильное замечание, поскольку, теоретически никто не мешает разрешить определять методы при определении представления. Другое дело, что SQL-92 позволяет использовать запросы в разделе FROM запроса, и тогда действительно приходится иметь дело с чисто порождаемыми relvars, для которых негде определять методы (не делать же это прямо в тексте запроса).
Можно подвести следующий итог этого раздела. Очевидно, что можно построить систему на основе ложной идеи "relvar = класс" и, более того, такие системы уже существуют. Но также очевидно, что эти системы напоминают автомобиль без масла или дом, построенный на песке: они могут быть даже полезны на некоторое время, но в конце концов обречены на неудачу.
Замечание по поводу наследования
В разделе "Домены и объектные классы" не упоминается возможность наследования не потому, что Д&Д не хотели этого, а вследствие отсутствия четко определенной и общепринятой модели наследования ко времени написания книги. Поэтому предполагается условная поддержка наследования в том смысле, что "если наследование поддерживается, то оно должно соответствовать некоторой правильно определенной и общепризнанной модели".
Заключительные замечания
По мнению Д&Д в объектной технологии имеется одна безусловно хорошая идея - определяемые пользователями типы (включая определяемые пользователями операции). Одна идея является вероятно хорошей - наследование типов. Ключевой идеей Д&Д является то, что эти две идеи полностью ортогональны реляционной модели. Чтобы достичь объектной функциональности, с реляционной моделью не требуется делать абсолютно ничего. Что требуется от поставщиков, это чисто реляционные СУБД (это не означает "SQL-ориентированные системы) с должной поддержкой доменов, и тогда мы получим желаемые "объектно/реляционные" системы.
Я тоже хочу сделать некоторые замечания. Мне кажется, что материал первых двух глав книги очень силен в негативном смысле. Почти со всеми отрицательными утверждениями Д&Д трудно спорить. Что же касается положительных утверждений, например, в пользу отождествления доменов и классов, то они опираются на ограниченное и нечетко выраженное понимание объектов. Фактически сначала утверждается, что класс - это то же, что и тип данных (слишком сильное для объектного мира предположение), а потом, естественно, оказывается, что домен = класс. Довольно тавтологично, не правда ли? Нет никаких объектов, есть только типизированные значения и переменные, а раз так, то нет и объектно-ориентированного подхода.
Литература
Заключительные замечания
Заключительные замечанияДолжно быть ясно, что алгебра A реляционно полна. В предыдущих алгебрах для этого требовалось шесть операций (обычно RENAME, restrict, project, TIMES, UNION и MINUS); Д&Д удалось сократить их число до пяти. Благодаря тому, что операции трактуются как отношения, удалось обойтись без операций EXTEND и SUMMARIZE.
Замечания:
Конечно, Д&Д не считают, что все эти операции можно действительно удалить из конкретного синтаксиса языка D, поскольку они являются полезными и удобными сокращенными формами. Но их следует явно определить как сокращенные формы.
Инновации: Менеджмент - Моделирование - Софт
- Инновационный менеджмент
- Разработка программного обеспечения
- Россия и инновации
- Управление инновационным менеджментом
- Моделирование
- Финансовое моделирование
- Системы моделирования
- Виды моделирования
- Практическое моделирование
- Пакет Mechanical Desktop
- Моделирование программ
- Софт для моделирования
- Пакет Simulink
- Моделирование в IBM
- MSC Nastran Моделирование -
- AutoCAD
- Unigraphics
- P-CAD