2012-05-07 58 views
0

我有兩個服務:TeacherService和PupilSerivce共享相同的數據庫。他們之間的關係是一對多的,即一個教師可以有很多學生,每個學生只有一個教師。如何分離SOA中的數據庫實體依賴關係?

CREATE TABLE `test`.`teacher` { 
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', 
`name` varchar(40), 
PRIMARY KEY (`id`) 
} ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `test`.`pupil` { 
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', 
`teacher_id` bigint unsigned NOT NULL COMMENT 'teacher id', 
PRIMARY KEY (`id`), 
CONSTRAINT `fk_teacher_id` FOREIGN KEY (`teacher_id`) REFERENCES `teacher`(`id`) ON DELETE CASCADE 
} ENGINE=InnoDB DEFAULT CHARSET=utf8; 

,你可以想像,我有兩個實體TeacherVO和PupilVO表示在我的Java代碼的數據庫表。

問題是,TeacherService和PupilSerivce都在單獨的進程中運行並與消息進行通信,我不希望它們彼此之間存在任何編譯依賴關係。然而,增加了新的pupile當方法是這樣的:

PupilService.addNewPupil(long teacherId) { 
    if (isValidTeacher(teacherId) { 
     // add the pupile 
    } 
} 

這需要PupileService具有TeacherVO的知識,以便它可以做一些驗證,但TeacherVO是TeacherService包!

刪除此類依賴關係的最佳做法是什麼?

有一些方法我認爲:

  1. 創建validateTeacher消息,然後PupilService將此消息發送到TeacherService並等待響應。但是,如果我有進一步的要求,比如搜索名字老師,那麼我必須創建另一條消息,最終導致消息被炸燬。直接搜索數據庫是一種更爲靈活和有效的方式,但它引入了依賴性。

  2. 如果teacher_id無效,則不執行任何檢查並捕獲由外鍵導致的SQL異常。然而,這不能解決我可能有進一步要求的問題。

我認爲這應該是SOA架構中的共同問題,以防萬一多個服務共享相同的數據庫。我研究了一段時間,但沒有獲得任何有價值的東西

+0

解耦是關於減少代碼依賴關係,而不是破壞實體之間的基本關係。你是一個沒有學生的老師,你能成爲一個沒有老師的學生嗎?不,不,我想你可能想查找依賴注入,但你需要回顧一下解耦是什麼,而不是如何去做。 –

+0

是的,我終於意識到這是我的數據結構中的本質。 –

回答

1

我同意託尼霍普金森,你試圖做的事情根本上是不健全的。你不能分開老師和學生的關注。