首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 教學

縱向表 (EAV) 與橫向表 設計差異與轉換實例

     編輯:Oracle 教學

縱向表 (EAV) 與橫向表 設計差異與轉換實例

橫向表 (傳統關聯模型)

每個屬性對應一個欄位,適合結構固定、查詢效能要求高的場景。

ID姓名部門性別
123李凱技術部男
234金鑫市場部男
456歐欣會計部女

縱向表 (Entity-Attribute-Value, EAV)

將屬性「旋轉」為列,適合屬性動態、稀疏、用戶自定義欄位的場景 (如醫療記錄、問卷系統、產品屬性)。

IDKey (屬性名)Value (屬性值)
123姓李
234姓金
456姓歐
123名凱
234名鑫
456名欣
123部門技術部
234部門市場部
456部門會計部
123性別男
234性別男
456性別女

核心差異比較

維度橫向表縱向表 (EAV)
結構變更需 DDL (ALTER TABLE ADD COLUMN)無需 DDL,直接 INSERT 新 Key
查詢效能極佳 (索引、分區、向量化)需 PIVOT/自連接,效能較差
空值儲存佔用空間 (視儲存引擎)不儲存 NULL,極度稀疏友善
資料型別強型別、約束完整通常全存 VARCHAR/CLOB,需應用層驗證
適用場景核心業務、高頻查詢、固定結構動態屬性、用戶自定義欄位、稀疏資料

EAV 轉橫向 (PIVOT) 查詢範例

SELECT id,
       MAX(CASE WHEN key = '姓'   THEN value END) AS 姓,
       MAX(CASE WHEN key = '名'   THEN value END) AS 名,
       MAX(CASE WHEN key = '部門' THEN value END) AS 部門,
       MAX(CASE WHEN key = '性別' THEN value END) AS 性別
FROM   vertical_table
GROUP BY id;

Oracle 11g+ 亦可使用 PIVOT 子句簡化寫法。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved