1

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

以下是三个事实:

  • 商品必须属于一个商品类别
  • EntityDescriptor 必须属于 CommodityCategory
  • EntityDescriptor 可能用于一种商品

这很容易建模:

替代文字

但这里有一个约束:

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

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

*--------*------------*
| 商品类别 | 商品 |
*--------*------------*
| 燃料 | 气体 |
| 燃料 | 汽油 |
| 食品 | 糖 |
*--------*------------*

这些是合法的

*--------------------*--------------------*---------- -*
| 实体描述符 | 商品类别 | 商品 |
*--------------------*--------------------*---------- -*
| 1 | 燃料 | |
| 2 | 燃料 | 气体 |
| 3 | 食品 | |
| 4 | 食品 | 糖 |
*--------------------*--------------------*---------- -*

但这是非法的

*--------------------*--------------------*---------- -*
| 实体描述符 | 商品类别 | 商品 |
*--------------------*--------------------*---------- -*
| 5 | 食品 | 汽油 |
*--------------------*--------------------*---------- -*

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

有什么东西可以用来模拟这个约束吗?

4

3 回答 3

1

我们不能在is ofis for的角色之间添加子集约束,所以每个商品到类别都是实体描述符到类别的子集

表格是这样的: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 ) 有两个角色,即r2r1的子集。所以我认为商品对 ED 没有直接的约束作用,而是通过 CC 应用的约束。

于 2010-11-29T03:18:39.753 回答
1

用 CQL 编写,请参阅 ActiveFacts 主页,您需要一个子集约束,如下所示:

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

请注意,如果您在每个方向都包含阅读内容,这会变得更加流畅。

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

子集对是“EntityDescriptor references Commodity”的两个角色。超集对是“EntityDescriptor is for CommodityCategory”中EntityDescriptor的角色,“Commodity is of CommodityCategory”中的Commodity角色。

请注意,每对的第一个角色由相同的类型(EntityDescriptor)扮演,每对的第二个角色(商品)也是如此。也可以使用兼容的子​​类型/超类型,但类型必须以这种方式兼容。

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

于 2014-03-20T06:04:18.973 回答
0

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

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

于 2010-11-29T03:48:35.067 回答