2014-09-29 62 views
0

我有一个java应用程序,它使用Carbanado与Oracle数据库进行交互。通过应用程序获取表之间的父子关系

我想知道所有表中的依赖关系图(其中依赖关系是外键约束),以通过应用程序进行进一步处理。

举个例子:

Table A defines dependency over Table B and Table C (means Table A has foreign key constraint on Table B and Table C). 
Table B defines dependency over Table C and Table D. 

我想是这样的(这将是真实的情景2 d图)。

Table A=>Table B=>Table C=>Table D 

这给出一个想法,在表d行可以在表A,B和C对应的删除行

所有实体类实现一个共同的接口(Storable)和依赖性之前首先删除用@Join注解。加载所有的类并使用广泛的反射似乎是一种方法来做到这一点。

>>Load all classes. 
>>Create 2D matrix (adjacency matrix) and populate it by going through each class and extracting/processing @Join annotation. 
>>Put 0/1 at suitable position. 
>>Final matrix will be showing the dependencies. 
>>Perform any topological operation. 

有什么更好的办法吗?

PS:

附加信息

  1. 只给你一个想法,进一步的处理将创建数据的快照(在XML/JSON)格式按依赖。
  2. 依赖关系图需要以正确的顺序删除记录。

谢谢!

回答

1

也许不是正是你正在寻找什么,而是你可以查询ALL_CONSTRAINTS(或USER_CONSTRAINTS)和ALL_CONS_COLUMNS建立依赖关系图的邻接表。

举个例子,像东西将从返回表的外键约束:

SELECT uc.OWNER, uc.CONSTRAINT_NAME, 
     uc.TABLE_NAME from_table, 
     acc.TABLE_NAME to_table 
    FROM USER_CONSTRAINTS uc LEFT JOIN ALL_CONS_COLUMNS acc 
    ON uc.R_CONSTRAINT_NAME = acc.CONSTRAINT_NAME 
    AND uc.OWNER = acc.OWNER 
    WHERE uc.CONSTRAINT_TYPE = 'R'; 

鉴于模式:

CREATE TABLE A(N NUMBER(2), PRIMARY KEY (N)); 
CREATE TABLE B(N NUMBER(2) REFERENCES A(N)); 
CREATE TABLE C(N NUMBER(2) REFERENCES A(N), M NUMBER(2) REFERENCES A(N)); 

它会产生:

OWNER CONSTRAINT_NAME FROM_TABLE TO_TABLE 
SYLVAIN SYS_C008530  C   A 
SYLVAIN SYS_C008529  C   A 
SYLVAIN SYS_C008528  B   A 
+0

我没有看到显示外键约束。我看到的只是FROM和TO表中的系统表。难道我做错了什么? – instanceOfObject 2014-10-10 00:43:21

+0

它似乎没有返回用户约束,并且只在TABLE_NAME和R_TABLE_NAME中返回WRM $ _SNAPSHOT和WRM $ _DATABASE_INSTANCE。 – instanceOfObject 2014-10-10 19:46:42