為什麼選擇 PostgreSQL 作為資料庫
Goal Star 使用 PostgreSQL 作為主要資料庫。這篇文章分享選型的考量。
專案需求分析
Goal Star 的資料結構和查詢模式:
- 關聯式資料:基金 → 持股 → 交易紀錄,有明確的關聯關係
- 歷史資料累積:每日新增交易紀錄,資料量持續成長
- 複雜查詢:需要跨表查詢、聚合統計、時間區間篩選
- 資料一致性:財務相關資料,正確性很重要
為什麼是 PostgreSQL?
關聯式資料庫的適用性
Goal Star 的資料有明確的結構:基金包含多筆持股紀錄,每筆交易關聯到特定的股票。這種有明確關聯的資料,關聯式資料庫是自然的選擇,JOIN 操作讓跨表查詢變得簡單。
查詢效能優秀
PostgreSQL 在複雜查詢上表現出色。Goal Star 有很多聚合查詢需求:
- 某基金最近 N 天的買賣統計
- 某股票在各基金的持有狀況
- 特定期間的交易排行
PostgreSQL 的查詢優化器能有效處理這些查詢,加上適當的索引,效能完全滿足需求。
JSONB 支援
雖然主要使用關聯式結構,但有些資料適合用 JSON 儲存,例如原始資料的快照、不固定格式的附加資訊。PostgreSQL 的 JSONB 類型提供了這個彈性,而且可以對 JSON 欄位建立索引。
與 Django 整合良好
Django ORM 對 PostgreSQL 的支援最完整,包括 PostgreSQL 特有的欄位類型、全文搜索支援、進階索引類型等。
擴展性
PostgreSQL 有豐富的擴展,例如 pg_trgm 用於模糊搜尋、PostGIS 用於地理資訊、pg_stat_statements 用於查詢效能分析。目前 Goal Star 還沒用到這些,但需要時可以輕鬆加入。
實際使用經驗
穩定性
Goal Star 每日自動寫入與查詢,上線以來運作穩定,沒有遇過資料遺失或效能瓶頸的問題。
維護成本
使用 Railway 託管的 PostgreSQL,幾乎不需要維護。自動備份、自動更新、監控和告警都由平台處理。
什麼情況可能不選 PostgreSQL
- 極簡單的資料結構:如果只是 key-value 存取,Redis 或 DynamoDB 可能更適合
- 文件型資料:如果資料結構變化大、沒有固定 schema,MongoDB 可能是選項
- 超大規模寫入:如果每秒需要寫入數十萬筆,可能需要考慮專門的時序資料庫
結論
PostgreSQL 是一個功能完整、效能優秀的關聯式資料庫。對於有明確資料結構、需要複雜查詢的應用來說,是很可靠的選擇。Goal Star 的資料特性正好適合 PostgreSQL 的強項。
有資料庫選型的問題想討論,歡迎聯絡我。