2848 字
14 分鐘
TFT MetaAscension - 資料庫設計

TFT Predict - Data Dictionary#

最後更新: 2025-01-30
版本: V2


目錄#

  1. 原始數據表
  2. 配置表
  3. 每日持久化表(時間序列)
  4. 基礎物化視圖
  5. 統計物化視圖
  6. API 視圖
  7. 函數
  8. 索引清單
  9. 數據關係圖

1. 原始數據表#

1.1 tft_matches#

比賽原始數據表,儲存從 Riot API 獲取的完整比賽資訊。

欄位類型說明範例
match_idVARCHAR比賽唯一識別碼,格式: {REGION}_{ID}OC1_123456789
infoJSONB完整比賽資訊 JSON見下方結構
created_atTIMESTAMP記錄創建時間2025-01-30 10:00:00

info JSON 結構:

{
"game_datetime": 1706600000000, // Unix timestamp (毫秒)
"game_length": 1847.5, // 遊戲時長(秒)
"game_version": "Version 14.24.123.456",
"queue_id": "1100", // 1100 = 排位賽
"participants": [
{
"puuid": "xxx",
"placement": 1,
"level": 9,
"gold_left": 4,
"total_damage_to_players": 120,
"units": [...],
"traits": [...]
}
// ... 8 個玩家
]
}

資料保留策略: 7 天


2. 配置表#

2.1 tft_data_config#

系統配置表,用於追踪數據處理狀態。

欄位類型說明範例
config_keyVARCHAR(50)配置鍵(主鍵)last_daily_snapshot
config_valueTEXT配置值2025-01-29
updated_atTIMESTAMP最後更新時間2025-01-30 04:00:00

預設配置項:

Key說明
last_daily_snapshot最後一次每日快照的日期
data_retention_days原始數據保留天數(預設 7)

3. 每日持久化表(時間序列)#

3.1 daily_champion_stats#

每日英雄統計,按 (日期, 區域, 版本, 英雄, 星級) 聚合。

欄位類型說明範例
idSERIAL自增主鍵1
stat_dateDATE統計日期2025-01-29
regionVARCHAR(10)伺服器區域OC1, NA1, EUW1
patchVARCHAR(10)遊戲版本14.24
character_idVARCHAR(50)英雄 IDTFT12_Ahri
tierSMALLINT星級 (1/2/3)3
games_playedINT被選用次數(玩家數)150
total_matchesINT當日總比賽數1000
unique_matchesINT出現的獨立比賽數120
avg_placementNUMERIC(4,2)平均排名3.85
stddev_placementNUMERIC(4,2)排名標準差2.10
top4_countINT進入前4的次數70
win_countINT第1名的次數15
pick_rateNUMERIC(6,4)每場平均選用數0.1500
appearance_rateNUMERIC(6,4)出現比例0.1200
avg_per_matchNUMERIC(4,2)出現時平均幾人用1.25
created_atTIMESTAMP記錄創建時間2025-01-30 04:00:00

唯一約束: (stat_date, region, patch, character_id, tier)


3.2 daily_item_stats#

每日裝備統計。

欄位類型說明範例
idSERIAL自增主鍵1
stat_dateDATE統計日期2025-01-29
regionVARCHAR(10)伺服器區域OC1
patchVARCHAR(10)遊戲版本14.24
item_nameVARCHAR(100)裝備名稱TFT_Item_JeweledGauntlet
usage_countINT使用次數500
unique_matchesINT出現的獨立比賽數400
avg_placementNUMERIC(4,2)平均排名4.20
stddev_placementNUMERIC(4,2)排名標準差2.30
top4_countINT進入前4的次數250
created_atTIMESTAMP記錄創建時間2025-01-30 04:00:00

唯一約束: (stat_date, region, patch, item_name)


3.3 daily_trait_stats#

每日羈絆統計。

