2014-02-28 84 views
0

我正在尋找一個解決方案,反向工程的DB沒有外鍵(真的!20歲的DB ...)。目的是完全做到這一點,而無需額外的應用程序或持久性邏輯,只需分析數據即可。 我知道這會有點困難,但應該是可能的,如果數據本身esp。也分析了PKs。反向工程的DB沒有外鍵

回答

1

我不認爲你的問題有一個通用的解決方案。希望有一些可以引導你的表/列的命名約定。您可以查詢系統表以嘗試並確定發生了什麼(Oracle:user_tab_columns,SQL Server:INFORMATION_SCHEMA.COLUMNS等)。祝你好運!

1

沒有進攻,但如果這讓你感到意外,你不可能在數據庫中很長時間。

我打算假設通過「反向工程」,你只是想填充外鍵,而不是轉向NoSQL或其他東西。這可能是一個有趣的項目。這裏是我將如何去做:

看看所有的SELECT語句,看看如何連接到一個表。 20年前,這將是一個WHERE條款,但當然,它比這更復雜。使用相關的子查詢和帶有FROM子句的UPDATE語句,無論如何意味着某種連接。你必須能夠弄清楚所有的事情。如果你想正式做到這一點(你可以直觀地理解所有這些東西),你可以列出在表間連接中使用組合的次數。按成對錶格列出它們,而不是連接中所有表格的集合。如果一方是主鍵,那麼這些將是候選外鍵。另一方獲得外鍵。有多列PK,但你可以弄清楚(所以如果主鍵的另一面在兩個不是外鍵的表中)。如果一列最終指向兩個不是合適的外鍵的不同表PK,但可能適合選擇一個表並將其用作目標。

如果你還沒有主鍵,你應該先做。索引,甚至是聚集索引(在Sybase/MSSQL中)並不總是正確的主鍵。無論如何,您可能必須相應地更改主鍵。

收集所有的陳述本身可能具有挑戰性。您可以使用perl/awk將它們從C/Java/PHP/Basic/COBOL程序中解析出來,或者通過監視輸入到服務器來獲取它們。你會想尋找WHERE/JOIN/APPLY等,而不是SELECT。還有很多其他的方法。

+0

沒有冒犯,但你不能在_ETL_很長,如果_my question_驚訝你...... :-)我的意圖是完全沒有持久性邏輯,只通過分析表數據。所以這將是一個啓發式的方法。任務是比較與主鍵相似的列數據。這應該適用於3NF中的數據,但如果模式處於2NF-時將會變得困難。但是,我認爲我們可以用這種方法取得很大的進展,這也是爲什麼我不相信沒有內置啓發式工具的原因。 – Andreas

+0

ETL? ... :)你的問題並不讓我感到驚訝。我多次想過同樣的事情。 – albe