Page 152 - 《软件学报》2020年第11期
P. 152

3468                                Journal of Software  软件学报 Vol.31, No.11, November 2020

                    b)   T a 对 T b 的调用链依赖度定义为 D Trace (T a →T b ),等于同时操作 T a ,T b 这两张表的调用链数量占操作 T a
                        的调用链数量的比例.
                                                         |Trace ( )T ∩ Trace ( ) |T
                                            D Trace (T →  a  T b ) =  a  b                           (12)
                                                             |Trace ( ) |T a
                    c)   T a 对 T b 的场景依赖度定义为 D Scenario (T a →T b ),等于同时操作 T a ,T b 这两张表的场景数量占操作 T a 的场
                        景数量的比例.
                                         D Scenario (T →  a  T b ) =  | Scenario ( )T ∩  Scenario ( ) |T b  (13)
                                                                a
                                                             | Scenario ( ) |T a
                    T a 对 T b 的依赖度可以看作是 T a 对 T b 的“数据依附”关系,依赖度越高,这种依附关系越明显,T a 越倾向于和
                 T b 在一起.但依赖度是双向的,如果 T a 对 T b 的依赖度很高,而 T b 对 T a 的依赖度很低,可以认为 T b 和 T a 有一种“主
                 从”关系,而 T b 与其他多个表之间也可能存在这种“主从”关系.比较典型的例子如图 6 所示,在实验系统
                 JeeSite [30] 中一共有 22 张数据表,sys_log 表负责记录每一次数据操作的日志,对其他数据表(如图中的 sys_user,
                 sys_office 等)的操作都会同步插入一条 sys_log 数据.所以这些数据表会呈现出对 sys_log 表的强依赖,但对
                 sys_log 表的操作却是独立于这些表的.
                                                      sys_user            强依赖
                                                                          弱依赖
                                           sys_role             sys_office
                                                      sys_log

                                           sys_area              sys_dict
                                                        ...

                                     Fig.6   Database table dependency graph around sys_log table
                                           图 6   以 sys_log 表为中心的数据表依赖图

                    为了避免将以 sys_log 表为中心的多个不同子领域的表都划分到一起,只有当满足以下 4 个条件之一时,T a
                 和 T b 才会被归入同一个共享群组.
                    •   条件 1:D SQL (T a →T b )+D SQL (T b →T a )>γ 1 .
                    •   条件 2:D Trace (T a →T b )+D Trace (T b →T a )>γ 2 .
                    •   条件 3:D Scenario (T a →T b )+D Scenario (T b →T a )>γ 3 .
                    •   条件 4:D SQL (T a →T b )+D SQL (T b →T a )+D Trace (T a →T b )+D Trace (T b →T a )>γ 4 并且
                                              D Scenario (T a →T b )+D Scenario (T b →T a )>γ 5 .
                 其中,γ 1 =1.4,γ 2 =1.6,γ 3 =2,γ 4 =2.8,γ 5 =1.
                    根据以上条件,识别出的 x 张共享表被分成 r 个共享群组 G′                ,...,G′ .最后,考虑一种特殊情况,即对于一张非
                                                                   1    r
                 共享表 T c ,如果 T c 无论是在 SQL 级别、调用链级别还是场景级别,只跟一个共享群组 G d 中的表有关联,那么我
                 们倾向于把 T c 和 G d 中的表划分到一起.所以,需要遍历所有非共享表,将只跟一个共享群组有关联的表加入该
                 群组中,得到最终的共享群组 G 1 ,…,G r .
                    (1)  数据表权重矩阵生成
                    根据公式(5)计算 n 张数据表两两之间的关联度,得到 n×n 的对称矩阵 M,矩阵的第 i 行第 j 列元素 m ij 等于
                 Table i 与 Table j 之间的总关联度 C Total (T i ,T j ).显然,m ij =m ji .矩阵 M 对角线上元素值为 1.
                    遍历每个共享群组,针对第 p 个群组 G p 中的共享表 T q ,对矩阵 M 的第 q 行和第 q 列元素做如下调整.
                                                    ⎧ ⎪ max(m iq , ), Tδ 1  i  ∈ G p
                                           m =  qi  m =  iq  ⎨      , i =  1,...,n                   (14)
                                                    ⎪ ⎩ δ ⋅  2  m iq ,         T ∉  i  G p
                 其中,δ 1 =0.9,δ 2 =0.2.
   147   148   149   150   151   152   153   154   155   156   157