本文件描述 Amazon 賣家產品監控與優化工具的資料庫架構設計,包含資料模型、表結構、索引策略和優化方案。
主資料庫: PostgreSQL 15
- 關聯式資料庫,支持 ACID 事務
- JSON/JSONB 支持,適合半結構化資料
- 強大的索引和查詢優化能力
- 成熟的生態系統和工具支持
快取資料庫: Redis 7
- 高效能記憶體快取
- 支持多種資料結構
- 作為消息佇列和任務調度
- 表名: 小寫蛇形命名,使用複數形式
- 欄位: 小寫蛇形命名
- 主鍵:
id或{table}_id - 外鍵:
{referenced_table}_id - 索引:
idx_{table}_{columns} - 約束:
{table}_{constraint_type}_{columns}
erDiagram
%% 用戶管理模組
users {
uuid id PK
varchar email UK "用戶郵箱"
varchar password_hash "密碼雜湊"
varchar company_name "公司名稱"
varchar plan_type "計劃類型"
boolean is_active "帳戶狀態"
boolean email_verified "郵箱驗證"
timestamp created_at
timestamp updated_at
timestamp last_login_at
}
%% 產品追蹤模組
products {
uuid id PK
varchar asin UK "Amazon產品編號"
text title "產品標題"
varchar brand "品牌"
varchar category "主類目"
varchar subcategory "子類目"
text description "產品描述"
jsonb bullet_points "產品特點"
jsonb images "產品圖片"
jsonb dimensions "產品尺寸"
numeric weight "產品重量"
varchar manufacturer "製造商"
varchar model_number "型號"
varchar upc "UPC碼"
varchar ean "EAN碼"
integer bsr "當前BSR排名"
varchar bsr_category "BSR類目"
numeric rating "當前評分"
integer review_count "評論數"
numeric current_price "當前價格"
numeric buy_box_price "Buy Box價格"
varchar currency "貨幣"
boolean is_on_sale "是否促銷"
numeric discount_percentage "折扣百分比"
boolean is_available "是否有庫存"
varchar availability_text "庫存狀態"
varchar seller_name "賣家名稱"
boolean is_prime "是否支持Prime"
boolean is_fba "是否FBA"
text url "產品頁面URL"
text image_url "主圖片URL"
timestamp first_seen_at
timestamp last_updated_at
timestamp last_updated
varchar data_source
}
tracked_products {
uuid id PK
uuid user_id FK
uuid product_id FK
varchar alias "產品別名"
boolean is_active "追蹤狀態"
varchar tracking_frequency "追蹤頻率"
numeric price_change_threshold "價格變化閾值"
numeric bsr_change_threshold "BSR變化閾值"
timestamp created_at
timestamp updated_at
timestamp last_checked_at
timestamp next_check_at
}
%% 歷史數據表(分區表)
product_price_history {
uuid id PK
uuid product_id FK
numeric price "價格"
varchar currency "貨幣"
numeric buy_box_price "Buy Box價格"
boolean is_on_sale "是否促銷"
numeric discount_percentage "折扣百分比"
timestamp recorded_at PK "記錄時間"
varchar data_source "數據來源"
}
product_ranking_history {
uuid id PK
uuid product_id FK
varchar category "類目"
integer bsr_rank "BSR排名"
varchar bsr_category "BSR類目"
numeric rating "評分"
integer review_count "評論數"
timestamp recorded_at PK "記錄時間"
varchar data_source "數據來源"
}
product_review_history {
uuid id PK
uuid product_id FK
integer review_count "評論總數"
numeric average_rating "平均評分"
integer five_star_count "5星評論"
integer four_star_count "4星評論"
integer three_star_count "3星評論"
integer two_star_count "2星評論"
integer one_star_count "1星評論"
timestamp recorded_at PK "記錄時間"
varchar data_source "數據來源"
}
product_buybox_history {
uuid id PK
uuid product_id FK
varchar winner_seller "獲勝賣家"
numeric winner_price "Buy Box價格"
varchar currency "貨幣"
boolean is_prime "是否支持Prime"
boolean is_fba "是否FBA"
text shipping_info "配送信息"
varchar availability_text "庫存狀態"
timestamp recorded_at PK "記錄時間"
varchar data_source "數據來源"
}
product_anomaly_events {
uuid id PK
uuid product_id FK
varchar asin "產品ASIN"
varchar event_type "事件類型"
numeric old_value "舊值"
numeric new_value "新值"
numeric change_percentage "變化百分比"
numeric threshold "觸發閾值"
varchar severity "嚴重程度"
jsonb metadata "額外元數據"
boolean processed "是否已處理"
timestamp processed_at "處理時間"
timestamp created_at "檢測時間"
}
%% 競品分析模組
competitor_analysis_groups {
uuid id PK
uuid user_id FK
uuid main_product_id FK
varchar name "分析組名稱"
text description "描述"
jsonb analysis_metrics "分析指標"
boolean is_active "狀態"
timestamp created_at
timestamp updated_at
timestamp last_analysis_at
timestamp next_analysis_at
}
competitor_products {
uuid id PK
uuid analysis_group_id FK
uuid product_id FK
timestamp added_at "加入時間"
}
competitor_analysis_results {
uuid id PK
uuid analysis_group_id FK
jsonb analysis_data "分析數據"
jsonb insights "分析洞察"
jsonb recommendations "優化建議"
varchar status "狀態"
timestamp started_at
timestamp completed_at
text error_message "錯誤信息"
varchar task_id "異步任務ID"
varchar queue_id "隊列任務ID"
}
%% 優化建議模組
optimization_analyses {
uuid id PK
uuid user_id FK
uuid product_id FK
varchar analysis_type "分析類型"
jsonb focus_areas "關注領域"
varchar status "狀態"
integer overall_score "總體分數"
timestamp started_at
timestamp completed_at
}
optimization_suggestions {
uuid id PK
uuid analysis_id FK
varchar category "建議類別"
varchar priority "優先級"
integer impact_score "影響分數"
varchar title "建議標題"
text description "建議描述"
jsonb action_items "行動項目"
timestamp created_at
}
%% 關聯關係
users ||--o{ tracked_products : "用戶追蹤產品"
users ||--o{ competitor_analysis_groups : "用戶創建分析組"
users ||--o{ optimization_analyses : "用戶創建優化分析"
products ||--o{ tracked_products : "產品被追蹤"
products ||--o{ product_price_history : "產品價格歷史"
products ||--o{ product_ranking_history : "產品排名歷史"
products ||--o{ product_review_history : "產品評論歷史"
products ||--o{ product_buybox_history : "產品Buy Box歷史"
products ||--o{ product_anomaly_events : "產品異常事件"
products ||--o{ competitor_products : "產品作為競品"
products ||--o{ optimization_analyses : "產品優化分析"
competitor_analysis_groups ||--|| products : "主產品"
competitor_analysis_groups ||--o{ competitor_products : "分析組包含競品"
competitor_analysis_groups ||--o{ competitor_analysis_results : "分析組結果"
optimization_analyses ||--o{ optimization_suggestions : "分析生成建議"
erDiagram
%% 簡化版 - 突出核心關聯
users ||--o{ tracked_products : "追蹤"
users ||--o{ competitor_analysis_groups : "創建分析組"
products ||--o{ tracked_products : "被追蹤"
products ||--o{ product_price_history : "價格歷史"
products ||--o{ product_ranking_history : "排名歷史"
products ||--o{ product_anomaly_events : "異常事件"
competitor_analysis_groups ||--|| products : "主產品"
competitor_analysis_groups ||--o{ competitor_products : "競品列表"
competitor_products }o--|| products : "競品引用"
competitor_analysis_groups ||--o{ competitor_analysis_results : "分析結果"
erDiagram
%% 分區表示例 - 價格歷史表
product_price_history {
string table_name "主表"
}
product_price_history_2025_08 {
string partition "2025年8月分區"
}
product_price_history_2025_09 {
string partition "2025年9月分區"
}
product_price_history_2025_10 {
string partition "2025年10月分區"
}
product_price_history_2025_11 {
string partition "2025年11月分區"
}
product_price_history_2025_12 {
string partition "2025年12月分區"
}
product_price_history_2026_01 {
string partition "2026年1月分區"
}
%% 分區關係
product_price_history ||--|| product_price_history_2025_08 : "inherits"
product_price_history ||--|| product_price_history_2025_09 : "inherits"
product_price_history ||--|| product_price_history_2025_10 : "inherits"
product_price_history ||--|| product_price_history_2025_11 : "inherits"
product_price_history ||--|| product_price_history_2025_12 : "inherits"
product_price_history ||--|| product_price_history_2026_01 : "inherits"
id(UUID): 主鍵,自動生成email(VARCHAR): 唯一索引,用戶登入憑證password_hash(VARCHAR): bcrypt 加密密碼company_name(VARCHAR): 公司名稱plan_type(VARCHAR): 計劃類型,默認 'basic'is_active(BOOLEAN): 帳戶狀態,默認 trueemail_verified(BOOLEAN): 郵箱驗證狀態,默認 falsecreated_at(TIMESTAMP): 註冊時間,自動設置updated_at(TIMESTAMP): 更新時間,自動更新last_login_at(TIMESTAMP): 最後登入時間
id(UUID): 主鍵,自動生成asin(VARCHAR): Amazon 產品編號,10位字符,唯一索引title(TEXT): 產品標題brand(VARCHAR): 品牌category(VARCHAR): 主類目subcategory(VARCHAR): 子類目description(TEXT): 產品描述bullet_points(JSONB): 產品特點列表images(JSONB): 產品圖片URL列表dimensions(JSONB): 產品尺寸信息weight(NUMERIC): 產品重量manufacturer(VARCHAR): 製造商model_number(VARCHAR): 型號upc(VARCHAR): UPC碼ean(VARCHAR): EAN碼bsr(INTEGER): 當前 BSR 排名bsr_category(VARCHAR): BSR 類目rating(NUMERIC): 當前評分review_count(INTEGER): 評論數,默認 0current_price(NUMERIC): 當前價格buy_box_price(NUMERIC): Buy Box 價格currency(VARCHAR): 貨幣,默認 'USD'is_on_sale(BOOLEAN): 是否促銷,默認 falsediscount_percentage(NUMERIC): 折扣百分比is_available(BOOLEAN): 是否有庫存,默認 trueavailability_text(VARCHAR): 庫存狀態文本seller_name(VARCHAR): 賣家名稱is_prime(BOOLEAN): 是否支持 Prime,默認 falseis_fba(BOOLEAN): 是否 FBA,默認 falseurl(TEXT): 產品頁面URLimage_url(TEXT): 主圖片URLfirst_seen_at(TIMESTAMP): 首次發現時間last_updated_at(TIMESTAMP): 最後更新時間last_updated(TIMESTAMP): 最後更新時間(兼容欄位)data_source(VARCHAR): 數據來源,默認 'apify'
id(UUID): 主鍵,自動生成user_id(UUID): 外鍵 -> users.idproduct_id(UUID): 外鍵 -> products.idalias(VARCHAR): 產品別名is_active(BOOLEAN): 追蹤狀態,默認 truetracking_frequency(VARCHAR): 追蹤頻率,'hourly'/'daily'/'weekly',默認 'daily'price_change_threshold(NUMERIC): 價格變化閾值百分比,默認 10.0,範圍 0-100bsr_change_threshold(NUMERIC): BSR變化閾值百分比,默認 30.0,範圍 0-100created_at(TIMESTAMP): 開始追蹤時間updated_at(TIMESTAMP): 更新時間last_checked_at(TIMESTAMP): 最後檢查時間next_check_at(TIMESTAMP): 下次檢查時間
id(UUID): 主鍵,自動生成product_id(UUID): 外鍵 -> products.idprice(NUMERIC): 價格,必填currency(VARCHAR): 貨幣,默認 'USD'buy_box_price(NUMERIC): Buy Box 價格is_on_sale(BOOLEAN): 是否促銷,默認 falsediscount_percentage(NUMERIC): 折扣百分比recorded_at(TIMESTAMP): 記錄時間,主鍵之一data_source(VARCHAR): 數據來源,默認 'apify'- 分區策略: 按月分區 (YYYY_MM),支持 2025-08 到 2026-08
- 複合主鍵: (id, recorded_at)
id(UUID): 主鍵,自動生成product_id(UUID): 外鍵 -> products.idcategory(VARCHAR): 類目,必填bsr_rank(INTEGER): BSR 排名bsr_category(VARCHAR): BSR 類目rating(NUMERIC): 評分review_count(INTEGER): 評論數,默認 0recorded_at(TIMESTAMP): 記錄時間,主鍵之一data_source(VARCHAR): 數據來源,默認 'apify'- 分區策略: 按月分區 (YYYY_MM),支持 2025-08 到 2026-08
- 複合主鍵: (id, recorded_at)
id(UUID): 主鍵,自動生成product_id(UUID): 外鍵 -> products.idreview_count(INTEGER): 評論總數,默認 0average_rating(NUMERIC): 平均評分,範圍 0-5five_star_count(INTEGER): 5星評論數,默認 0four_star_count(INTEGER): 4星評論數,默認 0three_star_count(INTEGER): 3星評論數,默認 0two_star_count(INTEGER): 2星評論數,默認 0one_star_count(INTEGER): 1星評論數,默認 0recorded_at(TIMESTAMP): 記錄時間,主鍵之一data_source(VARCHAR): 數據來源,默認 'apify'- 分區策略: 按月分區 (YYYY_MM),支持 2025-08 到 2026-08
- 複合主鍵: (id, recorded_at)
- 約束: average_rating >= 0 AND average_rating <= 5
id(UUID): 主鍵,自動生成product_id(UUID): 外鍵 -> products.idwinner_seller(VARCHAR): 獲勝賣家名稱winner_price(NUMERIC): Buy Box 價格,必須 >= 0currency(VARCHAR): 貨幣,默認 'USD'is_prime(BOOLEAN): 是否支持 Prime,默認 falseis_fba(BOOLEAN): 是否 FBA,默認 falseshipping_info(TEXT): 配送信息availability_text(VARCHAR): 庫存狀態recorded_at(TIMESTAMP): 記錄時間,主鍵之一data_source(VARCHAR): 數據來源,默認 'apify'- 分區策略: 按月分區 (YYYY_MM),支持 2025-08 到 2026-08
- 複合主鍵: (id, recorded_at)
- 約束: winner_price IS NULL OR winner_price >= 0
id(UUID): 主鍵,自動生成product_id(UUID): 外鍵 -> products.idasin(VARCHAR): 產品ASIN,必填event_type(VARCHAR): 事件類型,必填old_value(NUMERIC): 舊值new_value(NUMERIC): 新值change_percentage(NUMERIC): 變化百分比threshold(NUMERIC): 觸發閾值severity(VARCHAR): 嚴重程度,默認 'info'metadata(JSONB): 額外元數據processed(BOOLEAN): 是否已處理,默認 falseprocessed_at(TIMESTAMP): 處理時間created_at(TIMESTAMP): 檢測時間,必填
id(UUID): 主鍵,自動生成user_id(UUID): 外鍵 -> users.idmain_product_id(UUID): 外鍵 -> products.idname(VARCHAR): 分析組名稱,必填description(TEXT): 描述analysis_metrics(JSONB): 分析指標,默認 ["price", "bsr", "rating", "features"]is_active(BOOLEAN): 狀態,默認 truecreated_at(TIMESTAMP): 建立時間updated_at(TIMESTAMP): 更新時間last_analysis_at(TIMESTAMP): 最後分析時間next_analysis_at(TIMESTAMP): 下次分析時間
id(UUID): 主鍵analysis_group_id(UUID): 外鍵 -> competitor_analysis_groups.idproduct_id(UUID): 外鍵 -> products.idadded_at(TIMESTAMP): 加入時間- 唯一約束:
(analysis_group_id, product_id)
id(UUID): 主鍵,自動生成analysis_group_id(UUID): 外鍵 -> competitor_analysis_groups.idanalysis_data(JSONB): 多維度分析數據(可為空)insights(JSONB): 分析洞察recommendations(JSONB): 優化建議status(VARCHAR): 狀態,默認 'pending',可選值: pending/queued/processing/completed/failedstarted_at(TIMESTAMP): 開始時間completed_at(TIMESTAMP): 完成時間error_message(TEXT): 錯誤信息task_id(VARCHAR): 異步任務IDqueue_id(VARCHAR): 隊列任務ID
id(UUID): 主鍵,自動生成user_id(UUID): 外鍵 -> users.idproduct_id(UUID): 外鍵 -> products.idanalysis_type(VARCHAR): 分析類型,默認 'comprehensive'focus_areas(JSONB): 關注領域,默認 ["title", "pricing", "description", "images", "keywords"]status(VARCHAR): 狀態,默認 'pending'overall_score(INTEGER): 總體分數started_at(TIMESTAMP): 開始時間completed_at(TIMESTAMP): 完成時間
id(UUID): 主鍵,自動生成analysis_id(UUID): 外鍵 -> optimization_analyses.idcategory(VARCHAR): 建議類別,必填priority(VARCHAR): 優先級,必填impact_score(INTEGER): 影響分數,必填title(VARCHAR): 建議標題,必填description(TEXT): 建議描述,必填action_items(JSONB): 行動項目created_at(TIMESTAMP): 創建時間
注意: 通知管理相關表格在當前數據庫結構中尚未實現,建議未來版本添加:
id(UUID): 主鍵user_id(UUID): 外鍵 -> users.idtype(VARCHAR): 通知類型title(VARCHAR): 標題message(TEXT): 內容data(JSONB): 相關數據is_read(BOOLEAN): 是否已讀created_at(TIMESTAMP): 建立時間
id(UUID): 主鍵user_id(UUID): 外鍵 -> users.idemail_enabled(BOOLEAN): Email 通知push_enabled(BOOLEAN): 推送通知notification_types(JSONB): 啟用的通知類型updated_at(TIMESTAMP): 更新時間
所有表的 id 欄位自動建立主鍵索引
users.email- 確保郵箱唯一性products.asin- 確保ASIN唯一性(10位字符長度約束)- 注意: tracked_products 和 competitor_products 未設置複合唯一索引
idx_tracked_products_user_active: (user_id, is_active) - 查詢用戶活躍追蹤idx_price_history_product_time: (product_id, recorded_at DESC) - 價格歷史查詢idx_ranking_history_product_time: (product_id, recorded_at DESC) - 排名歷史查詢idx_review_history_product_time: (product_id, recorded_at DESC) - 評論歷史查詢idx_buybox_history_product_time: (product_id, recorded_at DESC) - Buy Box歷史查詢idx_anomaly_events_product_time: (product_id, created_at DESC) - 異常事件查詢idx_competitor_analysis_results_task_id: (task_id) - 異步任務查詢(已創建)
idx_products_active_bsr: (current_bsr) WHERE is_active = trueidx_anomaly_events_unnotified: (product_id) WHERE is_notified = false
以下表已按月分區實現,格式為 table_name_YYYY_MM:
product_price_history 分區:
product_price_history_2025_08到product_price_history_2026_08- 複合主鍵: (id, recorded_at)
product_ranking_history 分區:
product_ranking_history_2025_08到product_ranking_history_2026_08- 複合主鍵: (id, recorded_at)
product_review_history 分區:
product_review_history_2025_08到product_review_history_2026_08- 複合主鍵: (id, recorded_at)
product_buybox_history 分區:
product_buybox_history_2025_08到product_buybox_history_2026_08- 複合主鍵: (id, recorded_at)
分區優勢:
- 查詢效能大幅提升(按時間範圍查詢)
- 便於數據歸檔和清理
- 降低表鎖定影響
- 支持並行維護操作
為複雜的統計查詢建立物化視圖:
- 產品每日統計
- 用戶活躍度統計
- 異常事件彙總
使用 Redis 快取高頻查詢:
- 熱門產品資料
- 用戶追蹤列表
- 最近的分析結果
連接池配置:
- 最大連接數: 100
- 最小空閒連接: 10
- 連接超時: 30秒
- 空閒超時: 10分鐘
- 密碼: bcrypt 雜湊
- Token: SHA-256 雜湊
- API 密鑰: AES-256 加密
- 日誌中不記錄敏感資料
- API 回應中隱藏部分資訊
- 備份檔案加密存儲
啟用 PostgreSQL 行級安全:
- 用戶只能訪問自己的數據
- 管理員可以訪問所有數據
記錄所有敏感操作:
- 用戶登入/登出
- 數據修改
- 權限變更
- 頻率: 每日凌晨 2:00
- 保留: 30 天
- 存儲: 異地備份
- 頻率: 每小時
- 保留: 7 天
- WAL 歸檔
- 支持恢復到任意時間點
- RPO: < 1 小時
- RTO: < 2 小時
- 主從複製
- 自動故障轉移
- 跨區域備份
- 查詢響應時間
- 事務處理量
- 連接池使用率
- 快取命中率
記錄超過 100ms 的查詢:
- 查詢語句
- 執行時間
- 執行計畫
- 資源消耗
- VACUUM: 每週
- ANALYZE: 每日
- REINDEX: 每月
- 清理過期數據: 每月
- 表膨脹檢查
- 索引效率分析
- 鎖衝突檢測
- 連接數監控
- 增加 CPU 和記憶體
- SSD 存儲優化
- 連接池調整
- 讀寫分離
- 分片策略
- 多主複製
- 超過 1 年的歷史數據歸檔
- 使用專門的歷史數據庫
- 壓縮存儲節省空間