多门店预约系统表结构预览
合成量级:200家门店、日活5万、热门时段峰值每秒300次抢号。
mermaid
erDiagram
STORE ||--o{ SERVICE : offers
STORE ||--o{ SLOT : owns
USER ||--o{ APPOINTMENT : books
SERVICE ||--o{ APPOINTMENT : selected
SLOT ||--o{ APPOINTMENT : reserves核心建表摘录
sql
CREATE TABLE appointment (
id BIGINT UNSIGNED PRIMARY KEY,
user_id BIGINT UNSIGNED NOT NULL,
slot_id BIGINT UNSIGNED NOT NULL,
service_id BIGINT UNSIGNED NOT NULL,
status VARCHAR(20) NOT NULL,
idempotency_key VARCHAR(64) NOT NULL,
created_at DATETIME(3) NOT NULL,
UNIQUE KEY uk_user_slot (user_id, slot_id),
UNIQUE KEY uk_idempotency (idempotency_key),
KEY idx_slot_status (slot_id, status)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;设计决定:slot独立存容量与版本号;appointment保留取消记录而非物理删除;价格快照写预约,避免服务改价影响历史。
并发
- 抢号:条件更新 available_count>0,affected_rows=1才成功;
- 重复提交:客户端幂等键+唯一索引;
- 超卖:数据库事务为最终门禁,缓存只做削峰;
- 支付超时:预约进入pending并设过期任务释放名额。
正式SQL还需读取需求、确认取消政策、分库需求和数据保留期。本预览不应直接部署生产。