使用 Spring Boot JPA 映射星型模式

Mapping a Star Schema with Spring Boot JPA

我正在努力确定用于使用 Spring Boot JPA 映射星型模式的正确注释。

让我们考虑 3 tables:

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

DIM_One 和 DIM_Two 都有一个 id 作为它们的主键。 FACT 的主键是 (DIM_One_pk, DIM_Two_pk)

的组合

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

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

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

    //...
}

至于事实table,我有:

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

    //...

}

与对应的FactId class :

@Embeddable
@Getter
@EqualsAndHashCode
public class FactId implements Serializable {
    private One one;
    private Two two;
}

我对正确的注释感到有点迷茫,我需要使用它来使其与基数相对应:

DIM_One (1)--------(1..n) 事实 (1..n) ---------- (1) Dim_Two

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

你的图表显示了 (1..n)---(1) 关系,所以它应该像这样映射。

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

  • 如果加载事实,是否要加载关联的维度条目?这导致了在急切加载和延迟加载之间做出决定。
  • 您希望能够从事实导航到维度还是相反?或两者?这导致关于方向性的决定。
  • 如果你坚持,删除......一个事实应该维度加入那个操作? => 级联配置。

注意:虽然原则上这应该没有大问题,但由于星型模式仍然只是一堆表,这听起来像是一个非常糟糕的主意。

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

在阅读方面,您将经常使用聚合函数和可能带有非平凡表达式的窗口函数进行操作。 JPQL,JPA 的查询语言再次不是为此构建的,将严重限制您的选择。