如何将非规范化表映射到两个实体?

Posted

技术标签:

【中文标题】如何将非规范化表映射到两个实体?【英文标题】:How to map a denormalized table to two entities? 【发布时间】:2020-07-10 22:09:54 【问题描述】:

我有一个非规范化的数据库表,其中包含员工和他们工作的部门:

EmployeeId EmployeeName DepartmentId DepartmentName
 1            Bob          1              HR
 2            Lisa         1              HR
 ...

DepartmentIdEmployeeId 是复合主键。我无法更改数据库。我想将此映射到两个实体:

@Entity
@Data
class Employee 
   @Id
   @Column("employeeId")
   private int id;
   
   @Column("employeeName")
   private String name;

   @ManyToOne
   private Department department;


@Entity
@Data
class Department 
   @Id
   @Column("departmentId")
   private int id;
   
   @Column("departmentName")
   private String name;

但这不起作用。如何解释我的逻辑(对象)模型和数据库(物理)模型之间的这种阻抗不匹配?我见过hierarchical 解决此问题的方法,但我认为这不适用于我的场景,因为 Employee 和 Department 没有任何层级关系。

【问题讨论】:

【参考方案1】:

一行只能代表一个Entity对象。任何重复在一起的士气低落的属性都可以被视为Value 对象。 Value 对象的生命周期取决于实体对象的生命周期。当实体对象被删除时,值对象也随之删除。

即使在分层方法中,每一行也可以呈现不同的type 书籍,但一行仅代表一个实体。

所以你不能将它们表示为两个实体。

【讨论】:

以上是关于如何将非规范化表映射到两个实体?的主要内容,如果未能解决你的问题,请参考以下文章

将非规范化表转换为嵌套结构

将规范化的 Postgres 视图映射到实体 |弹簧靴

将两个字段映射到一个数据库列

将非规范化数据加载到数据仓库中

用于过滤两个子实体的 Spring Boot 规范

公司数据库编码规范