Tôi đang sử dụng khung công tác Java + Spring cho ứng dụng web. Tôi không sử dụng bất kỳ công cụ ORM nào. Thay vào đó, tôi đang cố gắng mô hình hóa các quan hệ db như các đối tượng Java bằng cách sử dụng mẫu DAO/DTO đơn giản. Bất cứ khi nào DTO chính xác tương ứng với một bảng duy nhất trong cơ sở dữ liệu, nó rất thẳng về phía trước. Nhưng nếu có các bảng tham chiếu đến các bảng khác bằng cách sử dụng các khóa ngoại, tôi không chắc chắn cách tiếp cận tốt nhất cho điều này là gì. Nhìn vào Stackoverflow cho câu trả lời tương tự nhưng không thể tìm thấy một trong những nhu cầu của tôi. Tôi muốn đưa ra một ví dụ rất cụ thể - Giả sử có hai thực thể Người dùng và Nhóm. Tôi có một DTO người dùng và DTO nhóm, mỗi người có UserDao (JdbcUserDao) và GroupDao (JdbcGroupDao) tương ứng.Thiết kế DTO có mối quan hệ khóa ngoài
Bây giờ tôi có mối quan hệ trong DB kết nối Người dùng và Nhóm. Một người dùng có thể thuộc về nhiều nhóm. Tên bảng là User_Group_Association có định nghĩa DB sau:
user_id | group_id
Tại đây user_id là khóa ngoài tham chiếu đến bảng người dùng. Tương tự group_id đề cập đến bảng nhóm. Khi tôi mô hình DTO này trong Java, tôi nên làm một cái gì đó như thế này:
public class UserGroupAssoc {
private int userId;
private int groupId;
//Setters and getters follow
}
HOẶC nó phải như thế này:
public class UserGroupAssoc {
private User user;
private Group group;
//Setters and getters follow
}
Đặc biệt trường hợp sử dụng giao diện người dùng: Tôi muốn hiển thị tên người dùng và các nhóm tương ứng tên họ thuộc về. Một cái gì đó như this-
Tên -> Nhóm Tên
Keshav -> Quản trị, enduser, ReportAdmin
Kiran -> ReportAdmin
Pranav -> enduser
Trong cách tiếp cận đầu tiên để thiết kế DTO, tôi sẽ cần lấy lại chi tiết người dùng (tên) và chi tiết nhóm (tên) một lần nữa từ DB. Trong phương pháp thứ hai, tôi sẽ cần tìm nạp các đối tượng User và Group khi tôi xây dựng chính đối tượng UserGroupAssoc.
Trong lẽ là một cách tiếp cận thứ ba tôi có thể thiết kế các UserGroupAssoc DTO như sau:
public class UserGroupAssoc {
private String userName;
private String groupName;
private int userId;
private int groupId;
//Setters and getters follow
}
Trong phương pháp thứ ba này, tôi tham gia bảng trong SQL để có được chỉ các lĩnh vực cần thiết cho việc sử dụng hợp cụ thể và sau đó mô hình DTO cho phù hợp.
Cách tiếp cận chuẩn để đạt được kịch bản này là gì? Đang tham gia bảng ngay trong thiết kế DTO? Một số có ý kiến rằng một DTO nên tương ứng với chỉ có MỘT bảng và các đối tượng liên quan nên được tổng hợp trong lớp ứng dụng. Điều đó có chi phí làm nhiều việc tìm nạp đối tượng từ DB phải không? Quá nhầm lẫn về cách tiếp cận đúng, xin lỗi vì lời giải thích dài như vậy!