2012-05-07 3 views
0

私は、同じデータベースを共有しているTeacherServiceとPupilSerivceという2つのサービスを持っています。それらの関係は、1人の教師が多くの生徒を持つことができ、各生徒は1人の教師しか持たないという一対一の関係です。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; 

あなたが想像できるように、私は私のJavaコードでデータベーステーブルを表し、2つのエンティティTeacherVOとPupilVOを持っています。

質問は、TeacherServiceとPupilSerivceの両方が個別のプロセスで実行され、メッセージと通信するので、私はお互いにコンパイルの依存関係を持たせたくありません。しかし、新しいpupileを追加する際の方法は、次のようになります。

PupilService.addNewPupil(long teacherId) { 
    if (isValidTeacher(teacherId) { 
     // add the pupile 
    } 
} 

これは、いくつかの検証を行うことができますのでPupileServiceがTeacherVOの知識を持っている必要がありますが、TeacherVOはTeacherServiceパッケージであります!

このような種類の依存関係を削除するにはどうすればよいですか?

私が考えるいくつかの方法があります。

  1. がvalidateTeacherメッセージを作成し、その後、PupilServiceがTeacherServiceにこのメッセージを送信し、応答を待ちます。しかし、先生に名前を尋ねるような追加の要件がある場合は、別のメッセージを作成しなければならず、最後にメッセージが吹き飛ばされます。データベースを直接検索する方がより柔軟で効率的ですが、依存関係が導入されます。

  2. teacher_idが無効な場合、外部キーによるSQL例外をチェックしてキャッチしません。しかし、これは私がさらなる要件を持つかもしれないという問題を解決することはできません。

これは、複数のサービスが同じデータベースを共有する場合のSOAアーキテクチャの共通の問題であると考えます。私はしばらく研究をしましたが、価値のあるものは得られませんでした。

+0

デカップリングとはエンコードの依存関係を減らし、エンティティ間の基本的な関係を壊さないことです。あなたは生徒のいない先生ですか、先生がいない生徒ですか?いいえ、いいえ、あなたは依存性注入を調べたいと思うかもしれませんが、どのようにデカップリングを行うのかを検討する必要があります。 –

+0

はい、私はついにそれが私のデータ構造に自然だと気付きました。 –

答えて

1

私はTony Hopkinsonに同意します。あなたがしようとしていることは基本的には不健全です。教師と学生の懸念を分けることはできません。

関連する問題