SQL-SERVER2000数据库  VC++开发
一套管理系统,假设是仓库管理系统,有5个地方不同的公司部门使用,每个地方有自己的系统和数据库服务器,是放在各个地方的内网中的.这5个部门之间是没有联网起来的在总部,也安装该系统.想把5个不同地方的数据汇总起来,便于在总部的查询。总部与各地方的分部门是只能通过Internet联接的。1、大家觉得如何设计数据库主键好?
2、每当有各个部门有数据更新后,如何及时更新到总部数据库服务器中去?
我现在的设计思路:
1、所有主键设计成varchar型的,在前面加部门编号的前缀。例如上海的部门用SH_0001,SH0002这样,这样才能汇总后数据不会有重复的键,但后面的那个0001如何生成好了?2、各个地方部门有数据更新后,(1)将更新的数据即时写到总部服务器中,但如果网络断开的情况会比较麻烦。(2)将更新的数据写入本地的一个数据表中,记录更新的记录的表名,记录ID号,是插入还是删除还是修改。然后一段时间后去读这个表让更新的数据写到总部服务器。

解决方案 »

  1.   

    如果网络条件不能满足请使用增量包的方式。既客户端导出,通过FTP或其他模式上传到总部,由总部执行汇总。我所开发过的程序这个工作都是自己写的程序完成的,这样可以对数据进行分析。我现在的设计思路:
    1、所有主键设计成varchar型的,在前面加部门编号的前缀。例如上海的部门用SH_0001,SH0002这样,这样才能汇总后数据不会有重复的键,但后面的那个0001如何生成好了?
    -------------------------------------------------------------------------
    这个不是问题吧?0001有很多种办法生成比方说select count(*) as count from table
    count+1就是你新的序号。
    select top 1 colA from table order by colA desc然后对这个字段内容分析,截取后+1就可以了。
    --------------------------
    2、各个地方部门有数据更新后,(1)将更新的数据即时写到总部服务器中,但如果网络断开的情况会比较麻烦。
    -----------------
    这个问题,如果网络断开,那是没有办法的事情,想及时查询,不可能,只能等网络通了再说
    -----------------------------------------
    。(2)将更新的数据写入本地的一个数据表中,记录更新的记录的表名,记录ID号,是插入还是删除还是修改。然后一段时间后去读这个表让更新的数据写到总部服务器。这个,我没明白楼主意思呵呵
      

  2.   

    多谢各位的回答了1、主键设成SH_1,SH_2,SH_11,SH_105这样的,当用order by 对主键的ID字段进行排序取最后一条记录时,会取到SH_2为最后一条啊,不会取到SH_105为最后一条,这样会导致取最后一条记录再截取后+1会出错了。
    2、分部的数据更新是比较大的,常常有新的数据插入的。不知有没有直接的数据库操作工具可用,不用让程序来担此工作而由数据库直接去控制。我只知道象DB2有数据同步工具,两个数据库设置好对应关系后,其中一个数据库有数据变动都会自动让另外一个数据库也跟着变动,但我只用过那样的两个单库对应的,就是A数据库始终与B数据库里的内容完全是一样的。象这种将5个库的内容汇总到一个库中,在SQL-SERVER中不知有什么好工具没有。3、将更新的数据写入本地的一个数据表中,记录更新的记录的表名,记录ID号,是插入还是删除还是修改。然后一段时间后去读这个表让更新的数据写到总部服务器。我的意思是分部的数据库有任何一条更新记录,既然由于网络问题不能马上即时更新到总部数据库去后,就要把这些更新的记录先写在本地表中储存下来了,到时再一起根据这些记录下来的数据更新记录一起更新到总部去了。但这样的做法就导致在分部的程序中,每一个操作数据库的地方例如每次插入一条新记录都要再写一条记录进我的记录更新表,这样程序会导致麻烦很多麻烦各位再帮忙想想了,呵呵,我也不知表达清楚我的意思没有了
      

  3.   

    生成0001很容易right('0000'+你的编号,4)生成的就是你需要的四位流水
    -------------------------------------------------------
    2、分部的数据更新是比较大的,常常有新的数据插入的。不知有没有直接的数据库操作工具可用,不用让程序来担此工作而由数据库直接去控制。我只知道象DB2有数据同步工具,两个数据库设置好对应关系后,其中一个数据库有数据变动都会自动让另外一个数据库也跟着变动,但我只用过那样的两个单库对应的,就是A数据库始终与B数据库里的内容完全是一样的。象这种将5个库的内容汇总到一个库中,在SQL-SERVER中不知有什么好工具没有。多库汇总,SQL里我没有什么好办法,基于这种程序,我都是在程序端来处理
    ---------------------------------------------
    3、将更新的数据写入本地的一个数据表中,记录更新的记录的表名,记录ID号,是插入还是删除还是修改。然后一段时间后去读这个表让更新的数据写到总部服务器。我的意思是分部的数据库有任何一条更新记录,既然由于网络问题不能马上即时更新到总部数据库去后,就要把这些更新的记录先写在本地表中储存下来了,到时再一起根据这些记录下来的数据更新记录一起更新到总部去了。但这样的做法就导致在分部的程序中,每一个操作数据库的地方例如每次插入一条新记录都要再写一条记录进我的记录更新表,这样程序会导致麻烦很多这个问题,你可以使用导出来处理,比方说程序中导出需要的数据,然后把这个文件上传回总部,由总部的程序负责接收,并分析后导到总部数据库中。
      

  4.   

    多谢jwt1982(飞星) 
    生成0001很容易right('0000'+你的编号,4)生成的就是你需要的四位流水这里问题是我如何取得最后一条记录的ID号了
    如果我的记录里ID有:SH_1,SH_2,SH_11,SH_3,SH_105
    里面应该SH_105是最大也是最后一条记录,可我如何排序取出这条记录了?如果直接按string的ASC排序的话,是得不到这个结果的
      

  5.   

    呵呵,生成0000系列的字符就不是了啊如果使用了right('0000'+你的编号,4)结果就是sh_0001了呵呵
      

  6.   

    编号:='SH_'+right('0000'+153,4)='SH_0153'
      

  7.   

    惭愧。我还是没有理解你的意思了截取字符串的意思我明白。假设数据库中有记录:
    ID      Name
    SH_1    张三
    SH_11   张三
    SH_2    张三
    SH_5    张三我现在再写入一条记录,先读出最后的ID数,再截出后面的字符再加1来处理
    select top 1 ID from table order by ID desc问题是这样的查询后得到的是ID = SH_5这条记录啊,而得不到SH_11,SH_11才应该是里面最大的记录了。这样我取出来的最大ID记录就不正确了
      

  8.   

    上海的部门用SH_0001,SH0002你主键不是要生成如上么?怎么变成SH_1了?'SH_'+right('0000'+153,4) 就是生成SH_0153这种类似的主键地。主键型如SH_0153,你自然就可以获得了啊。
    ------------------------------------------
    另外,你目前的这个
    SH_1    张三
    SH_11   张三
    SH_2    张三
    SH_5    张三
    可以使用select count(*) from table来获得记录数,在这个数字上+1也可以这是两个思路当然还有其他的办法的
      

  9.   

    抱歉,我没表达清楚我的意思,我的SH_0001只是想表达后面是个数字了。如果我写死几位数,当记录数超过那个数的位数时,就会带来麻烦的了,如果开始就把后面的0000001数字定的过长的话,又觉得如果那个表记录数很少时又浪费空间。我想直接由SH_1,SH_2这样累计加下去可能更合理些了
    这样数据库里的记录就会有:
    SH_1      张三
    SH_11     张三
    SH_200    张三
    SH_50     张三
    SH_1111   张三等这样的记录。我想的就是如何方便点直接取出在库中最后一条记录出来然后进行计算,求出新的ID号后再写入数据库中------------------------------------------------
    可以使用select count(*) from table来获得记录数,在这个数字上+1也可以
    用求记录和的话,如果库里的ID是不继续的,例如被删除的很多记录后,就会求出的不对了。例如如果库里就只有上面的5条记录,如何才取出最大的ID是SH_1111了?我现在最想了解的是这个问题了。
    非常感谢老兄的关注了,再次感谢!
      

  10.   

    我写了一个7位的,当然你可以更多一些select max(right('0000000'+substring(colA,charindex('_',colA)+1,len(colA)),7)) from table1这个得到的就是最大的数字了,别忘记转换以下,这样得到的是字符,如何转换成数字,并+1就不用再说了吧?
      

  11.   

    多谢老兄的热心了.数是可以取出来了,不过这样写数据量大了可能是会很慢,而且位数写死在这里也总觉得有不适的地方.这个贴都结给老兄了.我再多出100分多开个贴,老兄再帮我想想这个问题如何解决好?
    现在因为在分部才会有不停的写入记录操作,而在总部不会有插入记录的,只有查询的.
    我想先把分部的操作弄简单点.
    我想在各分部的ID就按自己的递加(ID也为字符型的,因为考虑到前期总部用的程序系统和分部的一样的系统,所以分部也只能把ID定为字符型)
    SH 表
    ID  NAME
    1   张三
    2   张三
    3   张三
    11  张三然后向总部汇总的时候,再把ID加前缀SH_往总部传在分部是需要不停的写入记录的,我想在分部的ID就有字符型的1,2,3,4,11这样的,取了最大的再加1写进去. 这样会不会快点?这样的语法要怎么写才会比上面的那种会运算快了?而且,另外一个问题,如果上传上去,表的主键改为前面加SH_的前缀了,那那些跟这个表关联的记录怎么去找这个主键?或者还有什么别的好办法解决了?谢谢