4
JackLin的博客
首页
分类
标签
生活
时间轴
关于我
友链
搜索
管理员
数据库设计01_外键
数据库
外键
MySQL
发布日期:
2020-04-10 21:32:19
阅读量:
155
所属分类:
数据库设计
最近在数据库的外键设计上面,产生了一点小问题,特此记录一下 ### 在实际的开发当中需要使用外键吗? 在一开始的很多项目当中,我都习惯性的使用外键,因为使用外键的话,不需要自己去维护数据库的完整性,而是交由数据库去实现,这样大大减轻了开发的负担。 但是随着项目越做越大,我却逐渐**抛弃了外键的使用**! ### 主要原因有以下几点: #### 1. 性能问题 假设在一个个人博客系统中,一篇博客对应着一个分类。那么每次向博客表中插入数据的时候,首先需要检查该分类是否存在。通过外键实现的话,都是数据库帮我们检查,并且每当进行增,删,改时,都会检查一遍,势必会对性能造成影响。 **正确的方式应该是将这部分检测的工作交由程序本身来完成,而不是交由数据库完成。 ** #### 2. 兼容性问题 - 假设我都是在MySQL数据库上使用的外键,万一需要迁移到Oracle数据库的话。明显是用代码实现这些约束的话会更加方便。 - 分库分表方便,在水平拆分和分库的情况下,外键是无法生效的。将数据间关系的维护,放入应用程序中,为将来的分库分表省去很多的麻烦。 #### 3. 不方便开发人员 - 当需要批量操作数据,调整表结构或者更改程序逻辑的时候,这些约束经常会对开发人员造成困扰。虽然一般来说各种数据库都有暂时关闭约束的机制,但是确实把问题复杂化了。 上面这点我还是深有体会的,是真的麻烦。 例如,进行删除操作之前,要先关闭数据库的外键约束,然后执行完删除操作之后有需要重新开启数据库的外键约束。 ``` -- 关闭外键约束 set foreign_key_checks = 1 -- 开启外键约束 set foreign_key_checks = 0 ``` 关于外键还可以参考这篇文章:https://www.jianshu.com/p/b47a73ba2a5e ### 总结 **在大型项目开发中,是不会经常使用外键的。尽量自己利用程序实现,同时还可以提高自己的思维能力。 **