读书笔记:为什么数据库"通用"是个伪命题
我们的文章会在微信公众号IT民工的龙马人生和博客网站( www.htz.pw )同步更新 ,欢迎关注收藏,也欢迎大家转载,但是请在文章开始地方标注文章出处,谢谢!
由于博客中有大量代码,通过页面浏览效果更佳。
本文为个人学习《Expert Oracle Database Architecture Techniques and Solutions for High Performance and Productivity(第四版本》一书过程中的笔记与理解分享,仅用于学习与交流,部分内容参考原书观点并结合>实际经验进行整理。若涉及版权问题,请联系删除或沟通处理。也请大家支持购买原版书籍。
为什么数据库"通用"是个伪命题?
很多开发者在设计系统时都幻想过这样一个场景:写一套代码,就能无缝运行在所有数据库上。听起来很美好,但现实却很骨感——这几乎是不可能完成的任务。
一个简单的例子暴露大问题
想象你开发了一个会议室预约系统。在SQL Server上运行得很好:当两个人同时预约同一时间段时,系统会自动排队处理,不会出现重复预订。
但当你把同样的代码搬到Oracle上,问题就来了:两个人居然可以同时成功预订同一时间段!这不是Oracle的bug,而是它的工作方式不同——Oracle默认使用非阻塞读取,不像SQL Server那样会自动加锁。
NULL值的陷阱
另一个常见坑是NULL值的处理。在SQL Server里:
SELECT * FROM table WHERE field = NULL
这样写能找到NULL值的记录。但在Oracle里,同样的查询永远返回空结果,必须写成:
SELECT * FROM table WHERE field IS NULL
这就像你习惯用筷子吃饭,突然给你刀叉——工具不同,用法也得变。
临时表的误区
很多从SQL Server转来的开发者喜欢在存储过程里建临时表。但在Oracle里这样做会带来:
- 每次执行都要重建表,效率极低
- 自动提交事务,可能破坏业务逻辑
- 只能用动态SQL查询,性能差
Oracle有专门的全局临时表机制,这才是正确用法。
数据库就像方言
不同数据库就像不同地区的方言:
- SQL Server说:"锁住,等我写完你再读"
- Oracle说:"你读你的旧数据,我写我的,互不干扰"
- MySQL又说:"咱们排队一个一个来"
没有谁对谁错,只是设计哲学不同。强行要求它们行为一致,就像要求北京话和广东话发音相同——不现实。
务实建议
- 深入了解你用的数据库:至少读读官方文档的核心章节
- 不要盲目移植:从SQL Server到Oracle不是简单的语法转换
- 针对特性优化:比如Oracle的函数索引、SQL Server的CTE
- 抽象要适度:过度追求"数据库无关"往往得不偿失
记住:好的架构师不是追求理论上的完美,而是在特定约束下做出最合理的选择。数据库之间的差异不是bug,而是feature——理解并善用这些特性,才是高手的做法。
------------------作者介绍-----------------------
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)

浙公网安备 33010602011771号