重量级别--何为immutable,在拷贝,快照,而非历史需求中分析,如何利用immutable模式和跨设计实体后的业务实体关系 决定 设计实体 是否immutable , 以后业务操作该如何操作
2013-07-05 20:02
531 查看
之所以会有不可变的考量,根本原因历史就是不可变的;; 拥有的关系是不可变,其下的属性不可变;
不可变的考量,必须是两种关系的交流,
由于一种肯定不可变关系,另外一种关系是否可变将影响到不可变关系存储的性能;; 通过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 来考虑是否需要用关联表;;
不可变的考量,必须是两种关系的交流,
由于一种肯定不可变关系,另外一种关系是否可变将影响到不可变关系存储的性能;; 通过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 来考虑是否需要用关联表;;
相关文章推荐
- 黄聪:如何判断VS开发C#是否为设计模式,以免编译之前操作窗体设计器代码自动运行
- dip和px区别联系 产生的根源和设计时的影响如何?是否屏幕密度的决定原因?
- 我是如何学习设计模式的七:中介者模式—和command模式,观察者模式有一定关系
- 网页设计中该如何决定是否使用框架技术
- 转载 如何规范需求,平衡需求挖掘、产品设计、产品研发三者的关系
- 【利用Python进行数据分析——经验篇3】如何操作DataFrame中的列的数据格式(转为百分数、保留4位小数)
- 2、利用反射技术得到泛型类型,实现对实体添删改查操作进行代码重用设计
- 如何进行信息系统的需求分析和设计----软件工程师的锋芒
- 如何利用Android特点及设计模式 设计一个网络下载功能
- 需求分析和架构设计总结--利用DODAF方法
- 面向对象系统分析与设计-----如何开展需求调查
- 如何在一个项目中完美融入GreenDao并使用Facde设计模式操作数据库
- 032 业务受理模块需求分析和数据库设计 - bos
- MySQL优化分库分表,为什么要分表,分表以后如何进行排序查询,业务如何设计?
- 给IT人员支招:如何跟业务部门谈需求分析?(上)
- 个人资讯——如何分析业务需求和用户痛点
- [网络问题,截图以后再传]本实验是设计性实验。目的在于使用关系数据库标准语言SQL,掌握视图和索引的操作。
- Checking Table 设计模式 - 从概念、建模、设计到实现——兼谈基于业务需求驱动的设计模式创新
- 网易有道的产品总监王焱:如何利用数据分析推动产品设计
- 转:如何设计业务实体