数据库优化注意事项

基于Hibernate
customer order表

1.一个order中有一个customer单项多对一(n-1)先保存一再保存多,因为这样再保存多的时候外键值已经确定,这时候时多的一方维护外键,再保存order时会带着保存外键的customerID,可以不用在update n中的外键,

2.一个customer中有多个order这个时候由一的一方维护外键,保存order时不会跟新外键customerID,所以无论哪个先保存都会跟新order中的外键

3.一个order中有一个customer+一个customer中有多个order双向一对多的时候,这个时候双方都会维持外键,注意这个时候两个表的外键需要一致,order中的外键是customerID,cuntomer表中的外键也是cuntomerID,也就是自己的主键

  • 若先保存n的一端,默认情况下会多m条update语句,m为n的对象数,因为不知道外键是啥值
  • 若先保存1的一端,默认情况下回多x条update语句,这个x是1的对象数,因为customer还要再维护一遍自己的外键
  • 所以建议使用n的一方来维护关系,而1的那方不维护关系,这样就想上面第二条一样先保存1端就不会customer自己再跟新维护一遍自己的外键了。

4.双向一对一的时候,也放弃一方不维护外键关系,这个时候需要外键unique=true,也是先保存不维护关系的那一方,理由同上。但是再取值的时候有问题

  • 如果取维护关系的一方,会默认通过左外连接获取它所关联的对象,但是可以通过修改加载策略来实现懒加载,因为可以通过外键值是否为null来判断是否有关联的对象
  • 如果取不维护关系的一方,无论是什么加载策略都会发送sql语句来初始化其所关联的对象,还不如使用左外连接,总比发送两条sql好,所以不建议更改加载策略

5.多对多

写的有点难懂,sorry

猜你喜欢

转载自blog.csdn.net/qq_37859539/article/details/81631236