SmartClient中客户端数据缓存的思考

什么要进行数据缓存:

1.        为了允许用户进行离线工作.

为了能让客户端在脱机或无法连接到服务器时依旧能够工作,需要对数据进行缓存.这时客户端是对缓存的数据进行操作,网络重新连接时再进行数据同步.

2.        提高应用程序的响应速度.

当用户在客户端进行操作时,不用每次从服务器上读取数据,而是读取本地的数据缓存,这样将有效提高应用程序的响应速度.

3.        减轻服务器负担.

客户端定时从服务器上读取”新”的数据,然后与本地数据进行合并,而不是每次读取全部数据,从而减轻网络和服务器的负担.

如何进行数据缓存:

为便于对问题的讨论,把数据库中的表结构简化如下:
方案一:

在服务器上进行数据表的联结(为方便讨论以下把联结后的表称BugDetails表),客户端下载BugDetails保存在DataSet中. BugDetails中既有SeverityID列,又有SeverityName列.为什么要这么设计?SeverityName在Bug列表时需要使用,显示给用户时当然要使用SeverityName,而不是SeverityID; SeverityID在用户编辑Bug时需要用到,因为不能保证Severity表中的SeverityName是唯一的.多个表的联接使得BugDetails字段非常多.

缺点:

1.        数据下载的冗余非常巨大.如每条记录都有SeverityName,但此属性已经包含在Severity表中.实际BugTiger的Bug表的关系远比示例复杂,数据的冗余是非常的大的,冗余数据超过了1/2.

2.        当父表更改时, BugDetails表中大量数据将成为新的数据,客户端需要重新下载.如Severity表中某条记录更改了SeverityName时,与此记录相关的Bug记录将和Severity表重新联接,生成新的BugDetails记录,客户端需要重新下载这些记录.

3.        客户端增加Bug记录时是先添加到数据缓存中的,当与服务器进行数据同步时再上传数据,而不是直接向服务器上传数据.这样做主要是为了在离线时也能增加Bug.对客户端的BugDetails表进行增加记录时,由于BugDetails表字段非常多,增加操作时需要填写的字段很多,
方案二:

在服务器上不进行联接操作,客户端下载各个Table的数据到DataSet后(把数据库中的Table映射成DataSet中的DataTable),再对DataSet中的DataTable进行联接从而产生新的BugDetails表.

注:多个表的合并可以参见《 把一个Table中的某列通过表关系加到另外一个Table中》http://bbs.smartclient.com.cn/topic.aspx?topicid=95

缺点:

1. 需要从多个DataTable生成BugDetails,这个过程涉及的DataTable如果较多时,十分复杂.

2. 任意一张表的数据变化都将导致BugDetails表的重新构建.

方案三:

在客户端增加一个小型的数据库,把服务器上的数据存储到客户端的数据库上.

缺点:

需要维护和操作两个数据库
原文地址:https://www.cnblogs.com/daitengfei/p/449316.html