簡體   English   中英

如何將曲線存儲到數據庫

[英]How to store curve to database

我想問一下如何將曲線存儲到DB。 Curve 對象由一組點表示。

我有兩個選擇:

1)為點創建兩個表,一個用於曲線,一個用於點

  • 它看起來像這樣: CURVE[id] , POINT[id, x, y, order, curve_id]
  • 我不確定這是否是最佳的,要從數據庫中獲得一條曲線,我需要加入表,並且在 POINT 表中會有很多點

2) 一條曲線 = 一張表中的一行

  • 我會將所有數據存儲在一個表中,例如: CURVE[id, data] 其中數據可以是格式“[[1,2],[2,2],[3,4] ...]”( string) 或 blob 或類似的東西。

你怎么認為? 還有其他選擇嗎?

我建議將您的數據點存儲在單獨的行中,您只需要一個額外的索引來對它們進行排序。
您可以使用GROUP_CONCAT()函數重新創建您建議的字符串。
您的將具有以下結構

  • 曲線ID
  • 點 ID
  • x_坐標
  • y_坐標

查詢看起來像:

--- {[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM