今天设计一个需求的时候发现一个有趣的问题,让我对对象世界,空间维度,时间维度又有了新的认识;
之前的表关系印象:
n:n的实体关系可以只能通过关系表(共3个表 ,两个实体表,一个关系表)实现,
1:n的关系可以通过关系表(共3个表,两个实体表,一个关系表) ,也可以通过两个表实现
但是这次需要保存物料的拒绝历史,一个物料只属于一个AD,一个ad拥有多个物料;
历史属于时间维度;虽然Ad和物料的关系是1:n ,但是加入了时间维度:
1. 新的关系 ,注意这个是自关系,将影响上游;;
Material List<Material> getHistoryMaterial
2 . 新的实体+关系 LIst<materialHistory> getHistoryMaterial ()
这两种方法都可以,
一种是增加关系:
优点: 不用新建新的表
缺点,在material实体上引入了一个属(, theOwnedMaterial 历史物料附属的物料;) , 导致实体含义变更,需要考虑是否影响了上下游;
比如Ad有个List<Material> getMaterials , 获取所有物料,本来获取的是当下的物料,现在实体含义变了,新增加的theOwnedMaterial entity属性,说明有可能本实体不一定是now实体;;
历史物料含自己
要解决以前问题:方法
1.1 增加@where( xx.id = xx.theOwnedMaterial )过滤
1.2 把新增加的类型字段作为Map增加 Map<material List<material>> getMaterials 这个很难用Map简单区分出来,如果历史物料不含自己还好办,只要是NUll的都是 now的 ,如果物料的历史物料含有自己, 那么以时间排期,第一个的就是now
一种是增加实体 ;
历史物料,毫不影响之前的实体关系;;
===========为什么把物料历史关系绑定在ad上,不应该是一个物料有多个历史么? 原因是我把这个关系前置了, ad 1:n 物料, 物料1:n 物料历史; 现在把物料和物料历史信息都放在了 ====================
一个物料对应多个历史 ,每个历史的字段fenng
和物料原有的一样,都需要有materialDate denyReason ;;
原则: 当出现字段重复的时候,你就需要考虑重构了, 抽出新的表=======
换个思路是====想想可否这样,一个物料多个历史可否改成 多个物料历史 ,(向上生长,改动最小原则, 保持原有接口不变原则,订单行 增加一个独立的productLine不行,那么首先想到的应该是保证本层次不变, 在上层插入一个中间层;; 这样的改动最小,也不影响 Ad 以productLine分类的原则,hibernate 用继承太重了没必要,只需要增加一个字段值的逻辑硬要变成增加一个类 ,, 2. 物料单元时 增加了一个isDeleted字段, 加入了invalid entity,getMaterials setMaterials变化,导致的问题是原有的getMaterial含义不一样了;方法是把isdeleted这个实体属性加入到子实体中(最初的设计),而不是把getMaterials下移;如果没有实体类确实需要把关系给改掉,用where也无妨,只不过实体不能操纵所有实体)=====