本文出处:http://www.cnblogs.com/wy123/p/6677073.html
在做数据统计类数据库设计的时候,在考虑数据存储的时候,经常会遇到逻辑上同一个BusinessID对应多个数据点的情况, 比如工资表中的员工ID以及各项工资信息,财务表中的各个报表Id和多个数据点之间的信息 面对这种情况,如何来设计表结构,是横表,还是竖表,各有那些优缺点,本文将做一个粗浅的分析。
横标和竖表的表现形式
日常生活中也有很多类似的例子,先用一个Excel画一个例子,比如工资表 这么做就是“横表”,特点是,一个ID对应所有的值信息,以行Key-Value1-Value2-Value3的方式存储
如下是竖表(纵表),特点是每行仅存储该ID的某一个类别字段的值,以行的方式存储Key-Value的方式存储
横标和竖表的设计示例
下面通过一个具体的例子来说明横标和竖表的一些特点
--横标
CREATE TABLE HorizontalTable
(
Id int identity(1,1),
BusinessId varchar(50) ,
CategoryVal1 varchar(20) ,
CategoryVal2 decimal(20,5) ,
CategoryVal3 datetime ,
CategoryVal4 varchar(20) ,
CategoryVal5 varchar(20) ,
CategoryVal6 varchar(20)
)
insert into HorizontalTable values ('BH000001','value1',89.12,'20170406','abc4','abc5','abc6')
insert into HorizontalTable values ('BH000002','value2',99.11,'20170407','abc4','abc5','abc6')
--竖表
CREATE TABLE VerticalTable
(
Id int identity(1,1),
BusinessId varchar(50),
CategoryKey varchar(20),
Val varchar(20)
)
insert into VerticalTable values ('BH000001','CategoryKey1','values1')
insert into VerticalTable values ('BH000001','CategoryKey2',89.12)
insert into VerticalTable values ('BH000001','CategoryKey3','20170406')
insert into VerticalTable values ('BH000001','CategoryKey4','abc4')
insert into VerticalTable values ('BH000001','CategoryKey5','ab5')
insert into VerticalTable values ('BH000001','CategoryKey6','ab6')
insert into VerticalTable values ('BH000002','CategoryKey1','values2')
insert into VerticalTable values ('BH000002','CategoryKey2',99.12)
insert into VerticalTable values ('BH000002','CategoryKey3','20170407')
insert into VerticalTable values ('BH000002','CategoryKey4','abc4')
insert into VerticalTable values ('BH000002','CategoryKey5','abc5')
insert into VerticalTable values ('BH000002','CategoryKey6