欄位類型說明範例
idSERIAL自增主鍵1
stat_dateDATE統計日期2025-01-29
regionVARCHAR(10)伺服器區域OC1
patchVARCHAR(10)遊戲版本14.24
trait_nameVARCHAR(100)羈絆名稱Set12_Mage
tier_currentSMALLINT羈絆激活等級2
games_playedINT使用次數300
unique_matchesINT出現的獨立比賽數280
avg_placementNUMERIC(4,2)平均排名3.90
stddev_placementNUMERIC(4,2)排名標準差2.15
top4_countINT進入前4的次數170
win_countINT第1名的次數40
created_atTIMESTAMP記錄創建時間2025-01-30 04:00:00

唯一約束: (stat_date, region, patch, trait_name, tier_current)


3.4 daily_composition_stats#

每日陣容統計。

欄位類型說明範例
idSERIAL自增主鍵1
stat_dateDATE統計日期2025-01-29
regionVARCHAR(10)伺服器區域OC1
patchVARCHAR(10)遊戲版本14.24
comp_hashVARCHAR(32)陣容 MD5 雜湊a1b2c3d4e5f6...
championsJSONB英雄列表(已排序)["TFT12_Ahri", "TFT12_Syndra", ...]
games_playedINT使用次數50
avg_placementNUMERIC(4,2)平均排名3.50
stddev_placementNUMERIC(4,2)排名標準差2.00
top4_countINT進入前4的次數30
win_countINT第1名的次數8
created_atTIMESTAMP記錄創建時間2025-01-30 04:00:00

唯一約束: (stat_date, region, patch, comp_hash)


3.5 daily_match_summary#

每日比賽總覽,用於計算比率。

欄位類型說明範例
idSERIAL自增主鍵1
stat_dateDATE統計日期2025-01-29
regionVARCHAR(10)伺服器區域OC1
patchVARCHAR(10)遊戲版本14.24
total_matchesINT總比賽數1000
total_participantsINT總參與者數 (= matches × 8)8000
created_atTIMESTAMP記錄創建時間2025-01-30 04:00:00

唯一約束: (stat_date, region, patch)


4. 基礎物化視圖#

4.1 mv_participants#

展開後的玩家參與記錄(7 天滑動窗口)。

欄位類型說明範例
match_idVARCHAR比賽 IDOC1_123456789
regionVARCHAR從 match_id 提取的區域OC1
puuidVARCHAR玩家唯一識別碼abc123...
placementINT最終排名 (1-8)2
game_datetimeTIMESTAMP比賽時間2025-01-29 15:30:00
game_dateDATE比賽日期2025-01-29
game_lengthFLOAT遊戲時長(秒)1847.5
patchVARCHAR遊戲版本14.24
units_jsonJSONB英雄列表 JSON[{"character_id": "TFT12_Ahri", ...}]
traits_jsonJSONB羈絆列表 JSON[{"name": "Set12_Mage", ...}]
levelINT玩家等級9
gold_leftINT剩餘金幣4
total_damageINT造成的總傷害120

唯一索引: (match_id, puuid)


4.2 mv_units#

展開後的英雄記錄,每個玩家每個英雄一筆。

欄位類型說明範例
match_idVARCHAR比賽 IDOC1_123456789
regionVARCHAR區域OC1
puuidVARCHAR玩家 IDabc123...
placementINT玩家排名2
game_datetimeTIMESTAMP比賽時間2025-01-29 15:30:00
game_dateDATE比賽日期2025-01-29
patchVARCHAR遊戲版本14.24
character_idVARCHAR英雄 IDTFT12_Ahri
tierINT星級 (1/2/3)3
rarityINT稀有度 (0-4)3
itemsJSONB裝備列表["TFT_Item_JeweledGauntlet", ...]
unit_positionBIGINT英雄在陣容中的順序1

唯一索引: (match_id, puuid, unit_position)


4.3 mv_items#

展開後的裝備記錄,每個裝備一筆。

欄位類型說明範例
match_idVARCHAR比賽 IDOC1_123456789
regionVARCHAR區域OC1
puuidVARCHAR玩家 IDabc123...
character_idVARCHAR持有裝備的英雄TFT12_Ahri
tierINT英雄星級3
placementINT玩家排名2
game_datetimeTIMESTAMP比賽時間2025-01-29 15:30:00
game_dateDATE比賽日期2025-01-29
patchVARCHAR遊戲版本14.24
unit_positionBIGINT英雄位置1
item_nameTEXT裝備名稱TFT_Item_JeweledGauntlet
item_positionBIGINT裝備在英雄上的順序1

