列式存储设计实战
            时间:2014-06-02 16:26:56  
            收藏:0  
            阅读:231
        
        
        背景:
开发个学生系统,数据库设计。
设计实施:
传统数据库学生表行设计
| 
       学号  | 
    
       姓名  | 
    
       性别  | 
    
       年龄  | 
| 
       1  | 
    
       张三  | 
    
       男  | 
    
       16  | 
| 
       2  | 
    
       李红  | 
    
       女  | 
    
       15  | 
| 
       3  | 
    
       王五  | 
    
       男  | 
    
       16  | 
当想扩展属性时,相对应的会增加字段。
| 
       学号  | 
    
       姓名  | 
    
       性别  | 
    
       年龄  | 
    
       住址  | 
| 
       1  | 
    
       张三  | 
    
       男  | 
    
       16  | 
    
       河南  | 
| 
       2  | 
    
       李红  | 
    
       女  | 
    
       15  | 
    
       湖北  | 
| 
       3  | 
    
       王五  | 
    
       男  | 
    
       16  | 
    
       北京  | 
实际开发中这样做的缺点:
1:属性字段向主表加,会导致列越来越多,增加表拆分成本。
2: 增加字段,程序中实体模型,SQL查询字段,DTO及文档数据模型都要跟着发生变化,增加成本。
3:查询单个字段,也需要查询整个行。增加Io消耗。
Ps:优点就不多说了。
怎么解决这个问题呢?其实很简单,只是一个思路的转变。
我们把一个对象==一条行记录,转化成列式存储。
| 
       学号  | 
    
       属性key  | 
    
       值value  | 
| 
       1  | 
    
       姓名  | 
    
       张三  | 
| 
       1  | 
    
       性别  | 
    
       男  | 
| 
       1  | 
    
       年龄  | 
    
       16  | 
| 
       1  | 
    
       住址  | 
    
       河南  | 
| 
       ....  | 
    
       .....  | 
    
       ....  | 
这样做就完美解决上面的问题了。数据量也会N倍增加。
题外话:
本文仅仅是思路,具体设计看需求,个人习惯。
索引字段不需要查询整行,查询需要行转列等等,这类问题不做讨论。
相关资料
1:列式数据库 http://zh.wikipedia.org/wiki/%E5%88%97%E5%BC%8F%E6%95%B0%E6%8D%AE%E5%BA%93
2:五大存储模型 http://www.csdn.net/article/2012-03-12/313041
            评论(0)