開發「會議通」移動項目,會議可能持續 N 天,每天包含 N 個時間段。客戶端需以列表形式動態展示,例如:
2013年5月7日 展覽館
9:00--10:00 簽到
10:00--12:00 開幕式
14:00--16:00 展覽
2013年5月8日
9:00--10:00 Xxxx
10:00--12:00 xxx
單表存儲所有日程項目,通過字段關聯天與時段:
CREATE TABLE conference_schedule (
id INT PRIMARY KEY AUTO_INCREMENT,
conference_id INT NOT NULL, -- 會議ID
date DATE NOT NULL, -- 日期
location VARCHAR(255), -- 地點(可為空,繼承當天首個地點)
start_time TIME NOT NULL, -- 開始時間
end_time TIME NOT NULL, -- 結束時間
title VARCHAR(255) NOT NULL, -- 議程標題
description TEXT, -- 詳細描述
sort_order INT DEFAULT 0, -- 同一時段多項目的排序
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
優點:查詢簡單、易於分頁、支持任意粒度的時間段、擴展性強。
若日程結構相對固定,可將每天日程序列化為 JSON:
CREATE TABLE conference_daily_schedule (
id INT PRIMARY KEY AUTO_INCREMENT,
conference_id INT NOT NULL,
schedule_date DATE NOT NULL,
location VARCHAR(255),
schedule_json JSON NOT NULL, -- 存儲 [{start, end, title, ...}, ...]
UNIQUE KEY uk_conf_date (conference_id, schedule_date)
);
優點:減少關聯查詢、適合整天日程整體讀取。缺點:難以針對單個時段查詢、修改需整體覆寫。
提供按會議 ID 獲取日程的接口,返回按日期分組的結構:
GET /api/conferences/{id}/schedule
Response:
{
"schedule": [
{
"date": "2013-05-07",
"location": "展覽館",
"sessions": [
{"start": "09:00", "end": "10:00", "title": "簽到"},
{"start": "10:00", "end": "12:00", "title": "開幕式"},
{"start": "14:00", "end": "16:00", "title": "展覽"}
]
},
{
"date": "2013-05-08",
"location": "",
"sessions": [
{"start": "09:00", "end": "10:00", "title": "Xxxx"},
{"start": "10:00", "end": "12:00", "title": "xxx"}
]
}
]
}
採用扁平化表結構配合按日期分組的 API 輸出,兼顧了查詢效率、擴展性與客戶端渲染便利性,是會議日程系統的推薦做法。