Размер шрифта:
Третий манифест Дейта и Дарвена: немного формализма
Play

Третий манифест Дейта и Дарвена: немного формализма

Мы продолжаем знакомить читателей с книгой Криса Дейта и Хью Дарвена «Foundation for Object/Relational Databases: The Third Manifesto» (начальные главы книги обсуждались в предыдущем выпуске журнала - прим. ред.). В этот раз мы рассмотрим третью и четвертую главы книги ? «Третий манифест» и «Новая реляционная алгебра». Третья глава читается не очень легко; она написана в очень формальном стиле и не содержит пояснений. Но без этого материала трудно понять следующие, неформальные и дискуссионные главы. Мне самому очень нравится четвертая глава, где вводится новая, минимизированная версия реляционной алгебры. По-моему, создание этой алгебры относится к главным достижениям авторов книги.

Мы продолжаем знакомить читателей с книгой Криса Дейта и Хью Дарвена «Foundation for Object/Relational Databases: The Third Manifesto» (начальные главы книги обсуждались в предыдущем выпуске журнала – прим. ред.). В этот раз мы рассмотрим третью и четвертую главы книги – «Третий манифест» и «Новая реляционная алгебра». Третья глава читается не очень легко; она написана в очень формальном стиле и не содержит пояснений. Но без этого материала трудно понять следующие, неформальные и дискуссионные главы. Мне самому очень нравится четвертая глава, где вводится новая, минимизированная версия реляционной алгебры. По-моему, создание этой алгебры относится к главным достижениям авторов книги. Положительные RM-утверждения

1. Cкалярный тип данных (домен) – это именованное множество скалярных значений. Скалярные типы T1 и T2 одинаковы в том и только в том случае, когда являются одним и тем же типом. Пользователи языка D должны иметь возможность определения собственных скалярных типов; другие скалярные типы должны обеспечиваться системой. Должна иметься возможность отмены определения пользовательских скалярных типов. Значениями скалярных типов и соответствующими переменными можно оперировать только с помощью операций, определенных для этого типа. Для каждого скалярного типа и каждого обюявленного возможного представления его значений в состав этих операций должны входить:

a) операция selector, служащая для выборки произвольного значения этого скалярного типа (см. RM-утверждение 4);

b) набор операций для раскрытия возможного представления (см. RM-утверждение 5).

В состав системных скалярных типов должен входить тип truth value с двумя значениями (true и false); для этого типа должны поддерживаться все требуемые логические операции.

2. Все скалярные значения должны быть типизированы, т.е., по крайней мере, концептуально должны позволять идентифицировать тип, к которому относятся.

3. Пользователи языка D должны иметь возможность определения собственных скалярных операций; другие скалярные операции должны обеспечиваться системой. Должна быть предусмотрена возможность отмены определения пользовательских скалярных операций (с оговорками, содержащимися в RM-утверждении 5):

a) определение скалярной операции должно включать спецификацию типа каждого параметра (обюявленный тип параметра). Если операция Op имеет параметр P обюявленного типа T, то аргумент A, соответствующий P, в каждом вызове Op должен иметь тот же тип T;

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

c) скалярные операции только чтения возвращают результат, операции обновления – нет;

d) в определении скалярной операции только чтения должна содержаться спецификация типа результата (обюявленного типа);

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

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

4. Если T – это скалярный тип, а v – появление (в некотором контексте) значения этого типа, то по определению у v имеется в точности одно реальное представление и одно или более возможных представлений. Реальное представление, связанное с типом T, должно определяться средствами некоторого языка определения структуры хранения и не должно быть видимо в языке D (см. RM-утверждение 6). То же касается возможных представлений. Для каждого обюявленного возможного представления PR типа T должна автоматически определяться операция selector S со следующими свойствами:

a) если представить, что компоненты PR (см. RM-утверждение 5) и параметры S представлены в виде упорядоченных списков, то эти два списка должны содержать одно и то же число элементов n, и обюявленные типы i-тых элементов списков (i = 1, 2, . n) должны быть одинаковы;

b) каждое значение типа T должно производиться путем некоторого вызова S;

c) каждый (успешный) вызов S должен производить некоторое значение типа T.

