重量级别--何为immutable,在拷贝,快照,而非历史需求中分析,如何利用immutable模式和跨设计实体后的业务实体关系 决定 设计实体 是否immutable , 以后业务操作该如何操作

之所以会有不可变的考量,根本原因历史就是不可变的;; 拥有的关系是不可变,其下的属性不可变;


不可变的考量,必须是两种关系的交流, 

由于一种肯定不可变关系,另外一种关系是否可变将影响到不可变关系存储的性能;; 通过new的频率来权衡

比如历史关系是不可变的,adGroup拥有materials的历史是不可变的,这是需要有不可变的原因; adGroup now关系可变不可变会导致存储历史关系时如何new


Ad material

然后现在有个需求需要保存他们的快照;;

ad下面有三种关系  1.1 List<materials> getCurrentMaterials() 

1.2  List<Materials> getHistoryAndCurrentMaterial(); 允许ad增加物料,删除物料,个数不限制;

这个关系组合, 1.1 1.2 可以用 两个关系表(两个外键, 可以 两个实体表,一个中间表实现 ,也可以把外键附属在N侧实体) ,或者 用一个@where注解+ 一个外键+一个类型字段( 可以)


另外一个是  2.  <Date , List<Material> > getMaterialsSnapShots() ;   每隔1天存储一次当时的物料list ;;

和  1.1 和 1.2的关系组合的后一种实现一样; 一个外键+一个类型字段Date ,或者是 一个外键+ list.Size()个外键字段


对于1.1 来说: 当前的materials ,  即使material的内容变,无所谓,当前的materials不影响;; 引用没变;

对于1.2 来说: 可以考虑 和1的外键进行捆绑,新增一个字段, ,,实体世界可以是用一个where进行区分;; 或者用< tyep , List<Materials>> getmaterials() 来代替(  List<materials> getCurrentMaterials()  和 List<Materials> getHistoryAndCurrentMaterial();  type的类型可以是 1. 当前物料, 2. 所有的物料 ) 实现比较好, 避免脏的设计, 类型过多的时候;;

对于2来说: materials变不变对这个都没有影响;materials内容变了,存储的materials 不会改变;; 即使 getCurrentMaterials的个数变了,也不会影响到getMaterialsSnapShots指向的引用物料;;


避免一个关系就需要用一个外键来实现,或者一个关系表来实现的OO设计技巧;;



可以用hibernate的@collection来实现;;


跨实体考虑immutables;

当觉得Map<date, List<Material>>  中 List<material> 不想用@collection时候 , 可以变成一个实体的时候 MaterialGroup时候;

前面三个关系变成了

Ad MaterialGroup  Material ;

Ad

1.  MaterialGroup   getCurrentMaterials() 

另外一个是  2.  <Date , MaterialGroup  > getMaterialsSnapShots() ;   每隔1天存储一次当时的物料list ;;

                  3.  MaterialGroup   getHistoryAndCurrentMaterial(); 允许ad增加物料,删除物料,个数不限制;

我们的需求是要求保存Ad下materials的快照,你现在往中间插入了一个实体; 现在的需求变成了 跨实体的一种关系需求;;   这中间任何实体的immutable都影响实体之间的交互逻辑, 影响Ad和material的跨实体关系需求是否满足;;

假设 MaterialGroup 不可变,materialGroup的List<material>这个内容不能变 ;;

List<materils> getCurrentMaterials() ;

1) 那么每次有需求对Ad新增现在的物料 ;;就需要改变copy 一个MaterialGroup,然后把新增的material和原有的material引用添加到新的materiaGroup对象中;并把这个 MaterialGroup   替换到原来的 getCurrentMaterials() ; 需要new MaterialGreoup() ,new Material() ,次数不多

2) 每天备份物料时, 因为materialGroup不可变,可以直接把引用赋值给getMaterialsSnapShots这个Map里的Value ; 不用new实体

3 ), 基本同1)操作


MaterialGroup 可变时候

List<materils> getCurrentMaterials() ;

List<material> getHistoryCurrentMaterial() ;

MaterialGreoup 是设计实体,.(material ad是 业务实体的实体关系变化 ,需求要抓取业务实体) ,跨实体分析肯定是因为 中间间隔了设计实体

1)   那么每次有需求对Ad新增现在的物料 ;;new 一个material,然后替换原来的material 需要new material,次数不多

