很少看到有人这样写SQL
好久没写代码了,想编写一套独立的企业宣传网站,包含前台信息展示及后台数据维护。但都好几天了,我也仅是10月24日这天才写了下面这一点点SQL(MS SQL Server 2000 环境),只因工作忙,下班后已经无心与代码格斗。
就上面这段普普通通的SQL代码,我都已经很久没有看到有人这样去写了,看到的大多是无注释、无必要验证的SQL。
原因有两点:
1、现在的项目大量充斥着三方ORM框架(如Hibernate)的身影,更多时间关心的是对象实体模型,而非数据库模型;
2、所有一切有利的证据都在指示程序设计应该以对象实体模型为开端,数据库模型仅为持久化方案的一种选择而已。
但是,据我所知,目前大量的应用程序正是标榜着“OOD”、“UML”,但最终的持久化载体——数据库却成为真正的“垃圾库”。试想,我曾看到过的一张“人力资源表”,一共有96个列(查询用的SQL语句为:select count(name) from syscolumns where id = object_id('HrmResource')(MS SQL Server 2000 环境)),我曾在一则网文中看到过这样一段数据库优化设计的文字:
逻辑数据库和表的设计
数据库的逻辑设计、包括表与表之间的关系是优化关系型数据库性能的核心。一个好的逻辑数据库设计可以为优化数据库和应用程序打下良好的基础。
标准化的数据库逻辑设计包括用多的、有相互关系的窄表来代替很多列的长数据表。下面是一些使用标准化表的一些好处。
A:由于表窄,因此可以使排序和建立索引更为迅速
B:由于多表,所以多镞的索引成为可能
C:更窄更紧凑的索引
D:每个表中可以有少一些的索引,因此可以提高insert update delete等的速度,因为这些操作在索引多的情况下会对系统性能产生很大的影响
E:更少的空值和更少的多余值,增加了数据库的紧凑性由于标准化,所以会增加了在获取数据时引用表的数目和其间的连接关系的复杂性。太多的表和复杂的连接关系会降低服务器的性能,因此在这两者之间需要综合考虑。
定义具有相关关系的主键和外来键时应该注意的事项主要是:用于连接多表的主键和参考的键要有相同的数据类型。
由此可见,这个“人力资源表”的设计是多么地糟糕,并且据了解,这个“人力资源表”所在的数据库上运行的B/S软件的确是运行效率较低,常常执行一个查询都会需要较长的时间来响应。这也证明了上述引用的文字中观点的正确性。
还记得曾经有人问一个问题:“设计数据库时为什么我们通常都会给数据库表设置主键?”,众人答:“为了标识数据行的唯一性。”,我曰:“因为主键是聚集索引(MS SQL Server中的术语),可以加快增删改操作的执行速度。”。很明显,关心数据库的设计的确是可取的。据相关资料显示,大多数应用程序的性能瓶颈并不是应用程序逻辑本身,而在于数据库的设计。
我现在的工作与代码无关,更多的是在客户那里做咨询和需求调研,为了尽快与妻儿能一起生活,很多时候也只是尽力忍耐。无可厚非,我依然更痴迷于代码的世界,对周围看到的软件设计失误造成的问题也太过敏感,这些都包含了程序员的一些基本特征。然而,为了妻儿,我也只能坚持工作,只为当前的工作有足够的休息和很一般的收入。
已经十二点了,又该进被窝了,明天还要上班。各位晚安!
By CodingMouse
2009年10月28日