阿里巴巴开发手册强制不得使用外键和级联,一切外键概念必须在应用层解决

1. 外键

foreign key 一个表中的一个字段引用了另一个表中的键,引用的表叫做子表,被引用的表叫做主表,外键是一种约束,描述的是表之间的关系。

2. 级联

删除主表的记录同时删除子表的记录,或者更新主表的键同时更新相应子表的记录,这些都是级联操作。
很多orm框架都会自动开启外键的级联操作,但有些时候我们的业务并不需要这种级联操作,使用外键会变得麻烦。
外键和级联不适合分布式的系统

3. 应用层解决

使用联表查询替代外键关联查询

  1. // 根据user表的查询条件进行子查询,然后左连接role表
  2. select u.*, role.*
  3. from (select * from user where `user`.username = 'cyj' limit 10) as u
  4. left join role on u.id = `role`.user_id

程序内部处理联表查询的数据

  1. type UserAndRole struct {
  2. *User
  3. *Role
  4. }
  5. func main() {
  6. // results是查询的结果,每条数据映射为UserAndRole
  7. users := make([]*User, 0, len(uMap))
  8. uMap := make(map[uint]*User)
  9. for index := range results {
  10. user := results[index].User
  11. // 利用map的key的特性进行去重
  12. value, ok := uMap[user.ID]
  13. if !ok {
  14. uMap[user.ID] = user
  15. users = append(users, user)
  16. value = user
  17. }
  18. // 把角色放入到user的Roles
  19. value.Roles = append(value.Roles, results[index].Role)
  20. }
  21. }