foreign_key

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_39817135/article/details/98474939

Forbidde Using Foreign Key in Database

Advantages

  • 保证数据的完整性和一致性;
  • 级联操作方便;
  • 将数据完整性判断托付给了数据库完成,减少了程序的代码量;

Disadvantages

性能问题

​ 假设一张表名为user_tb。那么这张表里有两个外键字段,指向两张表。那么,每次往user_tb表里插入数据,就必须往两个外键对应的表里查询是否有对应数据。

​ 如果交由程序控制,这种查询过程就可以控制在我们手里,可以省略一些不必要的查询过程。但是如果由数据库控制,则是必须要去这两张表里判断。

并发问题

​ 在使用外键的情况下,每次修改数据都需要去另外一个表检查数据,需要获取额外的锁。若是在高并发大流量事务场景,使用外键更容易造成死锁。

扩展性问题

这里主要是分为两点:

  • 做平台迁移方便,比如你从Mysql迁移到Oracle,像触发器、外键这种东西,都可以利用框架本身的特性来实现,而不用依赖于数据库本身的特性,做迁移更加方便。
  • 分库分表方便,在水平拆分和分库的情况下,外键是无法生效的。将数据间关系的维护,放入应用程序中,为将来的分库分表省去很多的麻烦。

技术问题

​ 使用外键,其实将应用程序应该执行的判断逻辑转移到了数据库上。那么这意味着一点,数据库的性能开销变大了,那么这就对DBA的要求就更高了。

​ 因此他们会选择不用外键,降低数据库的消耗。

​ 相反的,如果该约束逻辑在应用程序中,发现应用服务器性能不够,可以加机器,做水平扩展。如果是在数据库服务器上,数据库服务器会成为性能瓶颈,做水平扩展比较困难。

解决方法

适当冗余,将信息都建在一张表格里;

如果有外键就在需要使用 循环多查询;将查询外键的逻辑禁止在逻辑层,即通过循环将查询分解在Service层,在Resposition中不进行外键查询。

猜你喜欢

转载自blog.csdn.net/qq_39817135/article/details/98474939
今日推荐