2014-09-29 61 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