У меня есть две службы: 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 и ждать ответа. Однако, если у меня есть дополнительные требования, такие как поиск учителя с именем, я должен создать другое сообщение, которое, наконец, приведет к взрыву сообщения. Прямой поиск базы данных является более гибким и эффективным способом, но он вводит зависимость.
не проверять и исключать SQL-запрос, вызванный внешним ключом, если свойство teacher_id недействительно. однако это не может решить проблему, что у меня могут быть дополнительные требования.
Я думаю, что это должно быть распространенной проблемой архитектуры SOA в случае использования несколькими службами одной базы данных. Я занимался исследованиями, но не получил ничего ценного.
Развязка - это сокращение кодовых зависимостей, а не нарушение фундаментальных отношений между объектами. Вы учитель без учеников, можете ли вы быть учеником без учителя? Нет и нет. Я думаю, вы можете захотеть найти инъекцию зависимостей, но вам нужно рассмотреть, что такое развязка, а не как это сделать. –
Да, я наконец понял, что это природа в моей структуре данных. –