我在 JAVA 中有继承权,我们的 DBA 建议我为所有子项创建一个表(就像一个单表策略),但创建一个包含所有特定信息的 json 数据类型。 这是一个好的做法吗?
我举一个例子,有这三个表:
图片:thumbnailId 长,
视频:持续时间整数,
媒体:ID、名称、描述、类型
仅移动到一张表:
媒体:id、名称、描述、类型、extra_fields
在图像的情况下,额外的字段应该存储缩略图,在视频的情况下,它应该将持续时间存储为 json。
所以:
1- 这是个好主意吗?
2- 这个用JAVA+Spring容易实现吗?
谢谢
最佳答案
这很容易实现。这是一个示例:
@Entity(name = "Step")
@Table(name = "step")
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class StepEntity {
@Column(name = "STEP_data")
@Convert(converter = StepDataAttributeConverter.class)
private StepData data;
public StepEntity() {
super();
}
@Data
@JsonIgnoreProperties(ignoreUnknown = true)
@JsonInclude(JsonInclude.Include.NON_NULL)
public static class StepData {
/* some fields */
@JsonCreator
public StepData() {
super();
}
}
}
public class StepDataAttributeConverter implements AttributeConverter<StepEntity.StepData, String> {
private static final ObjectMapper MAPPER = new ObjectMapper();
@Override
public String convertToDatabaseColumn(StepEntity.StepData attribute) {
if (attribute == null) {
return null;
} else {
try {
return MAPPER.writeValueAsString(attribute);
} catch (JsonProcessingException e) {
return null;
}
}
}
@Override
public StepEntity.StepData convertToEntityAttribute(String dbData) {
if (dbData == null) {
return null;
} else {
try {
return MAPPER.readValue(dbData, StepEntity.StepData.class);
} catch (IOException e) {
return null;
}
}
}
}
我不太确定这是一个好的做法。对该字段进行搜索查询将非常困难。就我而言,我有一个 Elasticsearch 来完成所有搜索。但如果您没有类似的东西,我建议您在执行此操作之前三思而后行,并真正确保您不需要在此字段上进行搜索。
关于JAVA继承+json类型的Postgresql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50373241/