我有兩個服務: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包!
刪除此類依賴關係的最佳做法是什麼?
有一些方法我認爲:
創建validateTeacher消息,然後PupilService將此消息發送到TeacherService並等待響應。但是,如果我有進一步的要求,比如搜索名字老師,那麼我必須創建另一條消息,最終導致消息被炸燬。直接搜索數據庫是一種更爲靈活和有效的方式,但它引入了依賴性。
如果teacher_id無效,則不執行任何檢查並捕獲由外鍵導致的SQL異常。然而,這不能解決我可能有進一步要求的問題。
我認爲這應該是SOA架構中的共同問題,以防萬一多個服務共享相同的數據庫。我研究了一段時間,但沒有獲得任何有價值的東西
解耦是關於減少代碼依賴關係,而不是破壞實體之間的基本關係。你是一個沒有學生的老師,你能成爲一個沒有老師的學生嗎?不,不,我想你可能想查找依賴注入,但你需要回顧一下解耦是什麼,而不是如何去做。 –
是的,我終於意識到這是我的數據結構中的本質。 –