5. Если некоторое обюявленное возможное представление PR для скалярного типа T определено в терминах компонентов C1, C2, . Cn (у каждого компонента имеются имя и обюявленный тип), v – значение типа T, а PR(v) – его возможное представление, то PV(v) должно демонстрироваться (иначе говоря, должен быть автоматически определен набор операций только чтения и обновления, такой что:

a) для всех значений v и для всех i (i = 1, 2, . n) можно «выбрать» (прочитать значение) компонента Ci PR(v);

b) для любой переменной V типа T и для всех i (i = 1, 2, . n) можно обновить V таким образом, что если значениями V до и после обновления являются v и v’ соответственно, то возможные представления PR(v) и PR(v’) отличаются самое большее в их компонентах Ci.

Такой набор операций должен обеспечиваться для каждого возможного представления, обюявленного в определении T.

6. Должен поддерживаться генератор типов TUPLE, т.е. при наличии некоторого заголовка кортежа H (см. RM-утверждение 9) должно быть возможно использовать генерируемый тип TUPLE как основу определения (или, в случае значений, выбора):

a) значений и переменных этого генерируемого типа (см. RM-утверждения 9 и 12);

b) значений атрибутов кортежей и атрибутов заголовка кортежей этого генерируемого типа (RM-утверждение 9);

c) компонентов обюявленных возможных представлений этого генерируемого типа (RM-утверждение 5).

Генерируемый тип TUPLE называется типом кортежей; имя этого типа – TUPLE . К этому типу, его значениям и переменным применима терминология степени, атрибутов и заголовков (RM-утверждение 12), вводимая в RM-утверждении 9. Типы кортежей TUPLE

и TUPLE

совпадают в том и только в том случае, когда H1 = H2. Применимые операции должны включать аналоги операций реляционной алгебры

RENAME, project, EXTEND и JOIN (RM-утверждение 18), а также операции присваивания кортежей (RM-утверждение 21) и сравнения кортежей (RM-утверждение 22); кроме того, должна иметься (a) операция выбора кортежей (RM-утверждение 9), (b) операция извлечения из указанного кортежа значения указанного атрибута (этот кортеж должен иметь степень один – см. RM-утверждение 9) и (c) операции «nesting» и «unnesting» для кортежей.

7. Должен поддерживаться генератор типов RELATION, т.е. при наличии некоторого заголовка отношения H (см. RM-утверждение 10) должна иметься возможность использования генерируемого типа RELATION для определения (или, в случае значений, для выбора):

a) значений и переменных этого генерируемого типа (RM-утверждения 10 и 13);

b) значений атрибутов кортежей и атрибутов заголовка кортежей этого генерируемого типа (RM-утверждение 9);

c) компонентов обюявленных возможных представлений этого генерируемого типа (RM-утверждение 5).

Генерируемый тип RELATION называется типом отношения, и имя этого типа – TUPLE . К этому типу, его значениям и переменным применима терминология степени, атрибутов и заголовков (RM-утверждение 13), вводимая в RM-утверждении 10. Типы отношения RELATION

и RELATION

совпадают в том и только в том случае, когда H1 = H2. Применимые операции должны включать операции реляционной алгебры (RM-утверждение 18), а также операции реляционного присваивания (RM-утверждение 21) и реляционного сравнения (RM-утверждение 22); кроме того, должна иметься (a) операция выбора отношения (RM-утверждение 10), (b) операция извлечения из указанного отношения указанного кортежа (это отношение должно иметь мощность один – см. RM-утверждение 10) и (c) операции «nesting» и «unnesting» для отношений.

8. Для каждого типа должна быть определена операция сравнения по равенству. Если выражения X1 и X2 вырабатывают значения одного и того же типа T v1 и v2 соответственно, то операция X1 = X2 вырабатывает значение true в том и только в том случае, если v1 и v2 в действительности являются одним элементом T. Если Op – это операция с параметром P типа T, то для всех таких операций при условии, что X1 = X2, то эффект двух успешных вызовов Op, в одном из которых аргументом, соответствующим P, является X1, а в другом – X2, должен быть одним и тем же. Наоборот, если эффект двух таких вызовов Op различается, то значением сравнения X1 = X2 должно быть false.

9. Значение кортежа t (или для краткости кортеж) – это множество упорядоченных триплетов , где:

