2012-05-07 2 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. не проверять и исключать SQL-запрос, вызванный внешним ключом, если свойство teacher_id недействительно. однако это не может решить проблему, что у меня могут быть дополнительные требования.

Я думаю, что это должно быть распространенной проблемой архитектуры SOA в случае использования несколькими службами одной базы данных. Я занимался исследованиями, но не получил ничего ценного.

+0

Развязка - это сокращение кодовых зависимостей, а не нарушение фундаментальных отношений между объектами. Вы учитель без учеников, можете ли вы быть учеником без учителя? Нет и нет. Я думаю, вы можете захотеть найти инъекцию зависимостей, но вам нужно рассмотреть, что такое развязка, а не как это сделать. –

+0

Да, я наконец понял, что это природа в моей структуре данных. –

ответ

1

Я согласен с Тони Хопкинсоном, что вы пытаетесь сделать, в основном необоснованным. Вы не можете отделить заботы учителя и ученика.

Смежные вопросы