唯一索引: (match_id, puuid, unit_position, item_position)


4.4 mv_traits#

展開後的羈絆記錄,只包含已激活的羈絆。

欄位類型說明範例
match_idVARCHAR比賽 IDOC1_123456789
regionVARCHAR區域OC1
puuidVARCHAR玩家 IDabc123...
placementINT玩家排名2
game_datetimeTIMESTAMP比賽時間2025-01-29 15:30:00
game_dateDATE比賽日期2025-01-29
patchVARCHAR遊戲版本14.24
trait_nameTEXT羈絆名稱Set12_Mage
num_unitsINT羈絆英雄數量5
tier_currentINT羈絆激活等級2
trait_positionBIGINT羈絆順序1

唯一索引: (match_id, puuid, trait_position)


5. 統計物化視圖#

5.1 mv_champion_global_stats#

英雄全局統計(不分星級)。

欄位類型說明範例
regionVARCHAR區域OC1
patchVARCHAR遊戲版本14.24
character_idVARCHAR英雄 IDTFT12_Ahri
games_inBIGINT出現的獨立比賽數120
games_playedNUMERIC總選用次數(玩家數)150
total_matchesBIGINT期間總比賽數1000
avg_placementNUMERIC(4,2)平均排名3.85
stddev_placementNUMERIC(4,2)排名標準差2.10
top4_rateNUMERIC(5,3)Top4 率0.583
win_rateNUMERIC(5,3)勝率(第1名)0.125
pick_rateNUMERIC(5,3)每場平均選用數0.150
appearance_rateNUMERIC(6,4)出現比例0.1200

唯一索引: (region, patch, character_id)


5.2 mv_champion_detail_stats#

英雄詳細統計(按星級分組)。

欄位類型說明範例
regionVARCHAR區域OC1
patchVARCHAR遊戲版本14.24
character_idVARCHAR英雄 IDTFT12_Ahri
tierINT星級3
games_inBIGINT出現的獨立比賽數50
games_playedNUMERIC總選用次數55
total_matchesBIGINT期間總比賽數1000
avg_placementNUMERIC(4,2)平均排名2.80
stddev_placementNUMERIC(4,2)排名標準差1.80
top4_rateNUMERIC(5,3)Top4 率0.720
win_rateNUMERIC(5,3)勝率0.180
pick_rateNUMERIC(5,3)每場平均選用數0.055
appearance_rateNUMERIC(6,4)出現比例0.0500

唯一索引: (region, patch, character_id, tier)


5.3 mv_item_stats#

裝備統計。

欄位類型說明範例
regionVARCHAR區域OC1
patchVARCHAR遊戲版本14.24
item_nameTEXT裝備名稱TFT_Item_JeweledGauntlet
games_playedBIGINT使用次數500
games_inBIGINT出現的獨立比賽數400
total_matchesBIGINT期間總比賽數1000
avg_placementNUMERIC(4,2)平均排名4.20
stddev_placementNUMERIC(4,2)排名標準差2.30
top4_rateNUMERIC(5,3)Top4 率0.500
pick_rateNUMERIC(5,3)每場平均使用數0.500
best_championsJSONB最佳使用英雄 Top 3見下方

best_champions 結構:

[
{"champion": "TFT12_Ahri", "avg_placement": 2.80, "usage": 150},
{"champion": "TFT12_Syndra", "avg_placement": 3.20, "usage": 120},
{"champion": "TFT12_Vex", "avg_placement": 3.50, "usage": 100}
]

唯一索引: (region, patch, item_name)


5.4 mv_trait_stats#

羈絆統計。

欄位類型說明範例
regionVARCHAR區域OC1
patchVARCHAR遊戲版本14.24
trait_nameTEXT羈絆名稱Set12_Mage
tier_currentINT羈絆激活等級2
games_playedBIGINT使用次數300
games_inBIGINT出現的獨立比賽數280
total_matchesBIGINT期間總比賽數1000
avg_placementNUMERIC(4,2)平均排名3.90
stddev_placementNUMERIC(4,2)排名標準差2.15
top4_rateNUMERIC(5,3)Top4 率0.567
win_rateNUMERIC(5,3)勝率0.133
pick_rateNUMERIC(5,3)每場平均使用數0.300

