d6b2e417f4
- Compare the Hot zone and Entity bridge (capabilities, 1M-listing benchmark, per-site usage: no 2meet-DO site uses the Hot zone; only legacy dev34 / dev10 hold Hot copies of postmeta) - Decision (user, 2026-09-26): converge on Entity; freeze the Hot zone, skip PR-026, keep PR-027, move Hot-only HivePress fields into new Entity groups, stop Hot registrations - PR: PR-025
4.4 KiB
4.4 KiB
ADR-003:Hot zone 與 Entity 表收斂
- 狀態:已接受(2026-09-26,選項 A)
- 日期:2026-09-26
- 相關:
BENCHMARK-SCALE.md(O-3、O-5)、backlog PR-025〜PR-030
背景
post 的高頻欄位有兩套扁平化機制,資料可能存兩份:
| Hot zone | Entity bridge | |
|---|---|---|
| 表 | wp_wpdo_hot_{post_type}(每個 post type 一張) |
wp_wpdo_post_{group}(每個群組一張) |
| 註冊 | TMDO_Schema_Registry(zone = hot) |
TMDO_Entity_Registry::register_group() |
| 寫入 | TMDO_Sync_Bridge(zone 模組進入 dual_write 後) |
TMDO_Hook_Bus(實體 mode ≥ dual_write) |
| 查詢改寫 | TMDO_Query_Router(hot_* 模組 cutover 後) |
TMDO_Post_Query_Router(post mode ≥ shadow_read) |
| 生命週期 | 每個 zone 模組 7 狀態 FSM | 每個實體 4 模式(disabled → aeav_only) |
| 涵蓋實體 | 只有 post | post、user、term、comment |
| 可完全取代原生 meta | 否(cutover 後原生仍保留) | 是(aeav_only) |
| 其他 | 單欄 indexed、自訂 data_type |
post_type 範圍(PR-033)、schema hash、衝突偵測、孤兒還原、回寫原生(PR-017/018/031) |
Warm(瀏覽數 TTL)、Cold(JSON blob)、Archive(已刪除文章的 meta)是 Entity 沒有的能力,不在本決策範圍,保持原狀。
事實
效能(100k vendor / 1M listing,BENCHMARK-SCALE.md):
| 情境 | Hot | Entity |
|---|---|---|
| 價格區間搜尋 p50 | 558 ms | 652 ms |
| 價格區間 + verified p50 | 277 ms(有複合索引) | 337 ms |
| vendor 名下 listing p50 | 3,405 ms(無索引) | 0.28 ms |
| 單筆 / 列表預載 | 相同 | 相同 |
| 容量 | 229 MB | 379 MB |
唯一 Hot 領先的是有複合索引的情境;Entity 支援複合索引後(PR-027)即可追平。
各站使用現況(2026-09-26 唯讀查詢):
| 站 | Hot / Cold 表 | zone 模組 | post entity |
|---|---|---|---|
| dev20 / dev21 / dev22 | 無 | 全 idle | aeav_only(dev21 約 400 萬列) |
| dev23 / 24 / 30 / 31 / 40 | 無 | 全 idle | disabled |
| dev34(舊 WPDO 1.3.37) | hot_hp_listing 486、hot_hp_vendor 233 | cutover | disabled |
| dev10 DB(舊版) | hot_hp_listing 491、hot_hp_vendor 231 | cutover | aeav_only(約 3,900 列) |
- 沒有任何 2meet-DO 站在用 Hot zone;有扁平資料的站全部走 Entity。
- 只有兩個舊系統的站有 Hot 資料,而它們在 cutover 仍雙寫 postmeta,Hot 表只是副本(PR-022 已確認以 postmeta 為準)。
只由 Hot zone 註冊、Entity 群組沒有涵蓋的 HP 欄位:listing / request 的 hp_drafted;bookings 的 hp_start_time、hp_end_time、hp_quantity;memberships 的 hp_expire_period、hp_primary、hp_expired_time。
選項
A. 收斂到 Entity(建議) post 高頻欄位只用 Entity。Hot zone 凍結:不再新增註冊,程式碼暫留只為讀取舊資料,確認沒有站使用後再移除。
- 優點:一套路由、一份資料;Entity 能力是 Hot 的超集;現況已經全部在用 Entity,不需要搬資料。
- 代價:Hot 獨有的欄位(上面那幾個)要改成新的 Entity 群組;情境 2 要靠 PR-027 的複合索引追平。
B. 兩套並存 維持現狀。代價是兩套寫入和查詢路徑都要維護,同一個 key 可能存兩份,O-3 之類的最佳化要做兩次。
C. 收斂到 Hot 不可行:Hot 只支援 post,也沒有 aeav_only、範圍宣告、回寫工具。
建議(選項 A)的後續步驟
- PR-026(Hot 表 bigint 索引)標為
[!]不做:沒有站在用 Hot zone。 - PR-027(Entity 複合索引)照常做:這是情境 2 追平 Hot 的方式。
- 新增 PR(HP AddOn):把 Hot 獨有的欄位改註冊成新的 Entity 群組(例如
hp_booking_core、hp_membership_core,以及 listing / request 的補充群組);既有群組的定義不能改。 - 新增 PR(HP AddOn):HP adapter 停止註冊 hot 欄位;核心對 zone = hot 的新註冊記錄 deprecated 警告。
- 之後:dev34(PR-022)和 dev10 DB(PR-023)遷出後,再評估移除
TMDO_Zone_Hot、TMDO_Sync_Bridge的 hot 路徑與TMDO_Query_Router。
決定
選項 A:收斂到 Entity。(使用者 2026-09-26 決定)
Hot zone 凍結,依上面的後續步驟執行;backlog 已同步調整(PR-026 標為 [!],新增 HP AddOn 的兩個 PR)。