在前段时间面试了一家算是正规的大公司,因为有工作经验,不用笔试直接进入技术面试,真心是抓瞎了。工作里,也许是自己不够上进,仅仅是学会了如何使用编程实现功能,没时间也不会去考虑性能的问题,真是失败,我都不好意思再说自己是程序员了。
剖析下,面试遇到的问题。数据库的外键你认为有用么?遇到这个问题,瞬间想起了自己工作以来,在设计表的时候,会为表添加外键,但是在生成sql语句时,会不自觉的将外键这一项关闭。原因就是,外键会有约束,那么在增删改的时候,总是会有约束验证的问题,甚是反感。回归主题,分析外键的好与不好。
主键的好处是不言而喻的,查找方便等等,换谁设计数据库,主键是必不可少的。
外键的好:
1、减少重复数据。在删除主表数据前要先删除与之相关的的子表的相关数据,原则上主表的数据是不允许删除的。
2、可以设置级联删除和更新,保证数据库的完整性;
3、外键在一定程度上说明了业务逻辑,会使设计周到具体全面。
保证了数据的一致性,完整性,程序无法100%确保数据的完整性,从这个角度上来说,外键似乎很有必要,最主要无非是数据的完整性。
外键的不好:
1、过分强调或者说使用主键/外键会平添开发难度,导致表过多等问题;
2、不用外键时数据管理简单,操作方便,性能高(导入导出等操作,在insert, update, delete 数据的时候更快);
3、可以用触发器或应用程序保证数据的完整性;
4、在结合hibernate的使用时,难以驾驭。
别人的总结,借鉴之:
1,在大型系统中(性能要求不高,安全要求高),使用外键;在大型系统中(性能要求高,安全自己控制),不用外键;小系统随便,最好用外键。
2,用外键要适当,不能过分追求。
3,不用外键而用程序控制数据一致性和完整性时,应该写一层来保证,然后个个应用通过这个层来访问数据库。
自我总结
外键在设计表的时候,还是很重要的,能看出数据的业务逻辑,毕竟罗马不是一天就造成的,Oracle公司在设计数据库的时候,肯定在外键这玩意儿上有所考虑,个人认为否定是没有意义的。但是在我的开发经验中,外键的设计就是作茧自缚,添加负担,在子表中添加一个字段用于放置外键,未尝不可。至于数据的唯一性,添加字段用于判断了。
(未完,经验尚浅,总结或许不对,还有待修正)