我目前正在研究基于此应用程序与其他正在运行的服务之间共享的数据库重新设计Web应用程序的几种解决方案。
实际应用程序使用NodeJS,并且在从数据库中的表中提取过多信息后基本上处理数据。我认为这是错误的,因为我们只应向数据库询问我们需要的数据,并限制服务器上的处理,因为这些过程意味着最终用户的加载时间很长。 所以我想我会构建一个Java API,它将使用可以被应用程序前端轻松使用的对象,并使用Hibernate或等效组件从数据库中提取必要的信息。
但问题是我构建这个API的数据库虽然应该是关系型的(它的postgreSQL),实际上是由彼此之间不通信的表组成的:没有连接表,因此没有关于修改相关对象的级联。此外,表格不直接对应于应用程序中使用的对象。他们更喜欢"超级对象"它将包含Java模型中的其他子对象。
问题是,我无法重建一个清洁工"因为它被其他服务使用的数据库(顺便说一句,这可能就是为什么它如此奇怪地组织起来)。我应该按原样使用它,并将重新设计的应用程序映射到它。我可以被允许重新设计一些表格以使它们更具关系性和#34;但这对其他服务没有任何影响。这意味着要彻底改写一些SQL函数,我不确定它是一个非常有效的解决方案。也就是说,我在编写SQL函数方面不是很有经验,所以也许最终可能是一个解决方案。
因此,简而言之,我可以做些什么来使用Java或任何其他您能想到的技术来构建面向对象的模型,以便正确地重新设计应用程序,而无需丢弃数据库或大幅修改数据库?
任何建议或研究负责人都将不胜感激。另外,请告诉我,如果我不够精确,我会尽力改善我的问题。
答案 0 :(得分:0)
使用JPA将数据库记录映射到实体。
This wiki page提供了一些高级用途示例:
实体的多个表:
KafkaAvroDeserializer
单个表中的多种实体(这个样本是我的,维基上没有代码;让我们希望我没有弄乱它!):
@Entity
@Table(name="EMPLOYEE")
@SecondaryTable(name="EMP_DATA",
pkJoinColumns = @PrimaryKeyJoinColumn(name="EMP_ID", referencedColumnName="ID")
)
public class Employee {
...
@Column(name="YEAR_OF_SERV", table="EMP_DATA")
private int yearsOfService;
@OneToOne
@JoinColumn(name="MGR_ID", table="EMP_DATA", referencedColumnName="ID")
private Employee manager;
...
}
:
@Inheritance
@DiscriminatorColumn(name="DISCRIMINATING_COLUMN")
@Table(name="SOME_TABLE")
public class Generic { ... }
// only maps records from SOME_TABLE where DISCRIMINATING_COLUMN=SOME_VALUE
@Entity
@DiscriminatorValue("SOME_VALUE")
public class firstSpecificType { ... }
// only maps records from SOME_TABLE where DISCRIMINATING_COLUMN=OTHER_VALUE
@Entity
@DiscriminatorValue("OTHER_VALUE")
public class secondSpecificType { ... }
等等。