现在的位置: 首页 > 综合 > 正文

通过MariaDB的dynamic column功能实现非结构化存储

2018年01月21日 ⁄ 综合 ⁄ 共 1974字 ⁄ 字号 评论关闭

MariaDB与MySQL的关系十分微妙,可以说本是同根生,相煎何太急。但通过这几年的发展,已经可以比较清晰的看出两者发展方向的不同。MariaDB由于Monty的存在,毫无疑问上层的开发能力优势明显。比如困扰社区多年的组提交,虽然Percona,Facebook都给出了解决方案,但最终还是MariaDB的方案胜出。MySQL由于之前Oracle早先已经收购InnoDB存储引擎,因此InnoDB存储引擎的开发具有绝对的发言权。上层与存储引擎的博弈,谁会胜出现在还很难说,但是MariaDB对于MySQL数据库本身做了很多的创新,其中dynamic
column功能是我最为欣赏的。


由于MySQL数据库本身在进行ALTER TABLE时开销较大,需要锁表,因此若一张表在建立完成后,预料其还会增加列时,通常的做法是会预先定义很多的空列,待要增加列时,直接使用即可。但是,用户可能无法得知之后添加列类的类型,是INT,还是VARCHAR?例如在网游中,玩家用户有着无数的属性,这时应用通常会采用非结构化存储而非关系数据库的表,比如MongoDB等NoSQL系统。

MariaDB的dynamic column的优势是可以在MySQL存储非结构化的数据,从而达到schema free的效果。看看Monty自己对dynamic column的介绍:

  • Dynamic Columns has been in MariaDB for a while already. This feature allows you to store a different set of columns for every row in a table. In that manner Dynamic Columns can be called NoSQL-like.

使用dynamic column仅需将列定义为BLOB类型,之后非结构化的存储都存放在这个列中,看下面的例子:

create table assets ( item_name varchar(32) primary key, -- A common attribute for all items dynamic_cols blob -- Dynamic columns will be stored here );

接着可以插入非结构化的数据,如:

insert into assets 
values ('MariaDB T-shirt', COLUMN_CREATE('color', 'blue', 'size', 'XL'));
insert into assets values 
('Thinkpad Laptop', COLUMN_CREATE('color', 'black', 'price', 500));

可以发现第1条记录的dynamic column中存放的是color和size的属性,第2条记录存放的是color和price。这么简单就能在MySQL数据库中实现非结构化的存储!!!COLUM_CREATE是dynamic column的函数,其他函数还有COLUMN_ADD,COLUMN_GET,COLUMN_LIST等,具体可见MariaDB的官方用户手册。
此外,MariaDB还支持以json格式输出dynamic column中的内容,这对某些应用可以会非常有帮助:

MariaDB [test]>select item_name, COLUMN_JSON(dynamic_cols) from assets; +-----------------+----------------------------------------+ | item_name | COLUMN_JSON(dynamic_cols) | +-----------------+----------------------------------------+ | MariaDB T-shirt | {"size":"XL","color":"blue"} | | Thinkpad Laptop | {"color":"black","warranty":"3 years"} | +-----------------+----------------------------------------+ 2 rows in set (0.00 sec)


MariaDB 5.3就开始支持dynamic column,但是仅支持将数字作为列名。MariaDB 10.0.1开始可以使用数字或字符串作为列名,此外还增加了COLUMN_JSON和COLUMN_CHECK函数。这意味着更为直观与便捷的非结构化存储。真心期待MariaDB 10 GA版本的发布,或许世界会因此而有所不同。

——EOF——

from :http://insidemysql.blog.163.com/blog/static/202834042201372143620647/

抱歉!评论已关闭.