餐厅投票网站数据库设计求助:Polls表结构如何设计?
数据库结构优化方案
1. 调整polls表核心结构
polls表无需直接存储候选餐厅和投票结果,只需要记录投票的基础元数据即可:
TABLE NAME: polls id - integer (主键) poll_name - varchar (投票标题,例如"部门聚餐餐厅投票") creator_id - integer (外键,关联users.id,记录投票发起者) created_at - datetime (投票创建时间) deadline - datetime (可选,设置投票截止时间) is_active - boolean (可选,标记投票是否还允许参与)
2. 新增poll_candidates关联表(解决投票与餐厅的多对多关系)
一个投票可以包含多个候选餐厅,单张餐厅也可能出现在多个投票中,必须用中间表来建立两者的关联:
TABLE NAME: poll_candidates id - integer (主键) poll_id - integer (外键,关联polls.id) restaurant_id - integer (外键,关联restaurants.id) sort_order - integer (可选,控制候选餐厅的展示顺序)
通过这个表,你可以给任意投票添加任意数量的候选餐厅,完全不需要修改polls表的结构。
3. 新增poll_votes表(存储投票行为,支撑结果统计)
投票结果需要基于用户的具体投票记录,这个表用来存储每一票的明细:
TABLE NAME: poll_votes id - integer (主键) poll_id - integer (外键,关联polls.id) user_id - integer (外键,关联users.id) restaurant_id - integer (外键,关联restaurants.id) voted_at - datetime (投票时间)
- 可以给表添加
UNIQUE(poll_id, user_id)约束,确保同一个用户对同一投票只能投一次 - 统计投票结果时,只需执行简单的分组计数即可:
SELECT restaurant_id, COUNT(*) as vote_count FROM poll_votes WHERE poll_id = [目标投票ID] GROUP BY restaurant_id ORDER BY vote_count DESC;
4. 整体关联关系梳理
users↔polls:一对多(一个用户可发起多个投票)polls↔restaurants:多对多,通过poll_candidates表关联users↔poll_votes:一对多(一个用户可参与多个投票)polls↔poll_votes:一对多(一个投票对应多条投票记录)restaurants↔poll_votes:一对多(一个餐厅可获得多个投票)
这种设计逻辑清晰、扩展性强,后续如果要添加多选投票、投票备注、匿名投票等功能,只需要在对应表中新增字段即可。
内容的提问来源于stack exchange,提问作者strn18
相关产品推荐
相关产品推荐