a) A – имя атрибута кортежа t. Никакие два различных триплета t не должны содержать одно и то же имя атрибута;

b) T – имя типа атрибута кортежа t.

c.v – значение типа T, называемое значением атрибута A кортежа t. Мощность множества триплетов в t, или число атрибутов t называется степенью t. Множество упорядоченных пар , получающихся путем удаления компонента v из каждого триплета, является заголовком t. Кортеж t называется соответствующим этому заголовку (принадлежит к соответствующему типу кортежа – см. RM-утверждение 6). Степень заголовка – это степень кортежа, а атрибуты и соответствующие типы заголовка – это атрибуты и соответствующие типы кортежа t. При заданном заголовке H должна быть доступна операция selector для выбора произвольного кортежа, соответствующего H.

10. Значение отношения r (для краткости – отношение) состоит из заголовка и тела, где:

a) заголовком r является заголовок кортежа H (RM-утверждение 9). Отношение r называется соответствующим этому заголовку (принадлежит к соответствующему типу отношения – RM-утверждение 7), а степенью r является степень этого заголовка. Атрибуты и соответствующие типы r – это атрибуты и соответствующие типы H;

b) тело r – это множество B кортежей, каждый из которых имеет заголовок H; мощность тела называется мощностью r.

При заданном заголовке отношения H должна быть доступна операция selector для выбора произвольного отношения, соответствующего H.

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

12. Переменная кортежа типа TUPLE – это переменная, допустимыми значениями которой являются кортежи, соответствующие указанному заголовку кортежа H. Обюявленный тип этой переменной кортежа есть TUPLE . Атрибутами переменной кортежа являются атрибуты H, соответствующие типы – обюявленные типы этих атрибутов, степень переменной кортежа – степень H. В языке D должны иметься доступные для пользователей средства определения переменных кортежей. При определении переменной кортежа должна производиться инициализация переменной некоторым значением – явно указанным в операции определения переменной или не указываемым явно, определенным в реализации.

13. Переменная отношения (для краткости – relvar) типа RELATION – это переменная, допустимыми значениями которой являются отношения, соответствующие указанному заголовку отношения H. Обюявленный тип relvar есть RELATION . Атрибутами relvar являются атрибуты H, соответствующие типы – обюявленные типы этих атрибутов, степень relvar – степень H. В языке D должны иметься доступные для пользователей средства определения и уничтожения переменных relvar базы данных (для тех relvar, которые принадлежат базе данных, а не приложению – см. RM-утверждение 16). Должны также поддерживаться возможности определять relvar на уровне приложений.

14. Переменные relvar базы данных могут быть реальными или виртуальными. Виртуальная relvar – это relvar базы данных, значением которой в любой момент времени является результат вычисления некоторого реляционного выражения, указываемого при определении relvar. Реальная relvar – это НЕ виртуальная relvar базы данных. При определении реальной relvar должна производиться ее инициализация пустым отношением (отношением мощности нуль).

15. По определению у каждой relvar имеется по меньшей мере один возможный ключ. По меньшей мере один такой ключ должен быть определен при определении relvar, и не должно быть возможно ликвидировать все возможные ключи данной relvar (кроме как ликвидировав саму relvar).

16. База данных – это именованный контейнер переменных relvar; содержимой базы данных в любой момент времени – это набор переменных relvar базы данных. Требуемые операции для определения и ликвидации баз данных не должны являться частью языка D.

17. Каждая транзакция должна взаимодействовать в точности с одной базой данных. Однако разные транзакции должны иметь возможность взаимодействия с разными базами данных, и разные базы данных не обязательно должны быть разюединенными. Кроме того, транзакции должны иметь возможность определять новые и уничтожать существующие relvar внутри соответствующей базы данных (см. RM-утверждение 13).

18. В языке D должны поддерживаться обычные операции реляционной алгебры (или их некоторые логические эквиваленты). Конкретно, должны прямо или косвенно поддерживаться по меньшей мере операции RENAME, restrict (WHERE), project, EXTEND, JOIN, UNION, INTERSECT, MINUS, (обобщенная) DIVIDEBY PER и (обобщенная) SUMMIRIZE PER. Все такие операции должны выражаться без чрезмерного многословия. В языке D должен также поддерживаться механизм наследования типов отношения, благодаря чему заголовок результата вычисления реляционного выражения должен быть правильно определенным и известным как системе, так и пользователю (см. RM-утверждение 7).

