我有两个服务:TeacherService 和 PupilSerivce,它们共享同一个数据库。它们之间的关系是一对多的,即一位老师可以有很多学生,而每个学生只有一位老师。
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 都在单独的进程中运行并与消息通信,我不希望它们相互之间有任何编译依赖。然而,当添加一个新的学生时,该方法看起来像:
PupilService.addNewPupil(long teacherId) {
if (isValidTeacher(teacherId) {
// add the pupile
}
}
这需要 PupileService 了解 TeacherVO,因此它可以进行一些验证,但 TeacherVO 在 TeacherService 包中!
消除这种依赖的最佳实践是什么?
我想到了一些方法:
创建一条 validateTeacher 消息,然后 PupilService 将此消息发送给 TeacherService 并等待响应。但是,如果我有进一步的要求,例如搜索有名字的老师,那么我必须创建另一条消息,最终导致消息爆炸。直接搜索数据库是一种更灵活、更高效的方式,但会引入依赖。
如果teacher_id 无效,不要做任何检查和捕获由外键引起的SQL 异常。但是,这并不能解决我可能有进一步要求的问题。
我认为如果多个服务共享同一个数据库,这应该是 SOA 架构中的一个常见问题。我做了一段时间的研究,但没有得到任何有价值的东西。