客户向浏览器发出请求,浏览器根据用户的请求作出相应的响应。服务器端需要知道用户的请求信息,寻找相应的Sql语句,执行数据库查询。在以XML为传输标准的前提下,整个网站的所有的SQL语句可以存放在一个XML文档中,系统在加载的过程中一次性加载。在以后的使用中不用再次读取文档,解析文档,节省IO,在普通的系统中,需要用到的SQL语句不会超过100句,把他们全部存储在XML文档中不会超过5k,这一点的空间开销对于现在的计算机的内存来说并不大,但是这一点点的额外开销却为整个系统节省了许多时间,对系统的影响就是在启动的时候稍微慢了一点点。
XML的设计至少能满足系统对数据查询的需求,在整个系统中用到的SQL语句大致可以分为以下的几种
1. 向一个表中插入一条数据。
2. 向一个表中插入多条数据。
3. 向一个表中插入一条数据,同时向另外相关的表中插入一条或多条数据,需要保存第一个表中的主键,
4. 从一个表中选择数据,需要对<select>翻译,提供查询条件,并且分页,统计总数
5. 从一个表中选择数据,需要对<select>翻译并且时向提供一个数据列的统计。
对于以上的需求,其中的一个解决方案包括:
Select 和dselect的解决方案:由于整个系统中使用的<select>下拉框的数据都是常用的数据,可以把这些数据作为字典来维护,称为系统常用字典表sys_dic(system_dictionary),里面的数据供查询使用,主要包括三个列,dispText(display Text),(textvalue)relValue(relative Value),dicName(Dictionary Name)字典名字,字典在数据库中表现可能如下(汽车,qiche,运输工具), (火车,qiche,运输工具)。系统中经常使用的字典信息不会很多,占用的内存也不是很大,系统在加载的过程中,一次性把所有用到的字典信息都加载在内存中,以便于以后翻译使用,以少量的内存换取大量的时间。表内的信息在修改和查看的过程中需要根据自己保存的内容再次关联另外的表的操作才能查看信息,在表的重用方面显得不够方便,鉴于字典的字段的内容不大,可以把字典相关值和现实的内容都保存在表中。主要包括有select中的value和text可以分别命名为JTGJ,JTGJ_disp,对于动态选择的内容来说可能就比较复杂,但是动态选择的内容也包括两个数据项,其中一个是关键字,另外的一个是显示的内容,不妨也保存两个字段,在维护的时候统一维护两个字段。维护两个字段不如维护一个字段方便,综合考虑人们常用的操作,在信息输入一次之后,修改得可能性不大,即使修改了另外的字段,用户可以在下次的修改过程中纠正过来。一般来说,用户发现输入错误之后会立即纠正过来,不会在发现错误之后视而不见。
向一个表中插入一条数据比较简单,可以根据数据表的主键列判断是更新还是插入,如果是插入需要计算主键,如果是更新则需要设置更新的条件。因此前台传入后台数据只需要传入修改过的或者是新添加的纪录,没有进行处理的类型则不需要添加。更新一条记录和更新多条纪录是一样的。在数据库中各个表之间是若耦合的,不需要通过数据库系统的外键来维护。这样就减少了一些麻烦。向数据库中插入一条记录并向另外的表中插入多条记录的方式需要设计一个主表,然后设计子表,主表中插入一条记录之后分别向子表中插入数据,同时存入主表生成的主键,因此在前台向后台传入的XML文档中需要标示出主表和子表。无论是子表还是主表,在后台的数据库对应中都需要对应一个具体的表。解决一个及联子表的功能和多个子表的功能是一致的,为了系统的扩展,应该保留相应的字段。因此,后台应该存储的数据包括如下的样式
<system>
定义系统所有的表
<tables>
系统中需要的表都以这样的形式命名:
表名作为一个Tables的字元素,列名作为表名的字元素,里面的内容是对应的中文解释,列名中的属性作为当前列的要求,包括 valid和default,所有的这些信息用来进行相应的检查进行一些服务器端的验证。对于每个需要插入的表的第一个,在页面范围中设置Pk1主键,系统支持一级饮用,也就是说只支持一层关联,关联的字段的名称为ppk
<WM_HD>
<pk1 valid=”required” >主键</pk1>
<userName valid=”true” default=”qiche” ref=”交通工具”>姓名</pk1>
</WM_HD>
</tables>
下面的定义的是系统需要用的View,视图的定义相对比较麻烦,涉及到多个表的关联,但是对于每个表都需要有一个关联
<modules>
在一个页面中一般会出现这样的现象,有一个主要的视图,同时又几个相关联的视图,可以把主要的视图定义为主视图,其他的视图定义为字视图,使用父子关系来约束页面的展示数据,子视图定义了需要引用的父视图的字段和自己对应的字段。在视图中需要定义使用的表。在一个表中把所有的字段全部写在了表中,因此不需要进行引用其他的表就可以完全显示所有需要的字段。在试图中
<module id=”WM_KH”>
<datasets>
<dataset id=””>
</dataset>
</datasets>
<view></view>
</module>
</modules>
</system>
系统后台的根据请求查询XML文档,最后操作数据库,并把数据库的返回结果封装之后返回给客户端,客户端接受的数据形式应该是这样的
<xml id=”metadata”>
<rows>
<row flag=”add”></row>
</rows>
<xml>
<XML id=”datasets”>
<dataset id=”ds1” view=”WM_HD” where=”” currentpage="1" pagecount="10" allcount="1">
<rows >
<row row updateFlag=”add|update|delete” current=”YES”></row>
<rows>
</dataset >
<subset>
<dataset id=”ds2” view=”WM_HD” where=”” currentpage="1" pagecount="10" allcount="1">
<rows>
<row updateFlag=”add|update|delete” current=”YES”></row>
<rows>
</ dataset >
<dataset id=”ds3” view=”WM_HD” where=”” >
<rows>
<row updateFlag=”add|update|delete” current=”YES”></row>
<rows>
</ dataset >
</subset>
</xml>
以此作为数据传输的标准。对一个记录集发出查询条件存放在ds对应的where条件中。对于一个动态选择的数据的查询条件需要单独的放在另外的地方进行单独的存放和处理。
本文转自凌辉博客51CTO博客,原文链接http://blog.51cto.com/tianli/69685如需转载请自行联系原作者
lili00okok