从项目中得到的关系型数据库的一个设计原则

本文解析了一个复杂的嵌套SQL查询语句,并探讨了其背后的原因及优化方案,提出了使用历史记录表的设计建议。

  我接手的这个项目是一个C/S软件,服务器其实主要就是和数据库交互。可是在服务器代码里却发现有这样的SQL语句:

select a, b from t, (select max(uid) as c, d from t group by uid) e where t.uid=e.c and ...

一开始真是看不懂这种嵌套的查询语句,后来问了原开发人员才得知这是由于表 t中存在uid的重复记录,所以必须先选择一个最新的

记录集(select max(uid) ...),然后再在这个记录集上做查询。

 

  便于理解的方式是分两步写,先:

select max(uid) as c, d from t group by uid

得到一个记录集,然后再在该记录集上做循环查询。当然这种方式可能没有前面直接交给数据库的方式效率来得高。

 

  再深究一下,为什么会出现重复记录呢?一问才知原来是由于表 t中由于记录有时会有更新,而又不想删除原来的记录,

就是想保留历史记录,于是就创建了一条新的记录,造成了uid的重复。但这样就造成了在所有和这张表相关的查询都要

这样写这种复杂的嵌套语句,实际上是做了两次查询,降低了效率。

 

  好的设计应当是创建一张新的历史记录表。在数据库设计和开发人员更新记录数时都可以发现这个问题并修改设计以

避免这种情况的出现。

 

 

 

规范化-数据库设计原则:

http://www.ibm.com/developerworks/cn/data/library/techarticles/dm-0605jiangt/

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值