首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

關係型資料庫存儲 List 集合:兩種標準映射模式

     編輯:程式設計綜合問答

問題本質

資料表無「集合」類型,Java List<String> 必須映射為關係模型。

方案一:分隔符序列化 (適用於簡單、不查詢元素)

// 寫入
String joined = String.join(";", stringList); // "A;B;C"
jdbc.update("INSERT INTO t(col) VALUES (?)", joined);

// 讀取
List<String> list = Arrays.asList(row.getString("col").split(";"));
  • 優點:零結構變更,極簡。
  • 缺點:無法 SQL 級過濾/統計單元素;分隔符衝突風險。

方案二:關聯表 (標準範式,支援查詢)

CREATE TABLE parent (id PK, ...);
CREATE TABLE child_strings (parent_id FK, idx INT, val VARCHAR(255), PK(parent_id, idx));
// 批次寫入
List<BatchPreparedStatementSetter> batch = list.stream()
    .map(v -> new AbstractBatchPreparedStatementSetter() { ... })
    .collect(toList());
jdbc.batchUpdate("INSERT INTO child_strings VALUES (?,?,?)", batch);
  • 優點:完整 SQL 查詢能力,支援索引、外鍵約束。
  • 缺點:需額外 JOIN,寫入稍繁瑣。

選型建議

場景推薦
標籤、枚舉值、不須檢索方案一 (JSON 也可)
需按元素查詢/統計/關聯方案二
元素為複雜物件方案二 + 物件表

ORM 框架支援

  • Hibernate/JPA:@ElementCollection + @CollectionTable 自動映射方案二。
  • MyBatis:<collection> 映射關聯表,或 TypeHandler 處理方案一。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved