框架设计:实现数据的按需更新与插入的改进

首先感谢dudu发了这么一篇:博客园现代化建设—准备用Entity Framework实现数据的按需更新

 

在帖子的第十六楼,我留下了这样的留言:

路过秋天:
这是一个复杂又冲突的设计问题:
1:为了按需要更新,你必不可免的需要有一份数据在内在的。
正如说没有缓存时,你需要多进行一次查询,无论是单个的查询,还是多更新几个字段,这个的性能点达到你需要这样处理的程度?
2:好,假设有已有缓存还没过期,你可以减少一次的查询,得到内在的实例的数据来进行比较,通过比较来更改isChanged标识,然后感觉得到了很大的提升,但这存在的是什么问题?
3:在第2步时,你需要这样处理的前提,是知道它是准备执行Update操作,所以你需要这样处理,如果是Insert呢?你提交的数据将有很多字段失踪了。
4:于是,这种方式,只能针对已知的某个页面,它不在被整体的泛用,再于是,产生的性能点并不可观。
5:最后,还是从客户端进行判断来提交相应的数据方式来得适合一些。

解决方案总在问题产生,分析,思索之后产生。




正如我引用内容所分析的问题一样,要从整体上考虑,就必须处理Insert的情况。




 

在经过前面几步的分析后,思索了一下,最终得出一个简单更优的解决方案,与大伙共享:

 

一:CYQ.Dtata 数据框架目前的设计方式:

 

1:在框架的内部的最小值赋单元里,有个bool型的IsChanged字段,来标识一个字段的值是否被改变过。

2:框架在组合SQL语句时,再根据此标识来组装相应的SQL语句。

从上面的两点看出,此设计基本上能实现按需要更新或按需要插入功能。

 

我们再看一下实际的应用场景:

 

场景一:看似完美的解决了按需更新或插入

using(MAction action=new MAction(TableNames.Blog_Users))

{

                 action.Set(Users.ID,1);

                  action.Set(Users.UserName,"cyq1162");

                  ation.Update();

}

说明:

OK,由于在值赋时会改变IsChanged标识位,于是无论是组Insert或是组Update,都会实现按需更新或插入。

 

场景二:问题出现了

比如一个博客后台,总会有很多选项或提交更新的地方:

using(MAction action=new MAction(TableNames.Blog_Users))

{

                  action.Set(Users.ID,1);

                  action.Set(Users.UserName,"cyq1162");//一般不会改用户名,这仅是示例

                  action.Set(Users.Nickname,"路过秋天");//修改昵称

                  acton.SetAutoPre("txt","ddl");//通过自动取值方式,省点代码,不然得写十多行赋值语句

                  ation.Update(true);//启用自动取值方式

}

说明:

在此情况下,所有Set的代码都会被更新,因为全都有了赋值动作了,事实上我们仅改了个别文本框的值。

假如:

我们就在设置IsChanged时,加个判断,值和以前一样,就不改变?

如此看似能解决,但又一问题又产生了,看下一场景。

 

场景三:按场景二的方式改进,Insert将有可能产生问题

假设我们有以下类似的应用场景:

using(MAction action=new MAction(TableNames.Blog_Users))

{

                  action.Fill(id);//查询填充一条数据,于是行或实体全有了数据。

                 // ...然后取值处理一些事情,然后进行一些判断......然后我们需要再添加一行新数据,再new一个新行或实体?可偏偏有时你会希望一个对象能多用几次,省点资源,于是有了以下操作

                  action.Set(Users.UserName,"新用户名");//重新赋值,

                  action.Set(Users.Nickname,"刚好这昵称有人用了");//再重新赋值

                  ation.Insert();//插入数据,于是当然期望新添加行的数据只有包括这两个重新赋值的数据。

}

分析:

OK,由于框架原先的设计,只会对赋值的语句组装SQL语句,所以我们并不担心原来的数据会产生什么影响,只要重新赋值,就可以添加新数据了。

如果:

在场景二的时候,我们加了判断,不改变IsChanged标识位了,会产生什么影响?

产生问题:NickName没有被插入,原因是因为行里本身有数据,相同值的赋值不再更改标识位的。

 

在一瞬间的意识流分析到以上问题后,所以有了在dudu文章下面的留言。

当然应用场景是有可能相似的,只是实现的代码或者另有不同。

 

二:CYQ.Data 数据框架的改进设计

 

在分析后问题的产生,意识流又有了一些许冲动,来了不少灵感,于是有了以下的改进方案

1:单纯的bool型的IsChanged无法适应这种情况,那增加更多的标识类型呢?

2:于是进而转之再有了新想法:将bool型的IsChanged更改为int型的State。

于是,多了可扩展的N种状态:

0:状态未被更改;1:产生赋值动作,值相同;2:产生赋值动作,值不同。

于是,问题明朗化并得到解决:

1:产生Insert语句时,判断State>0即可

2:产生Update语句时,判断State>1即可。

3:赋值时,同样将新旧值进行判断,更改State为1或2。

 

至此,框架改动起来不过3分钟不到,但却完成了一项不小的功能改进。

 

由于突然间断网,延迟了一个多小时发布了。

版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:

http://www.cnblogs.com/cyq1162/archive/2011/04/03/2004437.html

时间: 2024-12-30 23:54:01

框架设计:实现数据的按需更新与插入的改进的相关文章