唯一索引: (region, patch, trait_name, tier_current)


5.5 mv_composition_stats#

陣容統計。

欄位類型說明範例
comp_hashVARCHAR(32)陣容 MD5 雜湊a1b2c3d4...
regionVARCHAR區域OC1
patchVARCHAR遊戲版本14.24
championsJSONB英雄列表(已排序)["TFT12_Ahri", ...]
core_unitsJSONB典型 3 星英雄["TFT12_Ahri"]
main_traitsJSONB主要羈絆見下方
games_playedBIGINT使用次數50
avg_placementNUMERIC(4,2)平均排名3.50
stddev_placementNUMERIC(4,2)排名標準差2.00
top4_countBIGINTTop4 次數30
win_countBIGINT第1名次數8
top4_rateNUMERIC(5,3)Top4 率0.600
win_rateNUMERIC(5,3)勝率0.160

main_traits 結構:

[
{"name": "Set12_Mage", "tier": 3},
{"name": "Set12_Arcana", "tier": 2},
{"name": "Set12_Scholar", "tier": 1}
]

唯一索引: (comp_hash)


5.6 mv_item_champion_effects#

裝備對英雄的效果分析。

欄位類型說明範例
regionVARCHAR區域OC1
patchVARCHAR遊戲版本14.24
character_idVARCHAR英雄 IDTFT12_Ahri
tierINT星級3
item_nameTEXT裝備名稱TFT_Item_JeweledGauntlet
effect_sizeNUMERIC(5,3)效果大小(無裝 - 有裝)0.850
sample_sizeBIGINT樣本數200
with_item_avgNUMERIC(4,2)有裝備時平均排名2.80
with_item_stddevNUMERIC(4,2)有裝備時排名標準差1.50
without_item_avgNUMERIC(4,2)無裝備時平均排名3.65
without_item_stddevNUMERIC(4,2)無裝備時排名標準差2.10

計算公式:

effect_size = without_item_avg - with_item_avg

正值表示裝備有正面效果。

唯一索引: (region, patch, character_id, tier, item_name)


6. API 視圖#

6.1 api_champion_global_rankings#

英雄全局排名 API。

mv_champion_global_stats 相同結構,按 avg_placement 排序。


6.2 api_champion_detail_rankings#

英雄詳細排名 API(按星級)。

mv_champion_detail_stats 相同結構,按 character_id, tier DESC 排序。


6.3 api_item_rankings#

裝備排名 API。

mv_item_stats 相同結構,按 avg_placement 排序。


6.4 api_trait_rankings#

羈絆排名 API。

mv_trait_stats 相同結構,按 avg_placement 排序。


6.5 api_composition_rankings#

陣容排名 API。

欄位類型說明
idVARCHAR(32)陣容 ID (= comp_hash)
regionVARCHAR區域
patchVARCHAR版本
championsJSONB英雄列表
core_unitsJSONB核心英雄
main_traitsJSONB主要羈絆
games_playedBIGINT使用次數
avg_placementNUMERIC平均排名
stddev_placementNUMERIC排名標準差
top4_rateNUMERICTop4 率
win_rateNUMERIC勝率

6.6 api_champion_history#

英雄歷史數據 API(從每日表讀取)。

daily_champion_stats 類似,額外計算 top4_ratewin_rate


6.7 api_champion_trend#

英雄趨勢 API(按天聚合)。

欄位類型說明
stat_dateDATE日期
regionVARCHAR區域
patchVARCHAR版本
character_idVARCHAR英雄 ID
total_picksBIGINT總選用數
total_games_inBIGINT總出現場次
total_matchesINT總比賽數
weighted_avg_placementNUMERIC加權平均排名
top4_rateNUMERICTop4 率
win_rateNUMERIC勝率

6.8 api_item_trend#

裝備趨勢 API(按天聚合)。

