代码改变世界

随笔档案-2012年08月

SQL好习惯:编写支持可搜索的SQL

2012-08-31 08:26 by Mike.Jiang, 1206 阅读, 收藏,
摘要: 1 概述最近维护系统时,客户经常反馈这样一个内容:要在查询列表上加上一个查询条件。这样的要求一点也不过分,并且看起来工作量也不大,不就是加一个WHERE条件嘛,但是当调试到DAL层时,立刻石化——遇到在SELECT子句中编写子查询的SQL,SELECT SO.order_no,(SELECT SUM(SOD.good_num) FROM [StockOrderDetails] AS SOD WHERE SOD.order_id=SO.id) AS order_numFROM [StockOrder] AS SO 这样的写法缺点如下:1>order_num不能在SELECT中继续使用2&g 阅读全文

常见数据库设计(4)——树形结构数据

2012-08-29 10:39 by Mike.Jiang, 41867 阅读, 收藏,
摘要: 1 概述树形数据,主要关注的是:1> 如何将数据高效地以树形的形式展现给用户2> 通过某个节点找到所有的父节点。3> 获取某个节点的所有的后继节点(包括子节点的子节点)至于添加、修改、删除和通过一个父节点获取对应的子节点,都是可以很容易的实现。2 邻接模型2.1业务:文件存放位置,在档案管理中,需要为文件的存放位置建模,文件存在抽屉,然后抽屉在某个柜子中,柜子在某个房间中。2.2表结构:2.3备注可以在表中再加入一个level_num字段(表示所处在树的深度),这样就少了那一个递归查询的操作,但是在管理上有做一些处理。2.4 Normal 0 7.8 磅 0 2 ... 阅读全文

常见数据库设计(3)——历史数据问题之多记录变更

2012-08-28 22:13 by Mike.Jiang, 9205 阅读, 收藏,
摘要: 关于历史数据的单记录变更:常见数据库设计(2)——历史数据问题之单记录变更1.概述在保存客户操作历史数据时,有一种数据,如标书的标书流水+标书清单、细化方案的细化方案流水+细化方案清单、商品价格的价格变动流水+变动清单等等。这样的历史数据,它们都有一个控制流水版本的主流水表,还有一个与某个版本对应的清单表。2. 多记录变更、无储存未来历史记录的需求,储存于单表中业务:在做付款计划时,需要保存计划的历史版本数据,同时也要记录每一计划针对哪些物资进行付款的。表结构说明:如单记录一样,版本的控制在付款计划表中。主体如何实现版本控制请参见单记录变更3. 多记录变更、无储存未来历史记录的需求,储存于多表 阅读全文

状态模式 State

2012-08-27 17:50 by Mike.Jiang, 386 阅读, 收藏,
摘要: 状态模式(允许通过改变对象的内部状态而改变对象的行为, 这个对象表现得就好像修改了它的类一样)与策略模式的类图一样,实现一样,都是解耦if else 。只是它们解决问题的语境不同,但都可以归纳到解耦ifelse,将不同行为抽象成对象分布在子类当中,在Context中配置当前操作对象。这样在新增状态或修改已有状态时,不再违背开闭原则,遵守单一职责原则。 阅读全文

SQL JOIN --Merge Join

2012-08-27 16:36 by Mike.Jiang, 8053 阅读, 收藏,
摘要: 1概述Merge join 合并连接。两个集合进行merge join,需要有一个等值的条件,然后需要两个已排序好的集合。2 one-to-many与many-to-many2.1 One-to-many当参与merge join的两个集合中,其中一个集合在等值条件上是具有唯一性(如SELECT * FROM T1 INNER JOIN T2 ON T1.A=T2.B,如果T1在A列上具有唯一性),那么即为one-to-many。主要步骤为:首先从两个集合中各取出一条记录进行比较,如果符合join条件,那么取出该行;否则将值小记录从集合中移除,然后取值小集合的下一行,继续比较。2.2 many 阅读全文

职责链模式

2012-08-24 11:42 by Mike.Jiang, 603 阅读, 收藏,
摘要: 1概述 当一个请求,有多个处理对象时,如果硬编码指定某个由某个对象来处理,需要采用ifelse的结构,从而产生了代码的耦合,如果要添加新的请求处理对象或调整请求处理的次序,必然会修改同一个方法,违背开闭原则。2 GOF中的定义意图: 使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止。结构图:适用性:1>有多个的对象可以处理一个请求,哪个对象处理该请求运行时刻自动确定。2>你想在不明确指定接收者的情况下,向多个对象中的一个提交一个请求。3>解耦ifelse,将处理对象组织一个链并希望处 阅读全文

