一个集成系统中,需要多个库的数据合成,大家觉得如何设计主键及如何让数据汇总最为合适
SQL-SERVER2000数据库 VC++开发
一套管理系统,假设是仓库管理系统,有5个地方不同的公司部门使用,每个地方有自己的系统和数据库服务器,是放在各个地方的内网中的.
这5个部门之间是没有联网起来的
在总部,也安装该系统.想把5个不同地方的数据汇总起来,便于在总部的查询。总部与各地方的分部门是只能通过Internet联接的。
1、大家觉得如何设计数据库主键好?
2、每当有各个部门有数据更新后,如何及时更新到总部数据库服务器中去?
我现在的设计思路:
1、所有主键设计成varchar型的,在前面加部门编号的前缀。例如上海的部门用SH_0001,SH0002这样,这样才能汇总后数据不会有重复的键,但后面的那个0001如何生成好了?
2、各个地方部门有数据更新后,(1)将更新的数据即时写到总部服务器中,但如果网络断开的情况会比较麻烦。(2)将更新的数据写入本地的一个数据表中,记录更新的记录的表名,记录ID号,是插入还是删除还是修改。然后一段时间后去读这个表让更新的数据写到总部服务器。
问题点数:100、回复次数:20Top
1 楼z_l(等你)回复于 2006-05-04 01:54:52 得分 0
"……但后面的那个0001如何生成好了?"
不懂这句话什么意思?
当然每个部门的数据都会有备份的Top
2 楼zlp321002(Life Is Good,Let's Shine)回复于 2006-05-04 06:22:08 得分 0
--"……但后面的那个0001如何生成好了?"
可以用程序,生成序号
--少量表数据的更新,可以用数据库同步方式.或者采用。(2)将更新的数据写入本地的一个数据表中Top
3 楼jwt1982(叛逆者)回复于 2006-05-04 07:50:32 得分 100
如果网络条件不能满足
请使用增量包的方式。既客户端导出,通过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号,是插入还是删除还是修改。然后一段时间后去读这个表让更新的数据写到总部服务器。
这个,我没明白楼主意思呵呵Top
4 楼cql0007(南方过客 )回复于 2006-05-04 10:01:24 得分 0
多谢各位的回答了
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号,是插入还是删除还是修改。然后一段时间后去读这个表让更新的数据写到总部服务器。
我的意思是分部的数据库有任何一条更新记录,既然由于网络问题不能马上即时更新到总部数据库去后,就要把这些更新的记录先写在本地表中储存下来了,到时再一起根据这些记录下来的数据更新记录一起更新到总部去了。
但这样的做法就导致在分部的程序中,每一个操作数据库的地方例如每次插入一条新记录都要再写一条记录进我的记录更新表,这样程序会导致麻烦很多
麻烦各位再帮忙想想了,呵呵,我也不知表达清楚我的意思没有了Top
5 楼jwt1982(叛逆者)回复于 2006-05-04 12:11:51 得分 0
生成0001很容易
right('0000'+你的编号,4)生成的就是你需要的四位流水
-------------------------------------------------------
2、分部的数据更新是比较大的,常常有新的数据插入的。不知有没有直接的数据库操作工具可用,不用让程序来担此工作而由数据库直接去控制。我只知道象DB2有数据同步工具,两个数据库设置好对应关系后,其中一个数据库有数据变动都会自动让另外一个数据库也跟着变动,但我只用过那样的两个单库对应的,就是A数据库始终与B数据库里的内容完全是一样的。象这种将5个库的内容汇总到一个库中,在SQL-SERVER中不知有什么好工具没有。
多库汇总,SQL里我没有什么好办法,基于这种程序,我都是在程序端来处理
---------------------------------------------
3、将更新的数据写入本地的一个数据表中,记录更新的记录的表名,记录ID号,是插入还是删除还是修改。然后一段时间后去读这个表让更新的数据写到总部服务器。
我的意思是分部的数据库有任何一条更新记录,既然由于网络问题不能马上即时更新到总部数据库去后,就要把这些更新的记录先写在本地表中储存下来了,到时再一起根据这些记录下来的数据更新记录一起更新到总部去了。
但这样的做法就导致在分部的程序中,每一个操作数据库的地方例如每次插入一条新记录都要再写一条记录进我的记录更新表,这样程序会导致麻烦很多
这个问题,你可以使用导出来处理,比方说程序中导出需要的数据,然后把这个文件上传回总部,由总部的程序负责接收,并分析后导到总部数据库中。Top
6 楼cql0007(南方过客 )回复于 2006-05-04 12:45:24 得分 0
多谢jwt1982(飞星)
生成0001很容易
right('0000'+你的编号,4)生成的就是你需要的四位流水
这里问题是我如何取得最后一条记录的ID号了
如果我的记录里ID有:SH_1,SH_2,SH_11,SH_3,SH_105
里面应该SH_105是最大也是最后一条记录,可我如何排序取出这条记录了?如果直接按string的ASC排序的话,是得不到这个结果的
Top
7 楼jwt1982(叛逆者)回复于 2006-05-04 13:26:40 得分 0
呵呵,生成0000系列的字符就不是了啊如果使用了right('0000'+你的编号,4)结果就是sh_0001了呵呵Top
8 楼jwt1982(叛逆者)回复于 2006-05-04 13:28:44 得分 0
编号:='SH_'+right('0000'+153,4)
='SH_0153'
Top
9 楼cql0007(南方过客 )回复于 2006-05-04 14:44:31 得分 0
惭愧。我还是没有理解你的意思了
截取字符串的意思我明白。
假设数据库中有记录:
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记录就不正确了Top
10 楼jwt1982(叛逆者)回复于 2006-05-04 15:09:04 得分 0
上海的部门用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也可以
这是两个思路当然还有其他的办法的
Top
11 楼cql0007(南方过客 )回复于 2006-05-04 16:02:53 得分 0
抱歉,我没表达清楚我的意思,我的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了?我现在最想了解的是这个问题了。
非常感谢老兄的关注了,再次感谢!
Top
12 楼jwt1982(叛逆者)回复于 2006-05-05 08:52:15 得分 0
我写了一个7位的,当然你可以更多一些
select max(right('0000000'+substring(colA,charindex('_',colA)+1,len(colA)),7)) from table1
这个得到的就是最大的数字了,别忘记转换以下,这样得到的是字符,如何转换成数字,并+1就不用再说了吧?Top
13 楼jwt1982(叛逆者)回复于 2006-05-05 08:59:37 得分 0
不过老实说,这样运算,等数据量大了的话,会很慢Top
14 楼cql0007(南方过客 )回复于 2006-05-05 10:37:14 得分 0
多谢老兄的热心了.
数是可以取出来了,不过这样写数据量大了可能是会很慢,而且位数写死在这里也总觉得有不适的地方.这个贴都结给老兄了.
我再多出100分多开个贴,老兄再帮我想想这个问题如何解决好?
现在因为在分部才会有不停的写入记录操作,而在总部不会有插入记录的,只有查询的.
我想先把分部的操作弄简单点.
我想在各分部的ID就按自己的递加(ID也为字符型的,因为考虑到前期总部用的程序系统和分部的一样的系统,所以分部也只能把ID定为字符型)
SH 表
ID NAME
1 张三
2 张三
3 张三
11 张三
然后向总部汇总的时候,再把ID加前缀SH_往总部传
在分部是需要不停的写入记录的,我想在分部的ID就有字符型的1,2,3,4,11这样的,取了最大的再加1写进去. 这样会不会快点?这样的语法要怎么写才会比上面的那种会运算快了?
而且,另外一个问题,如果上传上去,表的主键改为前面加SH_的前缀了,那那些跟这个表关联的记录怎么去找这个主键?
或者还有什么别的好办法解决了?谢谢Top
15 楼lbkbox(遗忘的诺言)回复于 2006-05-05 20:34:36 得分 0
我想楼主的问题要根本不是什么主键的问题,而是数据采用什么方式整合;用什么方式传输。怎么样处理大容量数据等等一系列这方面的问题。年来楼主仅仅从一个程序同的角度做设计。Top
16 楼cql0007(南方过客 )回复于 2006-05-06 11:06:59 得分 0
呵呵,应该确实是关键问题是以后的数据整合了.
我想总部与分部都采用同一个程序,现在写分部的程序的时候,如果键的设计(如类型)到时满足不了以后的数据汇总后要能继续不做修改也能使用这套系统就麻烦了.Top
17 楼simonhehe(流氓会武术,谁也挡不住)回复于 2006-05-06 23:34:31 得分 0
upTop
18 楼jwt1982(叛逆者)回复于 2006-05-08 13:53:45 得分 0
我想总部与分部都采用同一个程序,现在写分部的程序的时候,如果键的设计(如类型)到时满足不了以后的数据汇总后要能继续不做修改也能使用这套系统就麻烦了.
--------------------------------
没明白,其实无所谓你主键内容如何,只要你是唯一的,那么就完全足够了。
总部和分布肯定没有问题,毕竟你主键都是唯一的无论在什么地方Top
19 楼cql0007(南方过客 )回复于 2006-05-10 20:19:25 得分 0
先结贴,现在有别的事忙了,忙完再继续请教这个问题了Top
20 楼kenpa(大海无量)回复于 2006-10-12 12:12:36 得分 0
markTop




