我正在努力找出正确的注解来使用springbootjpaMap星型模式。
让我们考虑3个表:
尺寸一(1)-------(1..n)事实(1..n)-------(1)尺寸二
dim\u one和dim\u two都有一个作为主键的id。事实的主键是(dim\u one\u pk,dim\u two\u 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)-------(1..n)事实(1..n)-------(1)尺寸二
此外,它真的应该被Map为onetomany还是onetoone?
1条答案
按热度按时间epfja78i1#
您的图显示了(1..n)--(1)关系,因此应该这样Map它。
除此之外,您还需要考虑如何使用它:
如果加载事实,是否加载关联的维度条目?这将导致在急切加载和懒惰加载之间做出决定。
您希望能够从事实导航到维度还是相反?或者两者都有?这导致了关于方向性的决定。
如果你坚持,删除。。。维度是否应该加入到该操作中?=>级联配置。
注意:虽然原则上这应该不会有大问题,但由于星型模式仍然只是一堆表,所以这听起来是一个非常糟糕的主意。
星型模式用于大量数据,并且高度非规范化以优化读取和聚合。这意味着更新通常从几百行到几千行,甚至几百万行。jpa不是为这种操作而构建的,与特定的taylored sql语句相比,它的性能非常糟糕。
在读取端,您将不断使用聚合函数进行操作,并可能使用非平凡表达式对函数进行窗口操作。jpql,jpa的查询语言也不是为此而构建的,它将严重限制您的选择。