首页 新闻 会员 周边

如何设计一个用于记录同步标识的表?

0
悬赏园豆:100 [已解决问题] 解决于 2014-11-13 18:21

背景:目前有一个定时同步的应用,每天定时从一个系统中提取数据到同步到其他系统。现在的做法是,1、在业务表上新建了触发器,有业务新增时,往同步标识表里新增一条数据(ID、Flag=7)2、业务发生变化也往同步标识表插入一条数据(ID、Flag=8),3、同步程序完成数据同步后修改标识(ID、Flag=9)表示完成。问题主要有:1、同步标识表有2个字段(联合主键)当初的设计不合理,现在表里的数据很多了,不停的对这个表进行修改速度非常慢!2、经常有主键唯一性问题的报错。新手,求高手指导如何设计同步表?

小叶啊的主页 小叶啊 | 初学一级 | 园豆:68
提问于:2014-11-04 10:25
< >
分享
最佳答案
1

个人建议:如果你程序写的严谨的话,再每张表增加一个lastupdatedate(最后修改日期)字段。获取你本地需要同步数据的每张表的最大lastupdatedate日期的数据。将服务器上所有大于lastupdatedate数据可以分批抓取,比如一次抓取100条。每次抓取100条后,原封不动将获取的数据插入本地。再次查询最后本地最后一条的lastupdatedate字段的值。再去抓取大于本地表数据的。直到所有数据获取完毕。建议可以适当的用假死循环如

bool isupdae=true;

int pageSize=100;

while(isupdae)

{

string sql="select max(lastupdatedate) as  lastupdatedate from A";

DateTable dt=dbHelp.GetDataTable(sql);

DateTime lastupdatedate=dt.rows["lastupdatedate "]==DBNull.Value?datetime.now:convert.datetime(dt.rows["lastupdatedate "]);

//获取服务器数据,具体看你怎么返回服务器数据啦,lastupdatedate:本地某表最后一条修改记录的修改日期。pageSize:每次向服务器获取数据条数,主要解决大数据一次拉取卡死

 object dataObj=webAPI.getData(lastupdatedate,pageSize);

  if(dataObj==null)//数据同步完毕

{

isupdae=false;

}else{

    //处理你获取到的数据,插入到本地

   isupdae=true;

}

}

此方法即使你下次换个客户端,同步依然能获取到你所有数据啊,比你修改服务器标记强多了。 

 

 

兄弟核心代码思路都给你啦,打赏点吧

收获园豆:55
沦落的伤心人 | 菜鸟二级 |园豆:208 | 2014-11-04 16:32
其他回答(5)
0

1、你总不会拿ID来当同步表的主键吧?另外建一个主键(一个就够了,不用两个),

类型GUID,自动生成,你也不需要去维护。

2、Flag=9的数据有必要保留吗?

从你提供的信息只看出这些来,可能其他高手可以看出更多吧....

收获园豆:10
爱编程的大叔 | 园豆:30839 (高人七级) | 2014-11-04 10:40
0
收获园豆:10
dudu | 园豆:30943 (高人七级) | 2014-11-04 11:05
0

提供另外一种思路:我不关心同步的过程,我只在同步完成后,通过两个表之间的差异来生成标识写入到日志表。

收获园豆:10
幻天芒 | 园豆:37175 (高人七级) | 2014-11-04 11:23
0

能不能利用数据库自己的特性,比如mysql就支持主从同步功能。

另外,感觉Flag=9没必要,同步完把记录删除了就行了。

收获园豆:10
会长 | 园豆:12401 (专家六级) | 2014-11-04 13:51
0

触发器。。。,一般业务表会有创建时间这种字段吧,每次扫这个字段同步就好了,何必还多存一次

收获园豆:5
draculav | 园豆:734 (小虾三级) | 2014-11-04 13:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册