Fork me on GitHub

JackLin的博客

当前位置:首页 > 标签

SpringBoot 14 Spring 2 SpringMVC 3 MyBatis 2 Linux 4 阿里云 13 宝塔 1 Docker 3 ElasticSearch 2 Redis 4 Shiro 0 Dubbo 0 Swagger 0 Thymeleaf 6 数据库 11 MySQL 11 外键 2 Gradle 1 Test 0 Tomcat 1 JavaWeb 7 Ajax 1 注解 3 css 2 报错 3 多数据源 1 Java基础 1 源码 2 Servlet 1 JSP 1 环境搭建 8 RabbitMQ 1 七牛云 1 Edit.md 1 图像识别 4 英语 2 Zookeeper 1

数据库设计01_外键

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