你是一名资深数据库架构师和后端架构师。请为一个 Hysteria VPN 聚合平台设计数据库。
【业务背景】
- 平台对接两类角色:VPN 用户、Hysteria 服务商。
- 用户注册后,用法币购买平台发行的 Hyper Coin。平台只卖 Hyper Coin,不直接卖流量套餐。
- 服务商提供 Hysteria 节点,并定义“多少 Hyper Coin = 1GB”。可以服务商级默认价,也可以节点级覆盖价。
- 用户可以选择、切换服务商。切换后新流量按新服务商计费,旧流量仍归旧服务商。
- 用户使用 Hysteria 产生的流量由服务商节点上报。平台按流量扣用户 Hyper Coin,并给服务商记应得 Hyper Coin。
- 平台可以配置抽成比例。服务商赚到的 Hyper Coin 可按规则结算成法币。
【核心规则】
- 不要只在 users 表存 current_provider_id。用户-服务商绑定必须用生效时间区间 [effective_from, effective_to) 版本化。
- 服务商定价必须版本化。改价新增记录,不能改旧记录。计费时按流量发生时间匹配当时生效的定价。
- 所有 Hyper Coin 变动必须走账本 ledger。钱包余额只是缓存。
- 流量原始明细、小时聚合、计费账本分开。原始表建议按时间分区。
- 字节用 BIGINT,金额和 Coin 用 NUMERIC,时间用 TIMESTAMPTZ,统一 UTC。
- 流量计费要幂等,原始表要有 idempotency_key。
- 账本不可变,修正用红冲。
- 1 GB 定义固定,建议 1 GB = 1024^3 bytes。
【需要覆盖的核心表】
- 用户与钱包:users、user_coin_wallets、user_coin_ledger
- 平台卖币:coin_packages、coin_orders
- 服务商与节点:providers、provider_nodes
- 服务商定价:provider_pricing_rules,字段包含 provider_id、node_id、coin_per_gb、upload_ratio、download_ratio、min_charge_coin、effective_from、effective_to、priority
- 用户绑定:user_provider_bindings、provider_switch_logs
- 流量:traffic_raw、traffic_usage_hourly
- 计费:usage_ledger,字段包含 user_id、provider_id、node_id、binding_id、pricing_rule_id、period_start、period_end、upload_bytes、download_bytes、billable_bytes、billable_gb、coin_per_gb、user_coin_amount、provider_coin_amount、platform_coin_amount、status
- 服务商钱包:provider_coin_wallets、provider_coin_ledger
- 服务商结算:provider_settlement_terms、provider_settlements、provider_settlement_items
【输出要求】
请按以下结构输出:
- ER 关系说明
- 完整表清单和字段说明
- PostgreSQL DDL,包含主键、外键、索引、唯一约束、分区建议
- 关键流程伪代码:用户充值、用户切换服务商、服务商定价、流量计费、服务商结算
- 注意事项和扩展建议
【额外约束】
- 用户切换服务商时,必须在事务内关闭旧绑定并新建新绑定。
- 计费时不能用当前绑定和当前价,必须按流量发生时间找当时的 binding_id 和 pricing_rule_id。
- 服务商结算汇率和“coin/GB”定价是两回事,不要混在一起。
- 如果数据量大,说明 traffic_raw、traffic_usage_hourly 可以放 ClickHouse 或 TimescaleDB。