我是否需要在不加入 jooq 的情况下为查询创建新的简单实体?
Do I need create new simple entity for query without join in jooq?
我有一些看起来像这样的实体:
data class ComplexEntity(
private val id: UUID,
private val srcSomethingId: UUID,
private val dstSomethingId: UUID,
private val creationDate: LocalDateTime,
private val updatingDate: LocalDateTime?,
private val creationAuthorId: UUID,
private val updatingAuthorId: UUID?,
private val roles: List<UUID>,
private val fieldsId: UUID,
// relation
private val srcSomething: SomethingEntity?,
private val dstSomething: SomethingEntity?
)
它有关系,我正在将它与另一个 table 连接起来,但大多数时候我不需要关系,所以也许我需要创建更简化的实体,如投影或只保留关系不需要的字段 null
。
data class ComplexProjection (
private val id: UUID,
private val srcSomethingId: UUID,
private val dstSomethingId: UUID,
private val creationDate: LocalDateTime,
private val updatingDate: LocalDateTime?,
private val creationAuthorId: UUID,
private val updatingAuthorId: UUID?,
private val roles: List<UUID>,
private val fieldsId: UUID
)
反之亦然,保持 ComplexProjection
像主要实体一样,因为它大部分时间都需要并将其称为 ComplexEntity
并使 ComplexEntityWithRelations
放置关系。
最好的方法是什么?
P.S。实际上,大多数时候我不需要所有这些字段,但我认为额外的 5 个字段不会对性能造成太大影响。
JPA 实体是一种数据建模方式,类似于 SQL 中的 CREATE TABLE
。如果您合理地规范化事物,确实,您没有太多选择,无论是 SQL 形式还是 JPA 实体形式。
但是,由于所有错误的原因,人们也一直 投影 这些实体,即使使用 JPA,您也可以投影任意数据结构,就像使用 jOOQ 一样。你的 data classes
不是实体,它们是投射。这不是一回事。就像在 SQL 中,你可以为你的数据编写任意视图,而 SQL 不会告诉你这样做或那样做,jOOQ 对你的 预测没有意见.
所以,流程是这样的:
- 将您的模式规范化到足够的水平(例如 3NF)
- 根据需要设计查询(例如,UI 需要 table A 中的这 3 列和 table B 中的这 2 个嵌套集合)
就是这样。最好的查询以及针对您的个人需求的最佳预测自然而然地产生,来自您(团队)的偏好、您的数据表示、要求等。只要您能够以合理的方式表示事物,就不会对您的数据进行正确或错误的预测方式。
我有一些看起来像这样的实体:
data class ComplexEntity(
private val id: UUID,
private val srcSomethingId: UUID,
private val dstSomethingId: UUID,
private val creationDate: LocalDateTime,
private val updatingDate: LocalDateTime?,
private val creationAuthorId: UUID,
private val updatingAuthorId: UUID?,
private val roles: List<UUID>,
private val fieldsId: UUID,
// relation
private val srcSomething: SomethingEntity?,
private val dstSomething: SomethingEntity?
)
它有关系,我正在将它与另一个 table 连接起来,但大多数时候我不需要关系,所以也许我需要创建更简化的实体,如投影或只保留关系不需要的字段 null
。
data class ComplexProjection (
private val id: UUID,
private val srcSomethingId: UUID,
private val dstSomethingId: UUID,
private val creationDate: LocalDateTime,
private val updatingDate: LocalDateTime?,
private val creationAuthorId: UUID,
private val updatingAuthorId: UUID?,
private val roles: List<UUID>,
private val fieldsId: UUID
)
反之亦然,保持 ComplexProjection
像主要实体一样,因为它大部分时间都需要并将其称为 ComplexEntity
并使 ComplexEntityWithRelations
放置关系。
最好的方法是什么?
P.S。实际上,大多数时候我不需要所有这些字段,但我认为额外的 5 个字段不会对性能造成太大影响。
JPA 实体是一种数据建模方式,类似于 SQL 中的 CREATE TABLE
。如果您合理地规范化事物,确实,您没有太多选择,无论是 SQL 形式还是 JPA 实体形式。
但是,由于所有错误的原因,人们也一直 投影 这些实体,即使使用 JPA,您也可以投影任意数据结构,就像使用 jOOQ 一样。你的 data classes
不是实体,它们是投射。这不是一回事。就像在 SQL 中,你可以为你的数据编写任意视图,而 SQL 不会告诉你这样做或那样做,jOOQ 对你的 预测没有意见.
所以,流程是这样的:
- 将您的模式规范化到足够的水平(例如 3NF)
- 根据需要设计查询(例如,UI 需要 table A 中的这 3 列和 table B 中的这 2 个嵌套集合)
就是这样。最好的查询以及针对您的个人需求的最佳预测自然而然地产生,来自您(团队)的偏好、您的数据表示、要求等。只要您能够以合理的方式表示事物,就不会对您的数据进行正确或错误的预测方式。