数据库结构
查询显式使用 public.*。Auth.js Neon Adapter 还会维护 accounts、sessions、verification_token 等表,与业务表共用同一 users。
关系概览
业务表
| 表 | 关键列 | 约束 / 说明 |
|---|---|---|
users | id, email, role, department, position | role:admin / moderator / candidate / voter。登录按邮箱匹配 |
campaigns | id, name, ongoing, defaultBallots, code, candidateCode, candidateCanVote, candidateHasVote | 主流程只用 id/name/ongoing;后几列遗留 |
campaign_rule_weights | campaign_id, department, position, weight | 每场按部门+职位配置票数 |
campaign_candidate_options | id, campaign_id, display_name, sort_order | 名簿;删除选项会级联删分票 |
participation | campaign, user, isCandidate | 加入关系;名簿模型下 isCandidate 应保持 false |
ballots | id, campaign, voter, weight | (campaign, voter) 唯一;weight 为快照 |
ballot_allocations | id, ballot_id, candidate_option_id, amount | (ballot_id, candidate_option_id) 唯一;amount > 0;两外键 ON DELETE CASCADE |
已删除的历史表
迁移 003、004 去掉 voter_ballot_weights、position_vote_defaults。票数只以本场 campaign_rule_weights 为准。
没有完整建库脚本
001–007 假定已有 Auth.js 表和早期 campaigns / participation / ballots。新库请从备份恢复后再跑增量迁移。