2010-11-29 2 views
1

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

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

  • товар должен быть один CommodityCategory
  • 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 | 
*------------------*-------------------*-----------* 

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

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

+0

Книга, на которую ссылается ответ на этот вопрос, представляется направленной на то, что вы отвечаете на вопрос, который у вас есть глубоко: http://stackoverflow.com/questions/960603/dynamic-types-within-a-relational-model-using- object-role-modeling-orm/960720 # 960720 – orangepips 2010-11-29 04:07:53

ответ

1

Написано в CQL see the ActiveFacts home page, вам нужно подмножество ограничений, как это:

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

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

В НОРМА, вам нужно подмножество ограничение, которое имеет две роль пары:

пар подмножества две роль «ссылка EntityDescriptor товара». Пара надмножеством роль EntityDescriptor в «EntityDescriptor для CommodityCategory, и роль товарной продукции в„Товар имеет CommodityCategory“.

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

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

1

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

таблица идет так: 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) и CM (r2), что r2 является подмножеством r1. поэтому я думаю, что товар не имеет прямой зависимости от ED, а ограничения, применяемые через CC.

0

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

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

Смежные вопросы