每個屬性對應一個欄位,適合結構固定、查詢效能要求高的場景。
| ID | 姓 | 名 | 部門 | 性別 |
|---|---|---|---|---|
| 123 | 李 | 凱 | 技術部 | 男 |
| 234 | 金 | 鑫 | 市場部 | 男 |
| 456 | 歐 | 欣 | 會計部 | 女 |
將屬性「旋轉」為列,適合屬性動態、稀疏、用戶自定義欄位的場景 (如醫療記錄、問卷系統、產品屬性)。
| ID | Key (屬性名) | 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,需應用層驗證 |
| 適用場景 | 核心業務、高頻查詢、固定結構 | 動態屬性、用戶自定義欄位、稀疏資料 |
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 子句簡化寫法。