章节 | 主题 | 反模式 | 解决办法 |
---|---|---|---|
2. 乱穿马路 | 单元格 | 逗号分隔列表 | 一对多那拆表 |
3. 单纯的树 | 层级关系 | parent_id | 路径枚举 |
4. 需要ID | 主键 | 伪主键ID | 拥抱自然键和组合键 |
5. 不同钥匙的入口 | 外键 | 不用外键 | 声明外键约束 |
6. 实体-属性-值 | 可变属性 | 使用泛型属性表 | 单表、实体表、类表继承、半结构化数据模型 |
7. 多态关联 | 引用多个父表 | 使用双用途外键 | 创建两个交叉表 |
8. 多列属性 | 多值属性 | 创建多个列 | 一对多那拆表 |
9. 元数据分裂 | 分表 | 克隆表与列 | 使用水平分区、垂直分表 |
10. 取整错误 | FLOAT | 使用FLOAT | 使用NUMERIC类型 |
11. 每日新花样 | ENUM | 使用ENUM | 创建一张表装ENUM的值 |
12. 幽灵文件 | BLOB | 将文件存入文件系统 | 使用BLOB类型 |
13. 乱用索引 | 索引 | 无规划的使用索引 | 测量、解释、挑选、测试、优化、重建表或者索引 |
14. 对未知的恐惧 | NULL | 将NULL作为普通值 | 将NULL视为特殊值 |
15. 模棱两可的分组 | GROUPBY | 引用非分组列 | 无歧义地使用列 |
16. 随机选择 | ORDERBY | 随机排序 | 避免排序,直接随机数,再查一行 |
17. 可怜人的搜索引擎 | LIKE/REGEX | 模式匹配断言 | 使用数据库扩展或第三方搜索引擎 |
18. 意大利面条式查询 | 复杂查询 | 一个SQL解决复杂问题 | 将一个复杂的SQL拆分成多个简单的SQL |
19. 隐式的列 | * | 不指定明确的列 | 查询、写入指定明确的列 |
20. 明文密码 | 使用明文存密码 | 先哈希,再储存 | |
21. SQL注入 | 未经验证的输入作为代码执行 | 不要信任任何用户输入 | |
22. 伪键洁癖 | 整理伪键 | 不用修改整理伪键 | |
23. 非礼勿视 | 不防范错误异常 | 增加错误处理代码 | |
24. 外交豁免权 | 将SQL视为二等公民 | 为SQL增加文档、ER图、版本控制 | |
25. 魔豆 | 将数据库代码SQL直接写入逻辑代码 | 将数据访问代码和业务逻辑代码进行分层 |
SQL反模式
于 2024-06-02 19:19:36 首次发布