java - 通过应用获取表之间的父子关系

标签 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

这给出了一个想法,即先删除表 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:

其他信息:

  1. 仅供您引用,进一步处理将根据依赖项创建数据快照(XML/JSON 格式)。
  2. 需要依赖图才能按正确的顺序删除记录。

谢谢!

最佳答案

也许不完全是您要查找的内容,但您可以查询 ALL_CONSTRAINTS (或USER_CONSTRAINTS)和ALL_CONS_COLUMNS构建依赖图的邻接表。

举个例子,类似将返回外键约束的fromto表:

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/

相关文章:

java - 手动触发 Quartz 作业

MySQL 数据库 - 在用户之间共享内容的表

mysql - 如何处理关系数据库中的金融交易?

来自不同表的多列的 SQL IN 运算符

php - 我应该使用存储过程来执行复杂的 SELECT 查询吗?

java - id 中的多个字段 - Webdriver - Java

java - 在 Java 中将整数数组的元素转换为单个整数

java - 无法在 WebSphere Liberty 配置文件中为多个应用程序配置 log4j

MYSQL查找相关查询

sql - 如何将每行 SUM() 转换为另一列