[英]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.