假设我有一个这样的数据库:(不是实际的数据库,但足以说明问题)
“完成”和“总计”字段只是isComplete和每个条件(每个任务列表或每个项目)的任务总数记录的计数器。重复它们(数据库非规范化?)以便于获取,因为在每个阶段我都希望包括进度计数器。
我有这样的实体:
// other fields, getter and setters omitted for brevity
@Entity
@Table(name = "user_info")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@Column(name = "username")
private String userName;
@Column(name = "image")
private String imageUrl;
@ManyToMany
@JoinTable(name = "project_user",
joinColumns = @JoinColumn(name="user_id"),
inverseJoinColumns = @JoinColumn(name="project_id"))
private Set projects;
}
@Entity
@Table(name = "project")
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@Column(name = "name")
private String name;
@OneToOne
@JoinColumn(name = "creator_id")
private User creator;
@Column(name = "image")
private String imageUrl;
@Column(name = "creation_date")
private Date createdAt;
@Column(name = "total")
private int total;
@Column(name = "complete")
private int complete;
@ManyToMany
@JoinTable(name = "project_user",
joinColumns = @JoinColumn(name="project_id"),
inverseJoinColumns = @JoinColumn(name="user_id"))
@JsonIgnoreProperties(value = {"projects", "connected", "notifications"})
private Set members;
@OneToMany(fetch = FetchType.LAZY)
@JoinColumn(name = "project_id")
private Set taskLists;
}
@Entity
@Table(name = "task_list")
public class TaskList {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@Column(name = "name")
private String name;
@Column(name = "image")
private String imageUrl;
@Column(name = "creation_date")
private Date createdAt;
@Column(name = "complete")
private int complete;
@Column(name = "total")
private int total;
@OneToMany
@JoinColumn(name = "task_list_id")
private Set tasks;
}
@Entity
@Table(name = "task")
public class Task {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@Column(name = "description")
private String description;
@Column(name = "title")
private String title;
@ElementCollection
@CollectionTable(name = "task_images", joinColumns = @JoinColumn(name="task_id"))
@Column(name = "image")
private Set imageUrls;
@OneToMany
@JoinColumn(name = "task_id")
private Set handledBy;
@Transient
private Set notes;
@Column(name = "complete")
private boolean complete;
@Column(name = "creation_date")
private Date createdAt;
@Column(name = "completion_date")
private Date completeDate;
}
@Entity
@Table(name = "task_handler")
public class TaskMember {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private int id;
@OneToOne
@JoinColumn(name = "id", referencedColumnName = "user_id")
private User user;
@Column(name = "assignmentType")
private String assignmentType; //maybe change to enum?
}
问题是添加一些json忽略属性(以解决循环序列化问题)后,我得到了一个像这样的json:
user: {
//fields
projects: [{
//fields
tasklist: [{
//fields
tasks: [{
//fields
}]
}]
}]
}
这不仅是一个巨大的响应(包含几乎所有数据),而且还占用了服务器上的大量空间。
我想拥有的是:
request to sign in:
user: {
//fields
}
request to endpoint1 with parameter user id
projects: [{
// fields
}]
request to endpoint2 with parameter project id
tasklist: [{
// fields
}]
request to endpoint3 with parameter tasklist id
tasks: [{
// fields
}]
这将使更新客户端进行任何更改变得更容易,同时使api尽可能处于无状态状态(除了会话和安全性内容外,我不希望服务器内存中的任何数据)。
我知道一种方法是删除实体并以纯sql样式进行操作,但这意味着我失去了诸如级联和数据完整性之类的休眠功能。
我在这里有什么选择?如果实体关系或数据库设计有误,请赐教。
提前致谢 :)