You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

餐厅投票网站数据库设计求助: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 05:42:21