DevExperience(1712)

【1】在 DML 或 DDL 语句中,不要添加 数据库表前缀: 因为开发环境的数据库表名 和 生产环境的数据库表名 有可能不一样; 这个时候就有可能报 SQL 异常;造成生产事故;
不推荐: select * from db_name.tbl_name where ....
推荐: select * from tbl_name 
当然了,也有可能开发环境的数据库表名 与 ST测试环境 或 UAT测试环境的 数据库表名 不一致;但这种错误都是可以在 测试阶段测试出来的。但是一旦项目上了生产环境,你就不能改了。

【2】对于开启数据库事务的操作: 特别要注意事务回滚。
设想这样一个场景:
有个班级表 class_tbl, 学生表 stu_tbl, 班级表有字段 学生数量 stu_num; 当执行删除学生操作时,要级联更新班级的学生数量 stu_num,其中通过学生来查询需要更新的班级。 
方法1)先执行删除学生操作, 然后通过学生(多)查询班级(一)并更新班级的 学生数量: 这个时候,更新操作不会成功,因为更新时 需要通过学生来查询需要更新哪个班级,但是学生记录又被您先删除了,所以更新失败。。这个时候,更新失败,事务回滚,被删除的学生又恢复了(没有删除)。。

所以这个时候就有一个奇怪的现象: 数据库当中明明有 这个学生记录(事务回滚后,该学生从删除状态恢复到在库状态),那为什么无法通过该学生 去级联更新班级的学生数量呢 ?? 那是因为你更新操作前,先在同一个事务中删除了这个学生,所以这个学生是不存在的,无法执行级联更新。。然后事务回滚,学生在数据库中又没有被删除。。。。然后你就陷入了 泥潭,久久无法自拔啊。。。

方法2)先通过学生(多)查询班级(一)并更新班级的 学生数量,再 执行删除学生操作(推荐):   这种方法的更新班级的学生数量 和 删除 学生记录 的方法是比较好的,不会出现方法1那种 奇怪的情况;


【总结】有减必有加,所以当你 新增学生的时候,同样的道理: 就要先执行更新学生数量操作,然后再执行新增学生操作;因为上述两个操作都在同一个事务中,一旦发生异常,事务回滚,数据库保持操作前后的数据一致性;


【3】关于数据分表权限拆分

1) 以四川省内的地级市 和 县级市为荔枝: 首先数据库表通过 地级市来分表,每个地级市一张表,如成都市的数据库表后缀suffix都是028,达州市的数据库表后缀是 0818;
每个表有字段 行政市id city_id 字段 用于存储市编号,如 tbl_*_028 的 city_id=028;
2)设想这样一种场景:因为成都天府国际机场修在简阳市,所以作为县级市的简阳市,其所有数据都挂在了 成都028的数据库表上,但通过 city_id=1214(假设简阳的区号是1214)来标识它是简阳的数据;
3)数据权限拆分需求: 地级市的用户可以查看 地级市 和 旗下所有县级市的数据,而县级市只能查看自己的县级市的数据,不能查看其它县级市的数据:
只需要通过比较 数据库表后缀suffix 与 city_id 是否相等来判断:
若两者相等,则表示地级市;
若两者不相等,则表示县级市;

【注意】上述数据权限拆分策略非常简单,只需要使用 mybatis 的 if 标签来判断就可以了;


【4】




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值