欄位類型說明
stat_dateDATE日期
regionVARCHAR區域
patchVARCHAR版本
item_nameVARCHAR裝備名稱
total_usageBIGINT總使用數
total_games_inBIGINT總出現場次
weighted_avg_placementNUMERIC加權平均排名
top4_rateNUMERICTop4 率

7. 函數#

7.1 generate_daily_snapshot(target_date DATE)#

生成指定日期的每日快照。

參數類型預設值說明
target_dateDATE昨天要生成快照的日期

返回: TEXT - 執行結果摘要

範例:

SELECT generate_daily_snapshot('2025-01-29');
-- 返回: 'Daily snapshot for 2025-01-29 completed: summary=2, champions=150, items=80, traits=45, comps=30'

7.2 cleanup_old_matches(retention_days INT)#

清理超過保留期限的原始比賽數據。

參數類型預設值說明
retention_daysINT7保留天數

返回: TEXT - 刪除數量

範例:

SELECT cleanup_old_matches(7);
-- 返回: 'Deleted 500 matches older than 7 days'

7.3 refresh_all_stats()#

完整刷新流程:生成快照 → 清理舊數據 → 刷新視圖。

返回: TEXT - 執行結果摘要

範例:

SELECT refresh_all_stats();

7.4 backfill_daily_snapshots(days_back INT)#

回填歷史每日快照。

參數類型預設值說明
days_backINT7回填天數

返回: TEXT - 執行結果摘要

範例:

SELECT backfill_daily_snapshots(14);

7.5 get_top_compositions(...)#

查詢熱門陣容。

參數類型預設值說明
p_regionVARCHARNULL篩選區域(NULL = 全部)
p_patchVARCHARNULL篩選版本(NULL = 全部)
p_daysINT7查詢天數
p_limitINT20返回數量

返回: 表格

欄位類型
regionVARCHAR
patchVARCHAR
championsJSONB
total_gamesBIGINT
avg_placementNUMERIC
top4_rateNUMERIC
win_rateNUMERIC

範例:

SELECT * FROM get_top_compositions('OC1', '14.24', 7, 10);

8. 索引清單#

每日持久化表索引#

索引名稱欄位
daily_champion_statsidx_daily_champion_datestat_date
daily_champion_statsidx_daily_champion_region_patchregion, patch
daily_champion_statsidx_daily_champion_charactercharacter_id
daily_item_statsidx_daily_item_datestat_date
daily_item_statsidx_daily_item_region_patchregion, patch
daily_trait_statsidx_daily_trait_datestat_date
daily_trait_statsidx_daily_trait_region_patchregion, patch
daily_composition_statsidx_daily_comp_datestat_date
daily_composition_statsidx_daily_comp_region_patchregion, patch
daily_match_summaryidx_daily_summary_datestat_date

物化視圖索引#

視圖索引名稱欄位類型
mv_participantsidx_mv_participants_uniquematch_id, puuidUNIQUE
mv_participantsidx_mv_participants_datetimegame_datetime
mv_participantsidx_mv_participants_dategame_date
mv_participantsidx_mv_participants_regionregion
mv_participantsidx_mv_participants_patchpatch
mv_unitsidx_mv_units_uniquematch_id, puuid, unit_positionUNIQUE
mv_unitsidx_mv_units_charactercharacter_id
mv_unitsidx_mv_units_tiertier
mv_unitsidx_mv_units_region_patchregion, patch
mv_itemsidx_mv_items_uniquematch_id, puuid, unit_position, item_positionUNIQUE
mv_itemsidx_mv_items_nameitem_name
mv_itemsidx_mv_items_charactercharacter_id
mv_itemsidx_mv_items_region_patchregion, patch
mv_traitsidx_mv_traits_uniquematch_id, puuid, trait_positionUNIQUE
mv_traitsidx_mv_traits_nametrait_name
mv_traitsidx_mv_traits_region_patchregion, patch
mv_champion_global_statsidx_champion_global_uniqueregion, patch, character_idUNIQUE
mv_champion_detail_statsidx_champion_detail_uniqueregion, patch, character_id, tierUNIQUE
mv_item_statsidx_item_stats_uniqueregion, patch, item_nameUNIQUE
mv_trait_statsidx_trait_stats_uniqueregion, patch, trait_name, tier_currentUNIQUE
mv_composition_statsidx_comp_stats_uniquecomp_hashUNIQUE
mv_item_champion_effectsidx_item_effects_uniqueregion, patch, character_id, tier, item_nameUNIQUE

