Третий манифест Кристофера Дейта и Хью Дарвена

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


Третий манифест

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

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

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

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

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

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

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

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

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

    3. Скалярные операции только чтения возвращают результат, операции обновления - нет.



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

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

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


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


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

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

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


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


    автоматически должен быть определен набор операций только чтения и обновления такой, что:


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

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


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

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


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

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

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


    Генерируемый тип 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" для кортежей.

  • Должен поддерживаться генератор типов RELATION, т.е. при наличии некоторого заголовка отношения H (см.


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


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

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

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


    Генерируемый тип 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" для отношений..

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

  • Значение кортежа t (или для краткости кортеж) - это множество упорядоченных триплетов <A, T, v>, где:




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

    2. T - имя типа атрибута кортежа t.

    3. v - значение типа T, называемое значением атрибута A кортежа t.


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

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


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

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


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

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

  • Переменная кортежа типа TUPLE {H} - это переменная, допустимыми значениями которой являются кортежи, соответствующие указанному заголовку кортежа H.


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

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

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

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

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



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

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

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

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

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


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

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

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




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

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


    1. Операции сравнения скаляров должны включать "=" и, возможно, "<", ">" и т.д. (в зависимости от данного скалярного типа);

    2. Операции сравнения кортежей должны включать "=" и "" (и только);

    3. Операции сравнения отношений должны включать "=", "", "является подмножеством" и т.д.;

    4. Должна поддерживаться операция "" для проверки вхождения кортежа в отношение.


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

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

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

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

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

    |



    Содержание раздела