我正在尝试使用对象角色建模来建模概念,但我找不到必要的约束类型。我想知道它是否存在。
以下是三个事实:
这很容易建模:
但这是约束:
例如,假设我们有这些商品。
*--------------------*------------* | 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 约束,但这是关系的存在,而不是关系中的实际值。
我可以用它来模拟这个约束吗?
答案 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值来验证规范。