2)   每天备份物料时, 因为materialGroup可变,备份物料,就需要new一个MaterialGreoup出来,把material引用赋值过来, 赋值给getMaterialsSnapShots这个Map里的Value ;  需要new MaterialGreoup 次数很多

3 ),  基本同1)操作




综上所述,要根据业务合理选择设计实体的可变性, 业务实体的可变性其实已经由业务决定了



如何判断是  2表 还是 3表;

Ad material

然后现在有个需求需要保存他们的快照;;

ad下面有三种关系  1.1 List<materials> getCurrentMaterials() 

1.2  List<Materials> getHistoryAndCurrentMaterial(); 允许ad增加物料,删除物料,个数不限制;

这个关系组合, 1.1 1.2 可以用 两个关系表(两个外键, 可以 两个实体表,一个中间表实现 ,也可以把外键附属在N侧实体) ,或者 用一个@where注解+ 一个外键+一个类型字段( 可以)


另外一个是  2.  <Date , List<Material> > getMaterialsSnapShots() ;   每隔1天存储一次当时的物料list ;;

和  1.1 和 1.2的关系组合的后一种实现一样; 一个外键+一个类型字段Date ,或者是 一个外键+ list.Size()个外键字段


对于1.1 来说: 当前的materials ,  即使material的内容变,无所谓,当前的materials不影响;; 引用没变;

对于1.2 来说: 可以考虑 和1的外键进行捆绑,新增一个字段, ,,实体世界可以是用一个where进行区分;; 或者用< tyep , List<Materials>> getmaterials() 来代替(  List<materials> getCurrentMaterials()  和 List<Materials> getHistoryAndCurrentMaterial();  type的类型可以是 1. 当前物料, 2. 所有的物料 ) 实现比较好, 避免脏的设计, 类型过多的时候;;

对于2来说: materials变不变对这个都没有影响;materials内容变了,存储的materials 不会改变;; 即使 getCurrentMaterials的个数变了,也不会影响到getMaterialsSnapShots指向的引用物料;;


避免一个关系就需要用一个外键来实现,或者一个关系表来实现的OO设计技巧;;



对于简单的 

List<material> getMaterials

List<material> getHistoryMaterials 来说比较简单 ;


=======

但是增加了一个 @where 就复杂了;;

或者 Map<Date,List<Material>> getMaterialsSnapShot

用一个Date 对应多少个Material ,一个Material能否属于多个Date 来考虑是否需要用关联表;;




如何判断是  2表 还是 3表;

Ad material

然后现在有个需求需要保存他们的快照;;

ad下面有三种关系  1.1 List<materials> getCurrentMaterials() 

1.2  List<Materials> getHistoryAndCurrentMaterial(); 允许ad增加物料,删除物料,个数不限制;

这个关系组合, 1.1 1.2 可以用 两个关系表(两个外键, 可以 两个实体表,一个中间表实现 ,也可以把外键附属在N侧实体) ,或者 用一个@where注解+ 一个外键+一个类型字段( 可以)


另外一个是  2.  <Date , List<Material> > getMaterialsSnapShots() ;   每隔1天存储一次当时的物料list ;;

和  1.1 和 1.2的关系组合的后一种实现一样; 一个外键+一个类型字段Date ,或者是 一个外键+ list.Size()个外键字段


对于1.1 来说: 当前的materials ,  即使material的内容变,无所谓,当前的materials不影响;; 引用没变;

对于1.2 来说: 可以考虑 和1的外键进行捆绑,新增一个字段, ,,实体世界可以是用一个where进行区分;; 或者用< tyep , List<Materials>> getmaterials() 来代替(  List<materials> getCurrentMaterials()  和 List<Materials> getHistoryAndCurrentMaterial();  type的类型可以是 1. 当前物料, 2. 所有的物料 ) 实现比较好, 避免脏的设计, 类型过多的时候;;

对于2来说: materials变不变对这个都没有影响;materials内容变了,存储的materials 不会改变;; 即使 getCurrentMaterials的个数变了,也不会影响到getMaterialsSnapShots指向的引用物料;;


避免一个关系就需要用一个外键来实现,或者一个关系表来实现的OO设计技巧;;



对于简单的 

List<material> getMaterials

List<material> getHistoryMaterials 来说比较简单 ;


=======

但是增加了一个 @where 就复杂了;;

或者 Map<Date,List<Material>> getMaterialsSnapShot

用一个Date 对应多少个Material ,一个Material能否属于多个Date 来考虑是否需要用关联表;;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值