数据库优化
数据库表结构如下:
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 表名
其他的类似
如果是第一种结构的话,行转列我还真不知道要怎么搞了