通过应用程序获取表之间的父子关系

时间:2014-09-29 22:52:24

标签: java database oracle

我有一个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.

我想要这样的东西(它将是真实场景中的二维图形)。

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

这样可以在删除表A,B和C中的相应行之前先删除表D中的行。

所有实体类都实现了一个公共接口(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. 需要依赖关系图以正确的顺序删除记录。
  3. 谢谢!

1 个答案:

答案 0 :(得分: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