动态Schema的传说

原文地址:http://forchenyun.iteye.com/blog/1018324

众所周知,对于海量数据的schema修改是一个极其昂贵的代价,MySQL分表的很大原因其实就有500w数据一个表,DDL会比较快。

一般来说,动态schema是指的非固定表结构,schema字段(有时也指索引)的增删对于正常的读写没有任何影响。一般有两个方向的表现形式:

  • Online Schema Change
  • Schema-Free

NoSQL中一般采用后者,而关系型数据库可能会采用前者,两者的区别是,前者虽然是固定表结构,但是可以通过一定的方式进行在线修改,同时尽可能不影响服务,而后者是原生支持动态schema,是很多NoSQL产品所支持的feature之一,也是它们之于开源关系型数据库的优势所在。下面我将就目前比较通用的动态schema解决方案就一一介绍。

anyShare赠人玫瑰,手有余香,分享知识,德艺双馨!
          

无觅相关文章插件,快速提升流量

分类 理论原地 · tag ,

  1. 原文要登录才能发表评论,,只能放在此地了..:-)

    1. schema-free主要还是针对MySQL这种数据库,,调整结构会同时需要调整底层的存储,,导致调整的代价过于高昂,,当然,,对于Oracle来讲,,调整结构也涉及到SQL的重新parse,,会有部分风险(不过11g对此有很大改进).

    2. schema-free对开发人员来讲,,其实是个双刃剑,,一方面,,没有schema维护的烦恼,,想要存储多少个列就存储多少个..另一方面,由于没有这种约束,,对于开发维护它的要求也提高,,不然,,系统中出现脏数据/错误数据的概率就会大大增加,,因为现在NoSQL并不支持关系型数据库支持的完整性检查(PK/FK/check constraint).

    • 分析得非常透彻,这里补充一点,完整性检查(PK/FK/check constraint)在我们的系统里也是有的,所以会尽量去避免它出现脏数据。当然,这种灵活肯定会带来一些问题,只是看能否尽量去规避了

      • 完整性检查包含几个部分..
        1. 普通的check约束,,是否为空? 是否数值是否控制在什么范围? 数据是否只能出现在特定的列表中(如 Y/N)?
        2. 外键约束,,从表的限制,,是否有对应主表的信息..
        3. 主键约束,,是否会出现重复主键? 在并发的情况下如何避免出现这种情况..

        在我有限的工作经验中…
        第1条在业务上可以很好的处理,,因为不涉及任何并发的问题..
        第2,3条会麻烦很多,,如何避免并发带来的意外情况是比较复杂的,,我们的开发/业务无法避免出现分布式情况下的主键冲突问题(基于nick_name,,基于email的主键,,由于是分布式的,,不能通过数据库来添加主键约束,,只能定期/非定期的清理脏数据).