锁定老帖子 主题:用SQL语句做业务逻辑的CMS框架设想
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (10)
|
|
---|---|
作者 | 正文 |
发表时间:2009-12-31
常见的CMS系统,所做的大部分工作基本都可以用一句或几句SQL语句来描述。既然如此,为什么还要搞那么复杂的分层设计呢?对于需求固定较少变化的还好说,设计几个接口,对应一些实现,虽然绕几个弯,但写好之后用起来还比较方便;而对于变化较频频,时不时会要求修改、扩充功能的需求状况来说,接口的维护反而有点鸡肋的感觉,加个新功能,不得不增加新接口,而这些接口绕来绕去,实在没做太多事情,最终去DAO层调了一个或若干SQL语句。
按分层的理念,DAO层是纯粹的持久化层,也有人建议DAO层只有简单的增、删、改、查接口,但权衡数据库的性能与功能,我相信大多数应用还是最终会用SQL语句体现应用逻辑。这是面向对象的尴尬 。
像PHP这样的程序能够一直火下去,也证明Java的许多概念听着很好,实际未必那么好。PHP开发往往比Java要快要简单,因为它没有那么多繁琐的层次。如果你需要,你随处可以执行一个SQL语句。PHP程序的质量,取决于开发者;而使用较多框架的Java应用中,框架企图以自身的智慧取代开发者的部分智慧。
完全依赖于开发者的项目,质量控制稍麻烦些,代码的可维护性也往往差些,试想随处一个SQL语句,程序结构会混乱许多,控制起来很麻烦。但为了保留这种开发方式的便捷性,我们是否可以从另一方面考滤呢?
我们可以对SQL语句进行一层封装,外部执行的全是这个SQL的外壳。我们用自己的SQL语句解析器将SQL语句解析成一个对象,这个对象代表着一个应用逻辑。这个想法来灵感来自于搜索引擎的使用经验。通过组合不同的查询条件,可以搜到不同的内容,这就如同通过查询条件来决定实现的业务逻辑。而SQL本身是结构化查询语言,它也相当于搜索引擎的搜索词。
这样的话,我们的SQL外壳其实可以理解为一个接受SQL语句作搜索词的搜索引擎,业务逻辑任由外部以SQL语句的方式提供,而内部的控制,就做在这个SQL外壳被翻译成真正SQL语句执行之前和之后。
举例来说,我们的文章有开放的和未开放的,普通用户只能看到开放的,管理员用户能看到全部。那么如果外部SQL语句没有加以区别,我们要强行在内部控制的话,就可以通过SESSION判断,对非管理员用户的查询,强行附加一个AND条件。在自己实现了SQL解析的前提下,这种操作是很简单的。
进一步扩展,我们可以实现不依赖数据库视图的视图定义,比如select * from target,这个target表可以是一个根本不存在的表,它对应一些分散的数据表。在接收到这样的SQL语句时可以做预处理,将其解开,重构SQL。比其直接用join或其它多表关联查询,自己处理有更高的灵活性,比如部分数据可以不是数据表中的等。
不但表名可以重映射,字段也可以重映射。最简单的一种情况就是对字段进行重命名。数据库中的字段名往往都有前缀,而前端应用中希望变量名(或属性名)简单好记,希望可以脱离数据库。这样外壳SQL里的字段名可以用外部使用的名称,内部将其映射到数据库中的字段名(或其它非数据库中的数据)。
有些操作,尤其是更新,往往要求在更新完成后做一些其它工作,比如数据同步等。这时可以在SQL外壳执行后做后续处理。也即SQL外壳经翻译后真正执行的前后,分别可以加处类似onPreXXX和onPostXXX的处理方法。后续处理根据SQL语句判断更新了哪些内容,然后去做相应的同步操作。
这是我的一个设想,目前我已经实现了一部分,包括最重要的SQL语句解析 。大家可以一起来讨论这种框架的可行性与劣。
原文出处:http://www.liuhaifeng.com/2009/12/imagine-of-sql-based-framework-for-cms.html 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2010-01-04
SQL语句解析的功能要足够强大,感觉这样完善到最后,就又做出来一个类似hibernate的框架,只不过功能可能侧重不同。
|
|
返回顶楼 | |
发表时间:2010-01-04
对,可以说与Hibernate有一些相似的地方,但功能侧重完全不同。Hibernate只是用来做持久化及关系映射(ORM),我的目标是用它来做业务逻辑。就像现在已经有不少SNS网站提供SQL查询接口,这种SQL仅仅是种业务逻辑表达:
1、它可以做类似ORM的事情,但概念上要比Hibernate宽,它不是持久化框架,所以它可以把一切数据映射进去,如果需要的话; 2、它不负责真正的持久化,虽然也有可能直接由它重组SQL语句拿去执行。但即使直接执行,在执行前后都可以触发一些处理,这是Hibernate所没有的功能(Hibernate的定位决定它不需要这样的功能)。 可见二者只是部分功能相似,定位是完全不同的,最终所实现的东西也是不同的。至于SQL解析的功能,只要能将SQL语句翻译成对象,其它的应该由别的模块来做了。比如解析器可以告诉你这个查询查了哪些表,至于这些表对应着什么,或是权限如何控制,这些就不是解析器要做的事情了。 |
|
返回顶楼 | |
浏览 2772 次