RDBMS库表与Redis模型间的一种映射方式

年前一段时间,在内存数据库选型上,还在Aerospike与Redis两者间游移不定。因为Redis毕竟业界已经有很多成功案例,而且国内互联网大佬们BAT也在使用,网上资源也很丰富;而Aerospike刚刚开源,在应用案例与技术资源这两方面是一穷二白。

在游移的这段时间,也看了不少Redis的网上技术文档和一些ORM开源实现,对关系数据库(RDBMS)表与Redis模型间的映射方式简单总结了下,记录在这里备忘。


由于Redis只是简单的Key-Value(键-值)存储系统,没有RDBMS中表与索引概念,要在Redis中实现原有数据库表模型的访问方式,必须有一种模型的转换方法,即模型间的映射方式,将RDBMS中的表与索引概念转成Redis Key-Value对象。

后面的映射方式说明中,有个前提假设是:关系数据库模型使用非业务含义数值序列做为主键。这可能与实际不符合,需根据情况进行调整。采用数值做为主键,主要目的是节省Redis模型索引数据的内存占用,内存能省点是点儿,地主家也没有余粮啊。

Redis模型中所有Key-Value的创建维护,包括对应RDBMS表索引的Key-Value创建和维护,以及唯一索引的唯一性保证,都是由应用程序自身完成,Redis只负责数据保存。


表模型

另外,Redis模型中所有Key-Value的创建和维护,包括对应于RDBMS库表索引的Key-Value创建和维护,以及唯一索引的唯一性保证,都要由应用程序自身来完成,Redis只负责数据的存储。


表模型

  • RDBMS表模型
    RDBMS库表与Redis模型间的一种映射方式_第1张图片

  • Redis模型
    上图中的RDBMS模型转换成Redis模型,各Key-Value键值说明如下:

    Key

    Value

    备注

    类型

    取值说明

    Tab:id

    STRING

    整数字符串

    表主键tab_id取值来源

    Key名规则:表名称:id

    初始值为0,每次新增记录前调用INCR命令加1

    Tab:tab_id值

    HASH

    列名/列值HASHMAP

    主表每条记录除主键以外其他列值存储结构

    Key名规则:表名称记录主键值


  • 举例
    例如:表emp的数据及转换成Redis模型的数据如下:

    emp_id

    ename

    mgr_id

    1

    SMITH

    8

    2

    ALLEN

    8

    3

    SALESMAN

    7

                  

    Key名称

    Value值

    emp:id

    3

    emp:1

    { ename=” SMITH”, mgr_id=”8” }

    emp:2

    { ename=” ALLEN”, mgr_id=”8” }

    emp:3

    { ename=” SALESMAN”, mgr_id=”7” }


非唯一单列索引模型

  • RDBMS表模型

    表在列col_idx上建有非唯一索引。

  • Redis模型
    上图模型中的RDBMS索引转换成Redis模型,索引相关Key-Value键值说明如下:

    Key

    Value

    备注

    类型

    取值说明

    Tab:indices:col_idx:col_idx值                                                  

    SET       

    所有col_idx列值等于Key中col_idx值的记录的主键值集合

    表非唯一索引列col_idx对应的键值对                                

    Key名规则:表名称:idices:索引列名称:索引列数值

    这样的键值对可能存在多个,每个索引列取值对应一个


  • 举例
    例如:表emp在mgr_id上建有非唯一索引,表数据及转换成Redis模型的数据如下:

    emp_id

    ename

    mgr_id

    1

    SMITH

    8

    2

    ALLEN

    8

    3

    SALESMAN

    7

                   

    Key名称

    Value值

    emp:id

    3

    emp:1

    { ename=” SMITH”, mgr_id=”8” }

    emp:2

    { ename=” ALLEN”, mgr_id=”8” }

    emp:3

    { ename=” SALESMAN”, mgr_id=”7” }

    emp:indices:mgr_id:7

    ( 3 )

    emp:indices:mgr_id:8

    ( 1, 2 )


唯一单列索引模型

  • RDBMS表模型
    RDBMS库表与Redis模型间的一种映射方式_第2张图片
    表在列col_uniq上建有唯一索引。

  • Redis模型

    上图模型中的RDBMS索引转换成Redis模型,索引相关Key-Value键值说明如下:

    Key

    Value

    备注

    类型

    取值说明

    Tab:uniques:col_uniq

    HASH

    col_uniq列值/对应记录主键值

    表非唯一索引列col_idx对应的键值对

    Key名规则:表名称:uniques:索引列名称


  • 举例
    例如:表emp在email上建有唯一索引,表数据及转换成Redis模型的数据如下:

    emp_id

    ename

    email

    1

    SMITH

    [email protected]

    2

    ALLEN

    [email protected]

    3

    SALESMAN

    [email protected]

                    

    Key名称

    Value值

    emp:id

    3

    emp:1

    { ename=” SMITH”, email=” [email protected]” }

    emp:2

    { ename=” ALLEN”, email =” [email protected]” }

    emp:3

    { ename=” SALESMAN”, email =” [email protected]” }

    emp:uniques:email

    { [email protected] = “1”,  [email protected] = “2”,

     

     [email protected] = “3”


(非)唯一多列组合索引模型

  • RDBMS表模型

    表在列col_idx1、col_idx2上建有非唯一组合索引,
      在列col_uniq1、col_uniq2上建有唯一组合索引。

  • Redis模型
    上图模型中的索引转换成Redis模型,索引相关Key-Value键值说明如下:

    Key

    Value

    备注

    类型

    取值说明

    Tab:indices:col_idx1:col_idx1值:col_idx2:col_idx2值

    SET    

    所有符合索引列值条件的记录的主键值集合

    表非唯一索引列col_idx1、col_idx2对应的键值对

    Key名规则:表名称:idices:索引列1名称:索引列1数值:索引列2名称:索引列2数值:

    这样的键值对可能存在多个,每组索引列取值对应一个

    Tab:uniques:col_uniq1:col_uniq2

    HASH

    col_uniq1列值、col_uniq2列值组合/对应记录主键值

    表非唯一索引列col_uniq1、col_uniq2对应的键值对

    Key名规则:表名称:uniques:索引列1名称:索引列2名称


  • 其实(非)唯一多列组合索引是没有必要的,可用在组合索引中各列上建立非唯一单列索引的方式替代,因为非唯一单列索引使用的是SET(集合),所有在组合索引上的条件查询可转化成集合的运算来实现:SUNION、SDIFF、SINTER等

关联关系(一对多/一对一)

  • RDBMS表模型
    RDBMS库表与Redis模型间的一种映射方式_第3张图片

  • Redis模型
    父表不需要特殊处理,将子表关联父表的parent_id列做为非唯一索引处理,参见非唯一单列索引模型。



你可能感兴趣的:(redis,NoSQL,内存数据库)