数据库优化

数据库表结构如下:

Id            int primary key  --主键

DeptId   int        --部门id

InvoType   varchar(50)    --部门可开发票类型

现在数据库有数据如下:

id   DeptId    InvoType

1   1         1,2,3

2      2        1,3,5,6,9 

现在我们要取出部门1,部门2都可以开的发票类型,也就是invoTyp=1,3

如果现在这种表结构,我们只能取出一个部门1的发票类型,以逗号分隔,然后依次去部门2中查找, 部门2的invoType中是否包含这个发票类型

具体情况就是,将1,2,3分隔开,然后首先取出1,然后去1,3,5,6,9中遍历,接着取出2,去 1,3,5,6,9遍历,最后取出3,去1,3,5,6,9中遍历

现在只是两个部门,ok,可能对效率的影响不是很明显,如果是十个,或者几十个,想想会是什么情况吧!肯定是很糟糕的,既然设计有了不好的地方,我们就要优化了

经过分析,认为可以拆分现在的数据,拆分后的数据

 id   DeptId    InvoType

1   1           1

2   1        2

3   1        3 

4       2         1

5   2        3

6   2        5

7   2        6 

8   2        9 

 这时候,如果我们要取出两个部门的发票类型的交集,就很简单了,sql语句如下:

select distinct invoType from 表名 where Deptid in(1,2)

查询结果:

1

3

很明显,这样的数据库结构会给查询带来极大的方便,另外,如果需要行转列显示的时候

这样的结果也很方便的

select case invoType when 1 then 发票类型1 else '' end from 表名

其他的类似

如果是第一种结构的话,行转列我还真不知道要怎么搞了 

 

 

 

 

 

 

 

posted @ 2010-09-14 21:27  艾伦  阅读(377)  评论(0编辑  收藏  举报