读书笔记:为什么数据库"通用"是个伪命题

我们的文章会在微信公众号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里这样做会带来:

  1. 每次执行都要重建表,效率极低
  2. 自动提交事务,可能破坏业务逻辑
  3. 只能用动态SQL查询,性能差

Oracle有专门的全局临时表机制,这才是正确用法。

数据库就像方言

不同数据库就像不同地区的方言:

  • SQL Server说:"锁住,等我写完你再读"
  • Oracle说:"你读你的旧数据,我写我的,互不干扰"
  • MySQL又说:"咱们排队一个一个来"

没有谁对谁错,只是设计哲学不同。强行要求它们行为一致,就像要求北京话和广东话发音相同——不现实。

务实建议

  1. 深入了解你用的数据库:至少读读官方文档的核心章节
  2. 不要盲目移植:从SQL Server到Oracle不是简单的语法转换
  3. 针对特性优化:比如Oracle的函数索引、SQL Server的CTE
  4. 抽象要适度:过度追求"数据库无关"往往得不偿失

记住:好的架构师不是追求理论上的完美,而是在特定约束下做出最合理的选择。数据库之间的差异不是bug,而是feature——理解并善用这些特性,才是高手的做法。

------------------作者介绍-----------------------
姓名:黄廷忠
现就职:Oracle中国高级服务团队
曾就职:OceanBase、云和恩墨、东方龙马等
电话、微信、QQ:18081072613
个人博客: (http://www.htz.pw)
CSDN地址: (https://blog.csdn.net/wwwhtzpw)
博客园地址: (https://www.cnblogs.com/www-htz-pw)

posted @ 2025-07-08 21:29  认真就输  阅读(6)  评论(0)    收藏  举报