我想为我的应用程序创建一个核心 API,它负责与数据库通信以从数据库获取/保留实体对象。然后这个核心 API 可以被 Web 应用程序使用或在其之上创建一个 REST 层。
我正在构建一个论坛应用程序,并且正在创建域实体,例如:
class User
{
int id;
String username;
...
List<Post> posts;
}
class Post
{
int id;
String title;
...
User postedBy;
}
我正在考虑 Post 类是否应该包含引用发布它的用户的 User 对象,或者只包含 user_id (整数)。
以下场景表明这两个选项都是有效的。
如果我们想要显示帖子以及发布该帖子的用户的姓名/电子邮件,那么我们应该有 User 对象。另一方面,API 使用者可能会尝试浏览未完全加载的对象图。
即,客户端可以尝试导航 post.getPostedBy().getPosts(),它返回 null 或空列表/集,并可能得出结论该用户尚未发布任何内容。
如果 user_id 属性是整数,客户端将调用另一个方法来通过 user_id 获取帖子列表。
那么哪个选项更好地保存对父关系的引用?
最佳答案
我想说 Post 应该只保存一个 user_id,因为 Post 的存储不需要存储 User - 它不是一个聚合根。
但是说到本地和远程 API,对象之间发送消息还取决于延迟。如果延迟大于本地调用(假设通过 REST API),您希望在一次调用中发送尽可能多的信息以避免多次调用。但是,这会使域模型仅对于本地调用(在一个应用程序内 - 一台机器等)变得丑陋。
换句话说,REST API 将使用一些远程外观对象发送包含更多信息的 DTO(例如,将数据与用户数据一起发布) - 请参阅 PoEAA 中的“远程外观”。但是域模型将被建模为 User 和 Post 类的最佳结构,并由存储库 - PostRepository.getPostsByUser() 或类似的来获取。
关于java - 用于创建 API 的更好的域模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20632578/