日程规划网站日历数据库设计及关联实现技术咨询
嘿,很高兴看到你已经搞定了用户注册登录和基础用户表!针对日历模块的数据库设计和关联逻辑,我结合类似Google Calendar的核心功能,给你梳理一套实用的方案,应该能帮你理清思路:
核心数据库表设计与关联逻辑
首先,你的初步思路(用户拥有唯一ID)是完全正确的,我们以此为核心,向外扩展日历、事件、截止事项等模块的关联关系:
1. 基础用户表(你已完成,这里做补充确认)
你的users表应该已经包含了用户唯一标识,推荐字段:
CREATE TABLE users ( user_id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) UNIQUE NOT NULL, email VARCHAR(100) UNIQUE NOT NULL, password_hash VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
user_id将作为所有其他表关联用户的核心外键。
2. 日历表(calendars)
一个用户通常会有多个日历(比如个人、工作、家庭),单独抽离日历表能让功能更灵活:
- 字段:
calendar_id(主键)、user_id(外键关联users.user_id)、calendar_name、color(日历显示颜色)、is_default(是否为用户默认日历)、created_at - 关联逻辑:用户 ↔ 日历 是一对多关系(一个用户可拥有多个日历)
- 创建SQL:
CREATE TABLE calendars ( calendar_id INT AUTO_INCREMENT PRIMARY KEY, user_id INT NOT NULL, calendar_name VARCHAR(100) NOT NULL, color VARCHAR(7) DEFAULT '#3366CC', -- 十六进制颜色码 is_default BOOLEAN DEFAULT FALSE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE );
ON DELETE CASCADE表示当用户被删除时,其下所有日历也会被自动删除,避免数据冗余。
3. 事件表(events)
对应日历中的活动/会议等时间区间型事项:
- 字段:
event_id(主键)、calendar_id(外键关联calendars.calendar_id)、title、description、start_time、end_time、is_all_day(是否为全天事件)、location、reminder_time(提前提醒分钟数)、created_at、updated_at - 关联逻辑:日历 ↔ 事件 是一对多关系(一个日历下可创建多个事件)
- 创建SQL:
CREATE TABLE events ( event_id INT AUTO_INCREMENT PRIMARY KEY, calendar_id INT NOT NULL, title VARCHAR(255) NOT NULL, description TEXT, start_time DATETIME NOT NULL, end_time DATETIME NOT NULL, is_all_day BOOLEAN DEFAULT FALSE, location VARCHAR(255), reminder_time INT, -- 比如30表示提前30分钟提醒 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (calendar_id) REFERENCES calendars(calendar_id) ON DELETE CASCADE );
4. 截止事项表(deadlines)
对应任务、待办等有明确截止时间的事项(和事件的区别是没有开始时间,重点在截止点):
- 字段:
deadline_id(主键)、calendar_id(外键关联calendars.calendar_id)、title、description、due_time、is_completed(是否完成)、priority(优先级:低/中/高)、reminder_time、created_at、updated_at - 关联逻辑:日历 ↔ 截止事项 是一对多关系(一个日历下可创建多个截止事项)
- 创建SQL:
CREATE TABLE deadlines ( deadline_id INT AUTO_INCREMENT PRIMARY KEY, calendar_id INT NOT NULL, title VARCHAR(255) NOT NULL, description TEXT, due_time DATETIME NOT NULL, is_completed BOOLEAN DEFAULT FALSE, priority ENUM('low', 'medium', 'high') DEFAULT 'medium', reminder_time INT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (calendar_id) REFERENCES calendars(calendar_id) ON DELETE CASCADE );
5. 可选扩展:重复事件表(event_recurrences)
如果要支持重复事件(比如每周一的例会),单独抽离重复规则表会更清晰:
CREATE TABLE event_recurrences ( recurrence_id INT AUTO_INCREMENT PRIMARY KEY, event_id INT NOT NULL, recurrence_type ENUM('daily', 'weekly', 'monthly', 'yearly') NOT NULL, interval INT DEFAULT 1, -- 比如interval=2表示每2周重复 end_date DATE, -- 重复结束日期 FOREIGN KEY (event_id) REFERENCES events(event_id) ON DELETE CASCADE );
整体关联链路总结
用户 → 多个日历 → 每个日历下包含多个事件/截止事项
这种设计的好处是:
- 逻辑清晰,各模块职责明确
- 支持用户管理多日历(比如工作和个人日程分离)
- 方便后续扩展共享日历、权限控制等功能
内容的提问来源于stack exchange,提问作者Dino Paolo
相关产品推荐
相关产品推荐

