[已解决问题] sql server 中表的约束的优先级问题...急!
提问时间: 2008-09-05 15:38
悬赏分:50 浏览:206 次

请各位哥哥,叔叔,伯伯慢慢看我的问题。小鱼在此先谢关注问题的人!

我的项目中要动态的生成表,表结构,表关系还有表中的信息。。这些都是从XML里面解析得到的,如下面的记录表关系的XML片段:<Reference KeyField="MZT006" KeyTable="MZT002" RefField="MZF002" RefTable="MZT001" /><Reference KeyField="MZF010" KeyTable="MZT003" RefField="MZT008" RefTable="MZT002" />

通过上面的这两个属性信息可以得到这三张表之间的约束关系:MZT003(PK)->MZT002(FK) MZT002(PK)->MZT001(FK)  接下来因为要在MZT001等这三张中插入解析出来的数据 就要按照约束的优先级来一条条的插  否则执行不了。。。。。

问题就是因为传递的表关系可能很复杂,插入数据的时候又必须按照约束关系来,必须从最高的主键表开始插起  否则行不通(小鱼试过N此了) 

所以:用什么方法能够把这些表的关系排序出来啊!!!

提问者:西下普 - 初学一级
所有回答(1)

我想你之所以要排序,是希望能顺畅的将若干有“约束”关系的数据插入已经含有约束的各表格中。这个问题貌似不简单。这与进程间“资源竞争”颇有相似之处。

建议使用 k 叉树,而优先插入的表,就是树的叶节点。你所示范的关系表达为树就是

    MZT003(PK)->MZT002(FK)->MZT001(FK)

那么你在树建立好之后,做的事情如下:

    1,保证没有“回旋树”,或者类似“死锁”的情况发生,否则你的问题该无解了吧。比如(注意最后的节点就是最前的节点)

     MZT003(PK)->MZT002(FK)->MZT001(FK)->MZT003(PK)

    2,插入数据时,由叶节点为最高优先级进行插入;或者,插入父节点 A 之前,必须保证 A 的子节点已经全部完成了插入操作。如此递归!

 

补充:

    是不是我说的太靠普了?或者说一个一对多的有向图。一个父节点可以有多个子节点,一个子节点可以有多个父节点(可以仿照链表实现)。

         A    A1

        /   \ /

       B    C

      / \   / \

     D E  F G

    B 为 A 的子节点,C 为 A,A1的子节点…… 上图中,只有 D、E、F、G完成了插入等操作,才能轮到B、C插入,最后是A、A1 实际的图肯定比这个复杂,重要的是优先权计算方式。

    你可以:

       1、首先就已有的约束关系,建议一个完整的图。

       2、就当前你要进行的批量操作,对完整图进行“截图”,取出当前涉及到的各节点(表)。

       3、从子节点开始依次插入。

       4、搞定。


最后顺便提一下,不是我爱抱怨,博问“回答”是支持html等样式了。可是评论的时候又丢失了空格。我是反映去呢,还是默许它呢!唉!


3个月前   回答者:陛下 - 老鸟四级
评论
3个月前   西下普 :
这么复杂啊???K叉树是什么???
谢谢给出解决思路,非常感谢。 我再慢慢研究下,我哭。。。。。

3个月前   陛下 :
是不是我说的太靠普了?或者说一个一对多的有向图。一个父节点可以有多个子节点,一个子节点可以有多个父节点(可以仿照链表实现)。
A A1
/ \ /
B C
/ \ / \
D E F G
B 为 A 的子节点,C 为 A,A1的子节点……
上图中,只有 D、E、F、G完成了插入等操作,才能轮到B、C插入,最后是A、A1
实际的图肯定比这个复杂,重要的是优先权计算方式。

你可以:
1、首先就已有的约束关系,建议一个完整的图。
2、就当前你要进行的批量操作,对完整图进行“截图”,取出当前涉及到的各节点(表)。
3、从子节点开始依次插入。
4、搞定。
   您需要登录以后才能回答!
 

我要提问

我的问题


快到期问题



> 问题排行榜

相关内容

相关链接