<如何创建一个实体历史> 时间维度 让 1:n的 产生新的实体 或者关系

今天设计一个需求的时候发现一个有趣的问题,让我对对象世界,空间维度,时间维度又有了新的认识;

之前的表关系印象:

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也无妨,只不过实体不能操纵所有实体)=====


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值