MySQL 效能優化的關鍵在於合理配置記憶體,特別是 table_cache 大小。此外,必須評估突發斷電下 MySQL 的資料完整性保障(ACID 特性、崩潰恢復機制)。
採用 單字母前綴 + 業務標識 的命名方式,全部小寫,便於識別表用途:
| 前綴 | 用途 | 範例 |
|---|---|---|
| s | 系統基礎表 | suser(使用者)、sclass(分類)、sboard(版面) |
| m | 使用者信件表 | msysop、mdragon |
| w | 使用者訊息表 | wsysop、wdragon |
| a | 版面索引表 | alinux、acampus |
| b | 版面文章內容表 | blinux、bcampus |
| c | 特殊分類版面表 | cnewboard |
| i | 精華區索引表 | ilinux、ilinux01、icampus |
| j | 精華區文章內容表 | jlinux、jcampus |
標識選擇:表名中的業務標識採用字串(如 msysop)而非數字 ID(如 m00001),優點是直觀易讀、除錯方便;缺點是長度較長,但在可接受範圍內。
usernum INT UNIQUE, -- 唯一數值 ID,預估 3 萬用戶是否足夠?
userid CHAR(20) PRIMARY KEY, -- 登入帳號,全小寫,排序鍵
passwd CHAR(20), -- 加密後密文
realid CHAR(20), -- 顯示用 ID,大小寫混合
username CHAR(24), -- 暱稱
userlevel BIGINT, -- 位元權限掩碼,支援 64 種權限
numlogins INT, -- 登入次數
numposts INT, -- 發文數
firstlogin TIME, -- 首次登入時間
lastlogin TIME, -- 最後登入時間
staytime TIME, -- 累計在線時長
lasthost CHAR(32), -- 最後登入 IP/主機名
email VARCHAR(100),
address VARCHAR(100)
-- 預留擴充欄位?ALTER TABLE 效能影響評估
classnum INT UNIQUE,
classid CHAR(20), -- 英文代碼,如 computer
classname VARCHAR(100), -- 中文名稱,如 電腦世界
classtable CHAR(20) -- 特殊分類對應的版面表名
boardnum INT UNIQUE,
boardid CHAR(20), -- 英文名
boardname VARCHAR(100), -- 中文名
boardclass CHAR(20), -- 所屬分類
boardsysop VARCHAR(100), -- 版主名單
boardposts INT, -- 文章總數
boardlevel INT, -- 讀/寫權限等級
indextable CHAR(20), -- 對應索引表名(如 aboardid)
texttable CHAR(20) -- 對應文章表名(如 bboardid)
-- 最後兩欄是否必要?固定對應關係 vs 靈活配置
boardid CHAR(20) -- 僅存放版面 ID,用於「拳頭版面」、「最新版面」等動態聚合
id INT, -- 文章流水號,需手動維護?
mark CHAR(1), -- 標記:m(精華) g(公告) b(推薦) d(刪除)...
title VARCHAR(100), -- 標題
writer CHAR(20), -- 作者 ID
posttime TIME, -- 發文時間
textnum BIGINT -- 對應文章內容表主鍵,不隨索引排序變動
textnum BIGINT, -- 文章編號
textword TEXT -- 文章全文
設計權衡:索引與內容分表可提升列表查詢效能(避免讀取大 TEXT 欄位),配合 Lazy Flush 機制;刪除採軟刪除(標記法)。
若需精確記錄每位使用者在每個版面的未讀文章,可能需建立大量對應表,需評估儲存成本與查詢效能。投票功能暫不納入規劃。