9. 數據關係圖#

┌─────────────────────────────────────────────────────────────────────────────┐
│ tft_matches │
│ (原始 JSON 數據) │
└──────────────────────────────────┬──────────────────────────────────────────┘
│ JSON 展開
┌─────────────────────────────────────────────────────────────────────────────┐
│ mv_participants │
│ (每個玩家每場比賽一筆記錄) │
└──────────┬──────────────────────┬──────────────────────┬────────────────────┘
│ │ │
│ units_json │ traits_json │ units_json
│ 展開 │ 展開 │ 聚合排序
▼ ▼ ▼
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ mv_units │ │ mv_traits │ │ compositions │
│ (每個英雄一筆) │ │ (每個羈絆一筆) │ │ (CTE) │
└────────┬─────────┘ └────────┬─────────┘ └────────┬─────────┘
│ │ │
│ items 展開 │ │
▼ │ │
┌──────────────────┐ │ │
│ mv_items │ │ │
│ (每個裝備一筆) │ │ │
└────────┬─────────┘ │ │
│ │ │
│ 聚合統計 │ 聚合統計 │ 聚合統計
▼ ▼ ▼
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ mv_item_stats │ │ mv_trait_stats │ │mv_composition_ │
│ │ │ │ │ stats │
└──────────────────┘ └──────────────────┘ └──────────────────┘
│ 比較有/無裝備
┌──────────────────┐
│mv_item_champion_ │
│ effects │
└──────────────────┘
┌─────────────────────────────────────────────────────────────────────────────┐
│ 每日快照流程 │
├─────────────────────────────────────────────────────────────────────────────┤
│ │
│ mv_participants ─────┬──────> daily_match_summary │
│ │ │ │
│ │ ├──────> daily_champion_stats │
│ ▼ │ │
│ mv_units ──────────┤ │
│ │ │ │
│ ▼ ├──────> daily_item_stats │
│ mv_items ──────────┤ │
│ │ │
│ mv_traits ─────────┼──────> daily_trait_stats │
│ │ │
│ compositions ──────┴──────> daily_composition_stats │
│ │
└─────────────────────────────────────────────────────────────────────────────┘

附錄:常用查詢範例#

A. 查看特定區域/版本的英雄排名#

SELECT * FROM api_champion_global_rankings
WHERE region = 'OC1' AND patch = '14.24'
ORDER BY avg_placement
LIMIT 20;

B. 查看英雄各星級表現#

SELECT * FROM api_champion_detail_rankings
WHERE character_id = 'TFT12_Ahri';

C. 驗證場次一致性#

WITH global AS (
SELECT character_id, games_played as global_total
FROM mv_champion_global_stats
WHERE region = 'OC1' AND patch = '14.24'
),
detail AS (
SELECT character_id, SUM(games_played) as detail_total
FROM mv_champion_detail_stats
WHERE region = 'OC1' AND patch = '14.24'
GROUP BY character_id
)
SELECT g.character_id, g.global_total, d.detail_total
FROM global g
JOIN detail d ON g.character_id = d.character_id
WHERE g.global_total != d.detail_total;
-- 應該返回空結果

D. 查看英雄歷史趨勢#

SELECT * FROM api_champion_trend
WHERE character_id = 'TFT12_Ahri' AND region = 'OC1'
ORDER BY stat_date DESC
LIMIT 14;

E. 查看裝備最佳使用者#

SELECT item_name, best_champions
FROM api_item_rankings
WHERE region = 'OC1' AND patch = '14.24'
LIMIT 10;

F. 查看熱門陣容#

SELECT * FROM get_top_compositions('OC1', '14.24', 7, 10);
TFT MetaAscension - 資料庫設計
https://www.matchaazukii.com/posts/data_dictionary/
作者
抹茶紅豆
發佈於
2026-01-31
許可協議
CC BY-NC-SA 4.0