2009-10-01 78 views
1

快速提示:我有19天的時間來解決客戶的問題。通過觸發器進行模式同步的MySQL模式?

背景: 客戶聘請了一位承包商,他吹噓他可以在3個月內獲得一個新的應用程序出門。兩個月和幾天後,我被帶進來,個人被放走;沒有完整的代碼,沒有思想投入到架構中,並且對UI的憎惡。

我有兩個應用程序:一個生產和成熟,另一個需要一些愛。一個有我需要的所有數據,另一個沒有。我正在編寫新的代碼TDD風格,並針對部分受到嚴格限制的SOA基礎結構,該基礎結構涵蓋除數據本身之外的所有問題。如果我有更多的時間,我可以使用liquibase將模式重構爲可憎的碎片(使用你的想象力),但我不... ...所以計劃B如下:

應用程序A(插入|更新|刪除)實體更新AppASchema.FooTable的Foo,它通過後觸發器更新AppBSchema.FooLikeTable,反之亦然。

我知道這是一個瘋狂的想法,但其至少我已經得到了最糟糕的點子,我的擔心是

  1. 可以創建一個無限循環(APPA觸發更新APPB哪些更新APPA)
  2. 沒有高負載,但這基本上將操作數翻倍到n * 2,所以如果我達到MySQL服務器容量的一半,它似乎會像更新索引等基本內容那樣,達到或接近滿容量。
  3. 作爲一個混合的祝福,原始模式設計者製作了所有表InnoDB引擎......這對於性能來說太可怕了,但是這種設置可以確保更高的保持完整性的機會。

我實施觸發器的時間預算是12小時或半年。

回答

1

AppASchema.FooTable和AppBSchema.FooLikeTable 足夠相似您可以將其中一個重新實現爲updatable view?您可能必須創建一些額外的表來存放適用於其中一種應用模式的列。這將比一堆觸發器更容易維護。

如果不是,你必須使用觸發器來實現它,你是對的,你必須非常小心,以確保沒有遞歸觸發器依賴關係。如果有少數表格,它們非常相似,這不會太困難。如果有很多表格或相似點很少,那就需要時間。

+0

傳統模式有一些特殊性,特別是它已被過度/不規範化。例如Property-> Address - > [City,State,Status,Type],它適用於課本,但不適用於真實世界的高負載場景。 – David 2009-10-11 03:08:49

+0

這是一個無賴...與項目的其餘部分祝你好運。 – 2009-10-11 03:15:39

+0

@James我不是Rails的忠實粉絲,但在這種情況下,Rails團隊成員在一週內重新編寫了60%的PHP應用程序,而我自己的另一位開發人員對其bug進行了檢查...至今看起來很嚴密。 – David 2009-10-17 17:47:58