[英]How to store curve to database
我想问一下如何将曲线存储到DB。 Curve 对象由一组点表示。
我有两个选择:
1)为点创建两个表,一个用于曲线,一个用于点
CURVE[id]
, POINT[id, x, y, order, curve_id]
2) 一条曲线 = 一张表中的一行
你怎么认为? 还有其他选择吗?
我建议将您的数据点存储在单独的行中,您只需要一个额外的索引来对它们进行排序。
您可以使用GROUP_CONCAT()
函数重新创建您建议的字符串。
您的表将具有以下结构:
查询看起来像:
--- {[1,2], [2,3] ...}
SELECT GROUP_CONCAT(CONCAT_WS("[", x_coord, ",", y_coord, "]"))
FROM table
WHERE curve_id ORDER BY point_id
您可以使用 JSON 数据类型将曲线点存储在单个属性中。
你可以做的是使用 javax.persistence.AttributeConverter 并像这样创建曲线转换器:
public class CurveConverter implements AttributeConverter<Curve, String> {
private static final String SEPARATOR1 = ",";
private static final String SEPARATOR2 = ";";
@Override
public String convertToDatabaseColumn(Curve curve) {
if (curve == null) {
return null;
}
StringBuilder sb = new StringBuilder();
for(CurvePoint curvePoint:curve.getPoints()){
sb.append(curvePoint.getTorque());
sb.append(SEPARATOR1);
sb.append(curvePoint.getSpeed());
sb.append(SEPARATOR2);
}
sb.setLength(sb.length() - SEPARATOR2.length());
return sb.toString();
}
@Override
public Curve convertToEntityAttribute(String dbData) {
if (dbData == null || dbData.isEmpty()) {
return null;
}
String[] pieces = dbData.split(SEPARATOR2);
if (pieces == null || pieces.length == 0) {
return null;
}
List<CurvePoint> curvePoints = new ArrayList<>();
for(String piece:pieces){
String[] numbers = piece.split(SEPARATOR1);
curvePoints.add(new CurvePoint(Float.parseFloat(numbers[0]), Float.parseFloat(numbers[1])));
}
return Curve.builder().points(curvePoints).build();
}
}
它将您的曲线作为字符串(CSV - “1.1,2.2;3.3,4.4 ...”)存储到表格中作为一个属性。 你会摆脱关节,它会更快。 这仅在曲线不可变时才有用(所有点都同时发生变化)
然后,您只需在实体中的字段上添加注释,其中曲线的使用方式如下:
@Column(name = "curve", length = 10000)
@Basic(fetch = FetchType.LAZY)
@Convert(converter = CurveConverter.class)
Curve curve;
这里重要的是设置正确的字符串长度。 还要检查@Basic(fetch = FetchType.LAZY)
是否用于惰性加载曲线数据(仅在我们需要它们时)。 注释@Convert(converter = CurveConverter.class)
然后说要休眠,在将此字段保存到数据库之前,它将使用我们新创建的曲线 CurveConvertor 进行转换(与我们从 DB 获取数据时相同)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.