0

我有两个服务: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 包中!

消除这种依赖的最佳实践是什么?

我想到了一些方法:

  1. 创建一条 validateTeacher 消息,然后 PupilService 将此消息发送给 TeacherService 并等待响应。但是,如果我有进一步的要求,例如搜索有名字的老师,那么我必须创建另一条消息,最终导致消息爆炸。直接搜索数据库是一种更灵活、更高效的方式,但会引入依赖。

  2. 如果teacher_id 无效,不要做任何检查和捕获由外键引起的SQL 异常。但是,这并不能解决我可能有进一步要求的问题。

我认为如果多个服务共享同一个数据库,这应该是 SOA 架构中的一个常见问题。我做了一段时间的研究,但没有得到任何有价值的东西。

4

1 回答 1

1

我同意托尼霍普金森的观点,你试图做的事情根本上是不健全的。你不能把老师和学生的顾虑分开。

于 2012-05-07T22:55:26.147 回答