19. Имена relvar и вызовы селектора отношений должны быть допустимыми реляционными выражениями. В реляционных выражениях должна допускаться рекурсия.

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

21. В языке D должно допускаться:

a) присваивание (значения) скалярного выражения скалярной переменной;

b) присваивание (значения) кортежного выражения переменной кортежа;

c) присваивание (значения) выражения над отношениями relvar.

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

22. В языке D должны поддерживаться некоторые операции сравнения, а именно:

a) операции сравнения скаляров должны включать «=» и, возможно, « » и т.д. (в зависимости от данного скалярного типа);

b) операции сравнения кортежей должны включать «=» и «­» (и только);

c) операции сравнения отношений должны включать «=», «­», «является подмножеством» и т.д.;

d) должна поддерживаться операция «[» для проверки вхождения кортежа в отношение.

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

23. Выражение, при вычислении которого вырабатывается истинностное значение, называется логическим выражением (также называемым истинностным, условным или булевским выражением). Ограничением целостности является логическое выражение, которое: a) именовано; b) является замкнутой WFF (Well Formed Formula – правильно построенной формулой) или ее логическим эквивалентом реляционного исчисления; с) при вычислении дает значение true. В языке D должны обеспечиваться средства для определения и уничтожения ограничений целостности. Такие ограничения классифицируются на ограничения домена (т.е. типа), атрибута, relvar и базы данных, и в языке D должен поддерживаться механизм наследования ограничений (насколько это возможно).

24. Для каждой relvar имеется соответствующий предикат relvar, и для каждой базы данных имеется соответствующий предикат базы данных.

Предикаты relvar должны удовлетворяться в границах оператора. Предикаты базы данных должны удовлетворяться в границах транзакции.

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

26. Язык D должен конструироваться в соответствии с установившимися принципами правильной разработки языка.

Отрицательные RM-утверждения

1. Язык D не должен содержать конструкции, зависящие от определения какой бы то ни было упорядоченности атрибутов отношений. Для каждого отношения r, выражаемого средствами D, атрибуты r должны различаться своими именами.

2. Язык D не должен содержать конструкции, зависящие от определения какого бы то ни было порядка кортежей отношения.

3. Для каждого отношения r, если t1 и t2 являются разными кортежами этого отношения, должен существовать такой атрибут A отношения, что сравнение «A FROM t1 = A FROM t2» принимает значение false (выражения A FROM t1 и A FROM t2 означают значения атрибута A в кортежах t1 и t2 соответственно).

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

Это один из первых намеков Дейта и Дарвена на то, что не должны поддерживаться неопределенные значения (NULL). С моей точки зрения, при всех отрицательных явлениях, порождаемых неопределенными значениями, пока Дейту и Дарвену не удалось предложить альтернативный работающий подход.

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

6. Язык D не должен содержать конструкции, которые связаны с «физическими» уровнями системы (уровнями хранения, внутренними уровнями) или образованы под логическим влиянием этих уровней.

7. Не должно быть покортежных операций на relvar или отношениями.

8. В языке D не должны поддерживаться «составные домены» или «составные атрибуты», поскольку подобной функциональности можно достичь, если это желательно, на основе описанной выше поддержки типов.

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

10. Язык D не должен называться SQL.

Положительные OO-утверждения

Этот раздел явно подчеркивает трактовку Дейта и Дарвена аббревиатуры OO как «Other Orthogonal», а не как «Object-Oriented». По сути дела, ни одно из положительных OO-утверждений не имеет прямого отношения к обюектной ориентации.

1. В языке D должна допускаться проверка типов во время компиляции.

2. Если в языке D допускается определение некоторого типа T’ как подтипа некоторого супертипа T, то такая возможность должна соответствовать некоторой четко определенной и общепризнанной модели.

3. Если в языке D допускается определение типа T’ как подтипа некоторого другого типа T, то это не противоречит тому, чтобы T’ определялся как подтип и некоторого иного типа, который не является типом T или каким-либо супертипом T (если требования Утверждения 2 не запрещают такую возможность).

