我有一个 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
这给出了一个想法,即先删除表 D 中的行,然后再删除表 A、B 和 C 中的相应行。
所有实体类都实现一个公共(public)接口(interface)(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:
其他信息:
- 仅供您引用,进一步处理将根据依赖项创建数据快照(XML/JSON 格式)。
- 需要依赖图才能按正确的顺序删除记录。
谢谢!
最佳答案
也许不完全是您要查找的内容,但您可以查询 ALL_CONSTRAINTS
(或USER_CONSTRAINTS
)和ALL_CONS_COLUMNS
构建依赖图的邻接表。
举个例子,类似将返回外键约束的from和to表:
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
关于java - 通过应用获取表之间的父子关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26110164/