Observer 观察者模式

2012-08-23 13:42 by Mike.Jiang, 573 阅读, 收藏,
摘要: 1 GOF中的定义意图定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时, 所有依赖于它的对象都得到通知并被自动更新。[GOF 《设计模式》]结构图2.概述个人感觉观察者模式定义的比较不容易理解:什么多个观察者关注某个主题的,这个模式解决的是当一个对象需要调用一系列对象的方法时,并且是被调用方自己注册自己是否被调用,调用方不知道要调用哪些方法的问题。3生活中的例子现在,银行业务中有一项,当账号金额发生变化时就进行通知,默认是通知到手机,也可以选择将信息同时发送到邮箱。4.调用方依赖被调用方情景1:在这个业务的起初,账号金额变化,通知到手机实现:View Code public... 阅读全文

Command命令模式

2012-08-22 09:36 by Mike.Jiang, 527 阅读, 收藏,
摘要: 1 GOF中的定义1.1意图将一个请求封装为一个对象,从而使你可用不同的请求对客户进行参数化;对请求排队或记录请求日志,以及支持可撤消的操作1.2结构图2 初步理解方法调用代码:View Code public class ClassA { public int Compute() { Calc c = new Calc(); return c.Execute(); } } public class Calc { public int Execute() ... 阅读全文

SQL JOIN--Nested Join

2012-08-14 23:48 by Mike.Jiang, 3121 阅读, 收藏,
摘要: 概述数据库主要有三种物理连接方式:nested join, merge join ,hash join。 这次主要说说nested join(NL).在NL中,两个相连的集合分别是outertable,innertable.SELECT * FROM OrderDetails AS OD INNER JOIN [Order] AS O ON OD.order_id=O.id其中,Order表为outertable,OrderDetaiils 表为innertable.但数据库优化器会选择较小的表作为outertable简单算法描述首先,outertable中取出一行,然后分别与innertab 阅读全文

模板方法Template

2012-08-09 13:53 by Mike.Jiang, 277 阅读, 收藏,
摘要: 动机: 在面向对象的世界里,代码复用主要体现在继承。然而当我们想让子类不仅能继承,而且也能重新定义方法时,很自然地就想到重写方法,但是这样是把整个方法的重写。如果我们有这样的一种需求,在父类的某个方法只能完成方法一个部分,而另一部分必须由子类去完成(这种应用在编写框架时遇到的很多),并且在调用这些由子类实现的方法有一定的逻辑。当有这样的需求时,我们应该怎么办——模板方法。意图:定 义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。代码实现View Code public class Temp... 阅读全文

策略模式

2012-08-08 17:27 by Mike.Jiang, 370 阅读, 收藏,
摘要: 一、概念策略模式(Strategy):它定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换。策略模式让算法的变化不会影响到使用算法的客户。二,应用示例 采用《大话设计模式》中的商场收银的例子,即在收银算法对某个商品,可能是正常收费也可能是打折收费,也有可能是满200返20的。三,普通青年解决方案 写一个条件判断,根据不同的收费类型,调用不同的收银方法View Code string type = ""; switch (type) { case "Nomal": ... 阅读全文

SQL参数化查询的另一个理由——命中执行计划

2012-08-02 21:55 by Mike.Jiang, 1896 阅读, 收藏,
摘要: 1概述 SQL语言的本质就是一串伪代码,表达的是做什么,而不是怎么做的意思。如其它语言一样,SQL语句需要编译之后才能运行,所以每一条SQL是需要通过编译器解释才能运行的(在这之间还要做SQL的优化)。而这些步骤都是需要运行成本,所以在数据库中有一个叫做执行计划的东西,编译器会将编译过后的SQL存入执行计划当中,当遇到同样的SQL时,就直接调用执行计划来执行,而不需要再次编译。 通过对上面执行计划的认识,为了提高数据库运行的效率,我们需要尽可能的命中执行计划,这样就可以节省运行时间。2相关SQL2.1查看当前数据库中所有的执行计划:View Code SELECT cp.usecounts . 阅读全文