2010-01-14 48 views
1

我需要同步兩個數據庫。 這些數據庫存儲相同的語義對象,但在兩個數據庫之間物理上不同。使用DTO模式來同步兩個模式?

我打算使用DTO模式均勻化對象表示:

DB ----> DTO ---->映射(getter/setter方法)----> DTO ----> DB

我認爲這是一個更好的主意不是物理同步,每邊使用SQL查詢,我用冬眠來增加一些抽象,並同步對象。

你覺得,這是一個好主意嗎?

+0

我不明白「相同的語義對象,但物理上不同」。這太模糊了。請成爲技術人員。你的意思是「具有相同DDL但內容不同的表」還是你的意思是「具有不同DDL但內容相同的表」?正確的答案很大程度上取決於這個。 – BalusC 2010-01-14 16:00:29

+0

這是相同的語義內容,但DDL是不同的。這是一個M2M(模型到模型)轉換問題。 – Zenithar 2010-01-14 16:07:20

回答

1

這樣做是有可能的ORM數量級比一個精心設計的SQL腳本的順序較慢。這取決於數據庫的大小。

編輯

我想補充的是,決定應取決於兩個模式之間的差異數量,而不是你使用SQL的專業知識。 SQL非常常見,開發人員應該能夠以簡潔的方式編寫簡單的腳本。 SQL的優點是每個人都知道如何運行腳本,但不是每個人都知道如何運行自定義工具(這是我在實踐中遇到的一個問題,如果遷移實際上是由其他人操作的話)。

  1. 對於模式只略有不同(例如名稱,或列值的簡單變換),我會去的SQL腳本。這可能是更緊湊和直接使用和溝通。

  2. 對於主要區別模式,以在不同的表或複雜的邏輯組織從一個模式映射一些值的其它數據,則專用工具可能是有意義的。機會是編寫工具的初始努力更重要,但它可以是創建後的資產。

你也應該考慮非功能方面,如異常處理,錯誤日誌,在較小的交易拆分工作(因爲有太多的數據)等

  1. 在這樣的條件下,SQL腳本確實可能變得「混亂」。如果你有這樣的約束,SQL將需要高級技能,並且往往很難使用和維護。

  2. 這個自定義工具可以發展成一個mini-ETL,它能夠在小事務中分塊工作,很好地管理和記錄錯誤等等。這是更多的工作,並且可以導致成爲一個專用項目。

決定是你的。

+0

每面約90張桌子。 – Zenithar 2010-01-14 16:03:03

+0

但是有多少行? – ewernli 2010-01-18 10:18:39

+0

感謝您的回答。我的情況是,數據太不同了,雙方都是,我首先開發了一個遷移工具。 模式差異是我想使用物理抽象數據的事實。數據量也可以被評估,這取決於。 我目前正在使用Talend軟件研究ETL解決方案,可能會有所幫助。 再次,你的答案。 此致敬禮。 – Zenithar 2010-01-18 17:24:02

1

我已經做到了這之前,我還以爲是2個DB之間映射一個非常堅實的和直接的方式。唯一的缺點是,無論數據庫發生什麼變化,我都必須更新映射邏輯,但通常很簡單。

+0

是的,我也意識到,但我認爲更新hbm文件(通過hibernate同步器)比更新黑暗的sql腳本更容易。 – Zenithar 2010-01-14 16:04:50

+0

「黑暗的SQL腳本」?這是聲明式編程,而不是黑魔法! :) – 2010-01-14 16:31:45

+0

我知道,但從我的角度來看,這不是解決方案。 「黑暗」不是一個好選擇,也許「凌亂」是最好的^^。 我認爲這是一種同步語義對象的好方法,而不是它們的物理表示,這就是爲什麼要使用hibernate來擁有對象。 但我需要建議做出決定,這就是爲什麼我在這裏問這個問題(當然哪個答案不是42)。 – Zenithar 2010-01-14 17:38:38

2

以上對Hitchhiker's Guide的很好的參考。

我的兩分錢。你需要考慮使用正確的工具來完成這項工作。儘管編寫自定義代碼來解決這個問題非常有必要,但有許多工具已經爲您做了這些工作,將源代碼映射到目標,執行從屬性到屬性的自定義轉換,並且通過更快的上市時間提供更多的可能。

看看ETL工具。我不熟悉開源社區中可用的工具,但如果你朝這個方向傾斜,我相信你會找到一些。您可能會看到的其他工具是:Informatica,Data Integrator,SQL Server Integration Services,如果您要處理空間數據,那麼還有另一個稱爲Alteryx的工具。

Tim