ORM: Задание ограничения равенства значений для двух ссылочных объектов - PullRequest
1 голос
/ 29 ноября 2010

Я пытаюсь смоделировать концепцию, используя моделирование ролей объектов, и не могу найти необходимый тип ограничения.Мне интересно, если он существует.

Вот три факта:

  • Товар должен быть одной категории Commodity
  • EntityDescriptor должен иметь категорию CommodityCategory
  • EntityDescriptor может быть для одного товара

Это просто для модели:

alt text

Но вот ограничение:

  • Если EntityDescriptor предназначен для Товара, CommodityCategory, на который ссылается Товар, должен равняться CommodityCategory, на который ссылается EntityDescriptor

Например, предположим, что у нас были эти товары.

*--------------------*------------*
| CommodityCategory  | Commodity  |
*--------------------*------------*
| Fuel               | Gas        |
| Fuel               | Petrol     |
| Food               | Sugar      |
*--------------------*------------*

Это законно

*------------------*-------------------*-----------*
| EntityDescriptor | CommodityCategory | Commodity |
*------------------*-------------------*-----------*
| 1                | Fuel              |           |
| 2                | Fuel              | Gas       |
| 3                | Food              |           |
| 4                | Food              | Sugar     |
*------------------*-------------------*-----------*

Но это незаконно

*------------------*-------------------*-----------*
| EntityDescriptor | CommodityCategory | Commodity |
*------------------*-------------------*-----------*
| 5                | Food              | Petrol    |
*------------------*-------------------*-----------*

Я смотрел на ограничение Равенство , но это касается существования отношений, а нефактические значения в отношениях.

Есть ли что-то, что я могу использовать для моделирования этого ограничения?

Ответы [ 3 ]

1 голос
/ 20 марта 2014

Написано на CQL см. Домашнюю страницу ActiveFacts , вам нужно ограничение подмножества, например:

some EntityDescriptor references some Commodity
    only if that EntityDescriptor is for some CommodityCategory and that Commodity is of that CommodityCategory;

Обратите внимание, что это становится более плавным, если вы включаете чтение в каждом направлении.

В NORMA требуется ограничение подмножества, которое имеет две пары ролей:

Пара подмножеств - это две роли "EntityDescriptor links Commodity".Пара надмножества - это роль EntityDescriptor в «EntityDescriptor для CommodityCategory, а роль Commodity в« Commodity of CommodityCategory ».

Обратите внимание, что первую роль каждой пары играет тот же тип (EntityDescriptor»).), а также со второй ролью каждой пары (Commodity). Также можно использовать совместимые подтипы / супертипы, но типы должны быть совместимы таким образом.

Ограничение равенства похоже на два ограничения подмножества,один работает в каждом направлении. Всегда требуется, чтобы по крайней мере одна ссылка существовала всякий раз, когда EntityDescriptor предназначен для некоторой CommodityCategory, и этот Commodity относится к этой CommodityCategory, , а также наоборот .

1 голос
/ 29 ноября 2010

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

таблица выглядит следующим образом: ED (EntityDescriptor), CC (CommodityCategory), CM (Commodity)

ED CC   <--->  CC  CM  ED   <---> CM CC
1  1           1   1   1          1  1 
2  2           2   2   2          2  2
3  3                              5  5 // error, cause CC doesn't have 5,5 to ED
4  4           4   4   4          4  4 
5  4           4   5   4          5  4 // ok, cause CC have 4 to 5 on CC-ED
6  4                              6  3 // error, cause ED-CC doesn't have 6,3

, поэтому мы можем просто видеть, что CC имеет две роли, которые для ED ( r1 * 1011)*) и CM ( r2 ), что r2 является подмножеством r1 .поэтому я думаю, что товар не имеет прямой роли ограничения для ED, но ограничение применяется через CC.

0 голосов
/ 29 ноября 2010

Если вы хотите принудительно использовать базу данных, я бы порекомендовал перед триггерами вставки / обновления предотвратить связывание EntityDescription и Commodity, которые не совпадают.

Если вы думаете об использовании кода, я бы рекомендовал изучить шаблон спецификации .Предположим, классы Commodity, EntityDescriptor и CommodityDescriptor.CommodityDescriptor будет частью состава двух других классов.Товар будет включать в себя спецификацию, скажем, MatchingCommidityDescriptionSpecification (да, это многословно) как часть своей композиции.Затем, когда вызывается Commodity.setEntityDescription (EntityDescription entityDescriptor), он проверяет соответствие спецификации, сравнивая значения CommodityDescriptor Commodity и EntityDescriptor.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...