現代應用常提供「一框多用」的登錄體驗。本文剖析其核心實現思路、資料庫設計及性能優化策略。
用戶表需包含三個唯一索引字段,確保唯一性並加速查詢:
CREATE TABLE `users` (
`id` BIGINT PRIMARY KEY AUTO_INCREMENT,
`username` VARCHAR(50) UNIQUE, -- 用戶名
`phone` VARCHAR(20) UNIQUE, -- 手機號
`email` VARCHAR(100) UNIQUE, -- 郵箱
`password_hash` CHAR(60) NOT NULL, -- bcrypt 等加密密碼
`status` TINYINT DEFAULT 1, -- 狀態:正常/凍結
`created_at` DATETIME DEFAULT CURRENT_TIMESTAMP
);
function login(identifier, rawPassword):
// 1. 根據格式預判類型,減少查詢次數
if identifier.matches("^1\\d{10}$"): // 手機號正則
user = SELECT * FROM users WHERE phone = identifier
else if identifier.contains("@"): // 郵箱特徵
user = SELECT * FROM users WHERE email = identifier
else:
user = SELECT * FROM users WHERE username = identifier
// 2. 若預判失敗(如用戶名純數字),回退全字段查詢
if user == null:
user = SELECT * FROM users
WHERE username = identifier
OR phone = identifier
OR email = identifier
LIMIT 1
// 3. 驗證密碼
if user && verifyPassword(rawPassword, user.password_hash):
return generateToken(user)
else:
throw AuthenticationException()
OR 全表掃描。user_id。這種設計兼顧了用戶體驗、查詢性能與擴展性,是大型互聯網應用的標準實踐。