4. Язык D должен быть вычислительно полным. В языке D может иметься (но не должна требоваться) поддержка вызова из так называемых «основных программ», написанных на языках, отличных от D. Аналогично, в языке D может иметься (но не должна требоваться) поддержка использования других языков программирования для реализации определяемых пользователями операций.

5. Инициация транзакций должны производиться только средствами явного выполнения операции «begin transaction». Завершение транзакции должно производиться только средствами выполнения операций «commit» или «rollback»; фиксация всегда должна быть явной, а откат может быть неявным (если транзакция завершается неуспешно не по своей вине). Если транзакция TX завершается выполнением операции commit («нормальное завершение»), то изменения, произведенные TX в соответствующей базе данных, должны быть зафиксированы. Если транзакция TX завершается выполнением операции rollback («ненормальное завершение»), то изменения, произведенные транзакцией TX в соответствующей базе данных, должны быть аннулированы.

6. В языке D должны поддерживаться вложенные транзакции, т.е. должно допускаться образование транзакцией-предком TX транзакции-потомка TX’ до завершения транзакции TX. При этом:

a) TX и TX’ должны взаимодействовать с одной и той же базой данных (что в действительности требуется RM-требованием 17);

b) не требуется задержка выполнения TX на время выполнения TX’ (хотя это и допускается). Однако TX не должна завершаться до завершения TX’; другими словами, TX’ должна полностью содержаться в TX.

c) откат TX должен включать откат TX’, даже если TX’ завершилась фиксацией. Другими словами, «фиксация» всегда интерпретируется в контексте предка (если он существует) и может быть отменена транзакцией-предком.

7. Пусть AggOp – агрегатная операция, такая как SUM. Если аргумент AggOp является пустым, то:

a) если AggOp является сокращенной формой некоторой итеративной бинарной операции Op (в случае SUM это операция «+») и если для Op существует начальное значение (0 в случае SUM), то результатом вызова AggOp должно быть это начальное значение;

b) в противном случае результат вызова AggOp должен быть неопределенным.

Последнее OO-утверждение вновь явно направлено на избавление от неопределенных значений. Но для меня совершенно неочевидно, что при сложении пустого набора чисел должно получиться значение 0. Кроме того, во-вторых, во второй части этого утверждения появляется словосочетание «неопределенный результат», но что это значит, формально не поясняется.

Отрицательные OO-утверждения

1. Переменные Relvar – это не домены.

2. Никакое значение не должно обладать каким-либо идентификатором ID, отличным от самого этого значения.

Как видно, это очередной «наезд» на обюектно-ориентированный мир. Но утверждение не слишком корректное, поскольку в обюектном мире никто и никогда не утверждал, что у значений должны существовать идентификаторы. Говорится про «object identity», то есть про существование уникальной идентификации обюектов. Но Дейт и Дарвен, похоже, вообще не хотят соглашаться с наличием понятия обюекта.

Очень строгие RM-суждения

1. В языке D следует обеспечить механизм, в соответствии с которым значения некоторого определенного возможного ключа (или его компонентов) для некоторой указанной relvar поставляются системой. Следует также обеспечить механизм, в соответствии с которым произвольное отношение может быть расширено атрибутом, значения которого: a) уникальны внутри этого отношения (или внутри некоторых разделов этого отношения); b) поставляются системой.

2. В язык D следует включить некоторую декларативную сокращенную форму для выражения ссылочных ограничений (называемых также ограничениями внешнего ключа).

3. Если RX – реляционное выражение, то по определению RX можно считать обозначением relvar R – либо определенной пользователем (если RX состоит только из имени relvar), либо определяемой системой (в противном случае). Желательно, хотя и не всегда возможно, чтобы система была в состоянии выводить возможные ключи R таким образом, что:

a) если RX предназначено для определения выражения для некоторой виртуальной relvar R’, то эти выводимые возможные ключи можно проверить на соответствие возможным ключам, явно определяемым для R’. Если конфликт не обнаруживается, то выводимые ключи становятся возможными ключами R’;

b) сведения о выводимых ключах могут быть включены в информацию об R, доступную пользователям языка D.

В языке D следует поддерживать такие возможности, но без какой-либо гарантии того, что: a) эти выводимые ключи не составляют точного надмножества множества реальных возможных ключей; b) выводимый возможный ключ обнаружен для каждого реального возможного ключа.

