Книга, которую рекомендовал Джон Сандерс, является одной из лучших книг, которые я когда-либо читал. Кроме того, на все ваши вопросы ORM, скорее всего, можно ответить через чтение этого.
Чтобы напрямую ответить на ваш вопрос (и обойти любые вопросы о достоверности модели), есть два очевидных способа ограничить ее как есть.
Мы можем использовать либо ограничение подмножества, либо ограничение равенства, в зависимости от того, что именно вы хотите записать.
Назначая ограничение равенства (справа) между ролями, мы можем сгенерировать ограничение, которое концептуально потребовало бы, чтобы у любого Существа живого Типа была дата рождения и чтобы любое Существо с датой рождения было живого Типа.
Назначая ограничение Подмножество (слева) между ролями, мы можем ограничить модель так, что любое Вещество Типа с DateOfBirth должно иметь Живой Тип. Это, в отличие от ограничения равенства, позволит вещам быть живого типа, но не иметь даты рождения.
дополнения:
Чтобы создать эти типы ограничений на подмножество и равенство, которые будут работать, нам нужно использовать нечто, называемое 'Join Path' . Используя путь соединения, мы можем создать ограничение «Соединение-подмножество» и ограничение «Соединение-равенство», которое будет охватывать несколько ролей с обеих сторон ограничения. Примеры путей соединения иногда могут быть очевидными и легко понятными. но может также быть немного подавляющим и сложным время от времени. Также следует отметить, что хотя NORMA поддерживает создание путей соединения, в условиях равенства, подмножества и исключения исключение для них не завершено на 100%, как объяснено здесь . Это также одна из причин того, что в настоящее время проще использовать Подмножества, поскольку легче концептуально проверить правильность модели.
Чтобы создать Путь соединения в NORMA при назначении ролей для ограничения Подмножество, Равенство или Исключение, сначала назначьте все роли, являющиеся частью пути, одним щелчком, а затем дважды щелкните, чтобы перейти к следующему пути. Когда ограничение способно объединять пути, роли, участвующие в этом ограничении, будут помечены [#. #] Вместо просто [#]. Поэтому, когда мы создаем наши ограничения, мы можем сказать, что роли [1.1] и [1.2] являются подмножеством / равны ролям [2.1] / [2.1]. Обратите внимание, что факты, играющие роль в каждой роли, также должны совпадать. Таким образом, он мы получаем вербализацию от NORMA:
Если у некоторой вещи есть какой-то элемент DateOfBirth; некоторая вещь имеет некоторый тип, тогда эта вещь имеет некоторый тип; этот тип живет.
Что лучше сформулировать так: если у некоторой вещи некоторого типа есть какой-то объект DateOfBirth; тогда этот Тип живет.
Однако есть третий (и предпочтительный) способ, которым мы могли бы ограничить это, который был бы подтипом. Так как вещи, которые живы, и вещи, которые не живы, очень разные, мы, вероятно, не хотим отображать их в те же таблицы в любом случае. Здесь мы разделяем наш Тип факта на два подтипа, OrganicTypes и NonOrganicTypes. Ограничение «Исключительно или» между двумя подтипами говорит нам, что каждый тип является органическим или неорганическим. и в примечании говорится о правиле деривации, которое мы используем для определения, к какой группе принадлежит тип.
Оттуда мы переопределяем нашу роль [Вещи имеет тип] в [Живое существо имеет органический тип]. и поскольку OrganicThings путем дефиниции способны к жизни, наше ограничение для DOB / live теперь встроено в модель.