框架设计:实现数据的按需更新与插入的改进--用数据对比进一步说明

在发布完:框架设计:实现数据的按需更新与插入的改进 之后:   有网友表示不理解,于是这里给出一篇简单的说明对比,表示下改进后好处.   一:场景一:循环5次,同样也是重复提交的问题               using (MAction action = new MAction(TableNames.Blog_User))             {                 for (int i = 0; i < 5; i++)                 {          

Socket开发框架之框架设计及分析

虽然在APP应用.Web应用.Winform应用等大趋势下,越来越多的企业趋向于这些应用系统开发,但是Socket的应用在某些场合是很必要的,如一些停车场终端设备的接入,农业或者水利.压力监测方面的设备数据采集等,以及常见的IM(即时通讯,如腾讯QQ.阿里旺旺等)的客户端,都可以采用Socket框架进行相关的数据采集和信息通讯用途的,Socket应用可以做为APP应用.Web应用和Winform应用的补充. 1.Socket应用场景 一般情况下,客户端和服务端进行Socket连接,需要进行数据的

SilverLight企业应用框架设计【五】客户端调用服务端(使用JSON传递数据,自己实现RESTful Web服务)

来个索引 SilverLight企业应用框架设计[四]实体层设计+为客户端动态生成服务代理(自己实现RiaService) SilverLight企业应用框架设计[三]服务端设计 SilverLight企业应用框架设计[二]框架画面 SilverLight企业应用框架设计[一]整体说明   在上一节中讲到的自动生成的服务代理类核心代码,如下 public event ServiceEventHandler Completed; public void GetAllMenu() { var si

APP 自动化框架设计思路分享

APP自动化框架设计分享 框架需要解决的问题: • 渠道包->多渠道包核心用例自动化 • 多设备覆盖安装,安装卸载更新等测试 • 多设备核心用例适配测试 • 验证主要页面(包括webview)检查是否加载成功 • 离线主流程覆盖 • 一些重复性操作可以通过框架简单实现 框架目标定位: • 让Tester无需编写代码 通过简单数据驱动方式实现通用简单的自动化 • 跟开发约定一些UI上的元素标准和规范建立自动化规范流程化 • 结合实时抓包组件和性能监控插件方便分节点定位问题 • 自动异常捕获,Cra

Uber是如何使用MySQL设计可扩展性数据存储的?

在Mezzanine项目中我们描述了我们是如何将Uber的核心行程数据从单个的Postgres节点迁移到Schemaless,这是我们开发的一个容错性很高.可用的数据存储. 根据Uber工程师的习惯使用MySQL设计的数据存储,使我们可以从2014 扩容到更高.本文分成三部分对Schemaless进行阐述. 一.Schemaless的总体设计   这一部分我们将讲述Schemaless的架构它在Uber基础结构中的角色以及他是如何成为该角色的. 1.我们对新数据库的迫切需求 2014年初,由于出

设计的力量,应需而变

读subjiect to change这本书的记录,融入了自己的理解.书的中文名是设计的力量,应需而变.书名和我博客的主题倒挺一致的,但内涵不同. 摘录及笔记部分: 当你开始处理一个看似简单的问题,你可能没有真正意识到其复杂性,当逐渐深入后,发现其复杂之处后,随之而来的事很多看似很优秀但很复杂的解决方案,其实这只是走到一半,这也是大部分人止步的地方--但是真正睿智的人会继续寻找答案--问题的本质,然后提出优雅.漂亮的解决方案,这正是我们在Mac上所想做的 --史蒂夫.乔布斯 产品进化论的关键要素

统一身份认证子系统数据库设计与数据访问层实现

访问|设计|数据|数据库|数据库设计 目 录 一 引言--------------------------------1 二 需求分析 (一)系统的功能要求------------------------2 (二)系统的性能要求------------------------2 (三)运行环境要求-------------------------2 (四)开发工具简介-------------------------2 三 总体设计 (一)系统模块化分----------------------

设计下一代数据中心 (3)

摘要:对于下一代数据中心而言,自动化是十分重要的,尤其是在速度以及原则方面.快速IT意味着更快的创新,更快的上市时间以及更多的企业价值. 自动化管理 按需消费作为一种服务方式,直接与企自动化设施深入程度息息相关.采用自动化来管理关键点的变化,无论是从硬件的物理限制到软件容量的无限设计的能力,都在因为自动化管理带来的改变而改变.对于下一代数据中心而言,自动化是十分重要的,尤其是在速度以及原则方面.快速IT意味着更快的创新,更快的上市时间以及更多的企业价值. 备注:快速IT(Fast IT):思科认

Extjs4.1.x 框架搭建 采用Application动态按需加载MVC各模块完美实现_实用技巧

中午的时候发了第一篇 Extjs4.1.x 框架搭建 采用Application动态按需加载MVC各模块 ,发现实现上还是有问题,有很多理解不到位的地方,晚上详细解决下了,终于实现MVC各模块按需加载了,哈皮. 上篇文章中,关于ExtJs这个玩意的评论就跟java和.Net那个好一样,既然上了贼船,就难下了,而且对于企业级的应用我个人觉得Extjs框架还是不错的,尤其是没有UI设计的团队(苦逼的程序员就兼UI吧),起码难得发现一个做的比较好的UI框架(国产的miniUI貌似看的过去,其他的就有点