WebアプリケーションにJava+Springフレームワークを使用しています。ORMツールを使用していません。代わりに、単純なDAO/DTOパターンを使用してdbリレーションをJavaオブジェクトとしてモデル化しようとしています。DTOがデータベース内の単一のテーブルに正確に対応する場合は常に、非常に簡単です。しかし、外部キーを使用して他のテーブルを参照するテーブルがある場合、これに対する最善のアプローチはわかりません。Stackoverflowで同様の回答を探しましたが、私のニーズに合ったものを見つけることができませんでした。非常に具体的な例を挙げたいと思います。UserとGroupの2つのエンティティがあるとします。ユーザーDTOとグループDTOがあり、それぞれにUserDao(JdbcUserDao)とGroupDao(JdbcGroupDao)があります。
これで、ユーザーとグループを接続するDB内の関係ができました。1人のユーザーが複数のグループに属することができます。テーブル名はUser_Group_Associationで、次のDB定義があります。
user_id | group_id
ここで、user_idは、ユーザーテーブルを参照する外部キーです。同様に、group_idはグループテーブルを参照します。このDTOをJavaでモデル化する場合、次のようなことを行う必要があります。
public class UserGroupAssoc {
private int userId;
private int groupId;
//Setters and getters follow
}
または、次のようになります。
public class UserGroupAssoc {
private User user;
private Group group;
//Setters and getters follow
}
特定のUIのユースケース:ユーザー名とそれに属するグループ名を表示したい。このようなもの-
名前->グループ名
Keshav-> Admin、EndUser、ReportAdmin Kiran-
> ReportAdmin
Pranav-> EndUser
DTO設計への最初のアプローチでは、ユーザーの詳細(名前)とグループの詳細(名前)をDBから再度取得する必要があります。2番目のアプローチでは、UserGroupAssocオブジェクト自体を作成するときに、UserオブジェクトとGroupオブジェクトをフェッチする必要があります。
おそらく3番目のアプローチでは、UserGroupAssocDTOを次のように設計できます。
public class UserGroupAssoc {
private String userName;
private String groupName;
private int userId;
private int groupId;
//Setters and getters follow
}
この3番目のアプローチでは、SQLでテーブルを結合して、ユースケースに必要なフィールドのみを取得し、それに応じてDTOをモデル化します。
このシナリオを達成するための標準的なアプローチはどれですか?DTO設計でテーブルを結合しても大丈夫ですか?1つのDTOは1つのテーブルのみに対応し、関連するオブジェクトはアプリレイヤーに集約する必要があるという意見もあります。これには、DBから複数のオブジェクトフェッチを実行するオーバーヘッドがありますか?正しいアプローチについて混乱しすぎて、長い説明をしてすみません!