Java 用Spring Boot JPA映射星型模式

Java 用Spring Boot JPA映射星型模式,java,spring-boot,spring-data-jpa,star-schema,Java,Spring Boot,Spring Data Jpa,Star Schema,我正在努力确定正确的注释,以便使用SpringBootJPA映射星型模式 让我们考虑3个表: (1)DIM_One(1)DIM_One(1)DIM_One(1..n)事实(1..n)DIM_One(1)DIM_Two DIM_1和DIM_2都有一个id作为主键。 事实的主键是(DIM_One_pk,DIM_Two_pk)的组合 目前,我的DIM表中的注释类似于: @Table(name="DIM_One") @Entity @Getter @ToString public c

我正在努力确定正确的注释,以便使用SpringBootJPA映射星型模式

让我们考虑3个表:

(1)DIM_One(1)DIM_One(1)DIM_One(1..n)事实(1..n)DIM_One(1)DIM_Two

DIM_1和DIM_2都有一个id作为主键。 事实的主键是(DIM_One_pk,DIM_Two_pk)的组合

目前,我的DIM表中的注释类似于:

@Table(name="DIM_One")
@Entity
@Getter
@ToString
public class One {

    @Id
    @Column(name = "dim_one_id")
    private UUID id;

    //...
}
关于事实表,我有:

@Entity
@Table(name = "FACT")
@ToString
@Getter
public class Fact {
    @EmbeddedId
    private FactId id;

    //...

}
使用相应的FactId类:

@Embeddable
@Getter
@EqualsAndHashCode
public class FactId implements Serializable {
    private One one;
    private Two two;
}
我觉得有点迷失了正确的注释,我需要使用这些注释使其符合基数:

(1)DIM_One(1)DIM_One(1)DIM_One(1..n)事实(1..n)DIM_One(1)DIM_Two

此外,它实际上应该映射为OneToMany还是OneToOne?

您的图表显示了(1..n)-(1)关系,因此它应该像这样映射

除此之外,您还需要考虑如何使用:

  • 如果加载事实,是否加载关联的维度条目?这将导致在急切加载和延迟加载之间做出决定
  • 您希望能够从事实导航到维度,还是相反?或者两者都有?这导致了关于方向性的决定
  • 如果您坚持,请删除。。。维度是否应加入到该操作中?=>级联配置
注意:虽然原则上这应该可以正常工作,但因为星型模式仍然只是一堆表,所以听起来这是一个非常糟糕的主意

星型模式用于大量数据,并且高度非规范化,以便优化读取和聚合。 这意味着更新通常从几百行到数千行,甚至数百万行。 JPA并不是为这种操作而构建的,它的性能与特定的泰勒SQL语句相比非常糟糕


在读取端,您将不断使用聚合函数进行操作,可能还会使用非平凡表达式对函数进行窗口化。JPQL,JPA的查询语言也不是为此而构建的,这将严重限制您的选择。

感谢您富有洞察力的回答。你知道有哪个框架更适合这样的任务吗?我不知道任何具体的框架,但你要寻找的术语是ETL(提取-转换-加载),它是从各种源提取数据、将数据转换(转换为星型模式)并将其加载到各种数据库中的工具。