数据库设计:从ER图到索引优化
设计原则:满足三范式 + 适当冗余 + 分库分表策略
核心技巧:
- 主键设计:使用BIGINT自增而非UUID(性能差异达30%)
- 索引优化:联合索引遵循最左前缀原则
- 字段类型:日期用DATETIME而非VARCHAR,金额用DECIMAL
血泪教训:
某次将用户手机号设为VARCHAR(11)但未加索引,导致查询超时。后改为CHAR(11)并添加唯一索引,查询速度从2.1s降至0.003s。
实战案例:学生管理系统中的“成绩表”设计
CREATE TABLE scores (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
student_id INT NOT NULL,
course_id INT NOT NULL,
score DECIMAL(5,2),
exam_date DATETIME,
UNIQUE KEY uk_student_course(student_id, course_id),
KEY idx_student(student_id),
CONSTRAINT fk_student FOREIGN KEY (student_id)
REFERENCES students(id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
安全防护:构建PHP应用的“防火墙”
三大核心威胁:
- SQL注入:使用预处理语句(PDO/MySQLi)而非字符串拼接
- XSS攻击:输出时使用htmlspecialchars()转义
- CSRF攻击:表单添加token验证 + SameSite Cookie策略
安全代码对比:
$sql = "SELECT FROM users WHERE email='" . $_POST['email'] . "'";
$stmt = $pdo->prepare("SELECT FROM users WHERE email = :email");
$stmt->execute(['email' => $_POST['email']]);
进阶防护:
- 启用HTTPS(强制HSTS头)
- 设置安全Cookie参数(Secure + HttpOnly)
- 实施WAF规则(如ModSecurity)
- 定期漏洞扫描(使用phpstan/psalm静态分析)
调试技巧:让报错成为你的朋友
必备工具:
- Xdebug:断点调试、性能分析、内存监控
- Monolog:结构化日志记录
- Chrome DevTools:网络请求、响应分析
function debug($data) {
var_dump($data);
debug_print_backtrace();
exit;
}
use MonologLogger;
use MonologHandlerStreamHandler;
$log = new Logger('app');
$log->pushHandler(new StreamHandler('/var/log/app.log', Logger::WARNING));
$log->warning('User login failed', ['email' => $_POST['email']]);
调试心法:
- 复现问题:确保问题可稳定重现
- 最小化测试:隔离变量,逐步缩小范围
- 日志先行:关键节点添加日志记录
- 善用工具:Xdebug+IDE组合效率提升300%