之所以会有不可变的考量,根本原因历史就是不可变的;; 拥有的关系是不可变,其下的属性不可变;
不可变的考量,必须是两种关系的交流,
由于一种肯定不可变关系,另外一种关系是否可变将影响到不可变关系存储的性能;; 通过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() ;
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 来考虑是否需要用关联表;;