4. В языке D следует поддерживать ограничения переходов, т.е. ограничения на допустимые изменения значений данных relvar или базы данных.

5. В языке D следует поддерживать некоторую сокращенную форму для выражения запросов с квотами. Для формулировки подобных запросов не должно требоваться преобразование соответствующего отношения, например, в массив.

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

7. В языке D следует допустить, чтобы параметры определяемых пользователями операций (включая операции над значениями-отношениями, см. RM-утверждение 20) могли быть кортежами, отношениями или скалярами.

8. Для работы с «отсутствующей информацией» в языке D следует обеспечить некоторый механизм специальных значений.

9. Следует обеспечить возможность реализации языка SQL средствами языка D – не потому, что такая реализация желательна сама по себе, а в связи с тем, что это обеспечит безболезненный переход к D для пользователей SQL. С той же целью следует обеспечить возможность преобразования существующих баз данных SQL в такую форму, с которой D-программы могли бы работать без ошибок.

У меня есть сильные сомнения относительно реальности последнего суждения. В прошлом предпринимались многочисленные попытки реализации SQL с использованием реляционной алгебры, и они приводили к необходимости очень сильных расширений алгебры. При той реляционной чистоте, которую Дейт и Дарвен требуют от языка D, его возможностей, скорее всего, не хватит для реализации огромного и разнородного языка SQL.

Очень строгие OO-суждения

1. В языке D следует поддерживать некоторую форму наследования типов (см. OO-утверждения 2 и 3). В соответствии с этим суждением в языке D не следует поддерживать неявные преобразования типов.

2. Следует поддерживать логическое различие между определениями операций и определениями типов их параметров и/или результатов, не связывая эти определения в один узел (хотя селекторы и операции, требуемые в RM-утверждении 5 можно рассматривать как исключения по отношению к этому суждению).

3. Следует поддерживать генераторы типов коллекций, такие как LIST, ARRAY и SET, распространенные в языках с развитыми системами типов.

4. Для любого генератора типа коллекции С, отличного от RELATION, следует обеспечить операцию преобразования (скажем, C2R) для преобразования значений типа C в отношения и обратную операцию (скажем, R2C) таким образом, что:

a) C2R(R2C(r)) = r для любого выразимого r;

b) R2C(C2R(c)) = c для любого выразимого значения c типа C.

5. Следует основывать язык D на одноуровневой модели хранения.

Новая реляционная алгебра

В четвертой главе книги предлагается новая реляционная алгебра, которую Дейт и Дарвен называют A – двойной рекурсивный акроним от ALGEBRA, что, в свою очередь, раскрывается в «A Logical Genesis

Explains Basic Relational Algebra». Основная цель, которая преследовалась при разработке алгебры A, состояла в том, чтобы более четко показать связь этой дисциплины с логикой первого порядка.

Алгебра A отличается от оригинальной алгебры Кодда четырьмя основными аспектами.

Операция декартова произведения (TIMES) заменена операцией естественного соединения, которую, подчеркивая наличие двойника этой операции в логике предикатов, Дейт и Дарвен называют просто >AND AND » и « AND OR NOT OR OR NOT AND NOT AND RENAME REMOTE COMPOSE TCLOSE AND AND OR OR NOT NOT AND n подмножеств, отношение степени n можно считать представлением 2 n различных операций, некоторые из которых функции, а некоторые – нет (в общем случае). Например, если рассматривать PLUS как операцию, отображающую Z в X и Y, то это отображение не функционально (не поддерживаются функциональные зависимости Z->X и Z->Y), и соответствующая операция не является функцией.

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

Рис. 3. Граф отношения MM в виде иерархии

Поскольку MM является бинарным отношением, к нему можно применить операцию транзитивного замыкания. Операция описывается следующим образом:

Рис. 4. Транзитивное замыкание MM

Пусть r – это бинарное отношение с атрибутами X и Y одного и того же типа T. Тогда транзитивное замыкание r (>TCLOSE

Содержание обозреваемых глав книги Глава 3. Третий манифест

Положительные RM-утверждения Отрицательные RM-утверждения Положительные OO-утверждения Отрицательные OO-утверждения Очень строгие RM-суждения Очень строгие OO-суждения

📎📎📎📎📎📎📎📎📎📎