ORM:为两个引用的实体指定值相等约束

时间:2010-11-29 01:25:55

标签: object-role-modeling

我正在尝试使用对象角色建模来建模概念,但我找不到必要的约束类型。我想知道它是否存在。

以下是三个事实:

  • 商品必须是一个CommodityCategory
  • EntityDescriptor必须属于CommodityCategory
  • EntityDescriptor可能适用于一个商品

这很容易建模:

alt text

但这是约束:

  • 如果EntityDescriptor用于商品,则Commodity引用的CommodityCategory必须等于EntityDescriptor引用的CommodityCategory

例如,假设我们有这些商品。

*--------------------*------------*
| 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    |
*------------------*-------------------*-----------*

我查看了 Equality 约束,但这是关系的存在,而不是关系中的实际值。

我可以用它来模拟这个约束吗?

3 个答案:

答案 0 :(得分:1)

我们不能在用于的角色之间添加子集约束,因此每个商品到类别都是实体描述符到类别的子集

表格如下:ED(EntityDescriptor),CC(CommodityCategory),CM(商品)

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应用约束。

答案 1 :(得分: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;

请注意,如果在每个方向都包含读数,则会更加流畅。

在NORMA中,您需要一个具有两个角色对的子集约束:

子集对是&#34; EntityDescriptor引用Commodity&#34;的两个角色。 超集对是EntityDescriptor在&#34; EntityDescriptor中的角色,用于CommodityCategory, 商品在商品类别中的作用&#34;。

请注意,每对的第一个角色由相同类型(EntityDescriptor)播放, 同样具有每对的第二个角色(商品)。它也可以使用兼容的子​​类型/超类型,但这些类型必须以这种方式兼容。

等式约束就像两个子集约束,一个在每个方向上运行。每当EntityDescriptor用于某些CommodityCategory并且Commodity属于CommodityCategory时,它总是要求至少存在一个引用,反之亦然

答案 2 :(得分:0)

如果要强制使用数据库,我建议在插入/更新触发器之前,以防止关联不匹配的EntityDescription和Commodity。

如果您正在考虑使用代码,我建议您研究Specification Pattern。假设有Commodity,EntityDescriptor和CommodityDescriptor类。 CommodityDescriptor将成为其他两个类的组成部分。商品将包括一个规范,比如MatchingCommidityDescriptionSpecification(是的,它是详细的)作为其组成的一部分。然后,当调用Commodity.setEntityDescription(EntityDescription entityDescriptor)时,它通过比较Commodity和EntityDescriptor的CommodityDescriptor值来验证规范。