数据库,故名能所,就是能保存数据库仓库。我下面从几个角度具体描述下数据库。
数据库到底指的是什么?我们先看看百度中对数据库的专业请解释:
正所谓“数据库”是以一定会存储在一起、能与多个用户共享、具高尽可能会小的冗余度、与应用程序彼此的的的数据子集。这个解释也很抽象,通俗的讲,数据库就是一种计算机领域普通的配合软件系统的数据存储,他们比较多利用在硬盘或其它介质上存储和管理数据,比如我们偶尔会听他们说的postgresql、sqlite、mysql、sqlserver、oracle、access等等,都是数据库、又都可以管理数据库的软件系统。
数据库发展简史1970年,ibm的研究员博士在刊物《communicationoftheacm》上发表了一篇名为“arelationalmodelofdataoflargeshareddatabanks”的论文,给出了关系模型的概念,打响了名号了关系模型的理论基础。
这篇论文被普遍以为是数据库系统历史上具高划时代意义的里程碑。当时codd又大批可以发表多篇文章,辨析了范式理论和可以衡量关系系统的12条标准,用数学理论夯实的基础了关系数据库的基础。
1974年,ibm的rayboyce和donchamberlin将codd关系数据库的12条准则的数学定义以简单的关键字语法表现出,里程碑式地做出了sql(structuredquerylanguage)语言。
紧接着,oracle的创始人larryellison敏锐的感觉思维到在这个研究基础上这个可以变更土地性质正式商用软件系统。几个月后,ellison他们就变更土地性质了oracle1.0。
1988年,为帮忙解决企业集成主板问题,ibm公司的研究员barrydevlin和paulmurphy创造性的做出了三个新的术语──数据仓库(datawarehouse)。
……
当下流行的数据库都是那些?数据库发展起来到当下,衍生出出关系型数据库、nosql数据库和newsql数据库三条线。关系型数据库基于组件现代关系型模型;nosql颠复了关系型数据库的关系模型、试图用另一种角度能表达越来越大紧张多元化数据;newsql则更加注重综合考了两者的优点。
当下也很比较流行关系型数据库,主要分成三类商业型关系型数据库和开源关系型数据库,商业型关系型数据库比较多除开db2、oracle、sqlserver、informix等;开源关系型数据库,主要注意包括postgressql、mysql、sqlite等。
当下比较好很流行nosql数据库,据特性有四大分支,即只读属性类、文档类、列式、图形类。键值类以redis为代表;文档类以couchdb、mongodb为代表、列式以cassandra、hbase为代表;图形类以neo4为代表。
当下也很很流行newsql系统,国外的我就不说了,国内一帮高手旗下了一套名为tidb的newsql系统,语法兼容性问题mysql,非常不错。
1.几乎失去抵抗了hbase的多版本特征
hbases起码也是二维结构(row、cf:cq、timestamp)的数据模型,phoenix将其映射为二维的关系模型后,便面对着损失信息精度的为难场面。这种尴尬主要表现在phoenix在用的两个方面:
a.肯定不能为一个cell指定不可以的timestamp
另外hbase的第3维特征,timestamp的重要性再清楚不过。由于绝大部分数据应用场景都离不开时间维度,因此我们经常会会将数据中的某个时间字段映射到timestamp,也就不需要在cf中存储该字段了。这样的好处是:既节省用水了存储空间,也也可以不使用timestamp相关的api(的或get#settimerange)并且查询。
遗憾的是,phoenix并肯定不能让我们像hbase差不多指定输入的timestamp。可是phoenix在f.a.q.中煞有其事的给出了好像没有吧这个问题的解决方案。只不过深究之后你就会发现这是一个都很坑爹啊的方案。理由万分感谢:
首先,该方案好像没有吧也可以指定不可以的timestamp,不过需要在应用程序中正常的创建和关闭connection,可是他们还专业点强调这不是一个“贵得要命”的操作(isnotanexpensiveoperation),但是这样的代码风格估计也会让很多人纳闷。
主要,该方案的输入timestamp反正是有条件的,即需要大于表的创建时间,否则,会会出现“tableundefined”的异样。
需要只能证明的是,phoenix这个可以upsert重复的记录,三条记录的timestamp是不一样的。这样来看,可是timestamp并非我希冀的,不过多版本是不是早实现方法了呢?看见了下面的一点你应经就明白了。。。。。。
b.没法获取一个cell的多个版本
phoenix总是会声望兑换cell的哪个网站版本,有不可能去获取其它版本呢?
我曾经受f.a.q.中currentscn属性的启发,自以为是一想到一个方法:不管三七二十一,先去拿三次,拿到的肯定是2012版版本了。取其timestamp赋给_scn_attrib后再去拿,那样就取得次新版本了。以此类推,每次来拿一个版本,等到能拿只不过。只不过这种方法有点笨,但我想着老是是可以能解决问题的。只不过听说后来忽然间才发现一个攻击的缺陷:怎么取结果中的timestamp呢?嘛,看来这个方法不光是是“有点笨”了......
我相信这个问题也困扰中了许多人,并直接导致了许多人的思考。phoenix-590便行专门对于这个问题,遗憾的是,虽说给出了一些解决思路,只不过到现在为止依旧没有推动性的进展。
变通方案
phoenix-590做出了一种解决方案,其实也和我们想的一样的。。。。。。那是将timestamp作为phoenix表的不能一列,因此和其它字段以及两种主键。这样的本质是row和timestamp二维怎么合一维,反映在hbase里面,总之是将timestamp的值附加在row后面了。这样的话也可以帮忙解决不使用timestamp查询的问题,缺点是浪费了了一些存储空间。
2.二级索引设计比较粗糙
[sql]viewplain剪切粘贴print
createindexidx_nameintab_name(idx_field);
selectotherfieldaroundtab_namewherridx_field;
我以为我这样的就可以不利用索引了,只不过那就错了,前提是要
[sql]viewplain全部复制print
createindexidx_nameofftab_name(idx_field)include(otherfield);
是因为二级索引修改了个新的索引表,没有iniclude时,索引表中的value为空,上述查询将不可能凭借索引表,而是clearscan主表。include时,会将otherfield字段写入文件索引表的value中,本案所涉查询城就会凭借索引表进行rangesacn。
这种做法让人不得不狂吐槽,虽说说存储不太值钱,可是也没法这么多浪费吧。
但转念间看看,这又是phoenix的无奈之举:是因为它肯定不能绝对的保证主表和索引表对应region的本地化,所以我也就无法根据索引表的结果再去查主表了。
变通方案
a.客户端自己可以解决:先查索引表资源primarykey,然后再依据什么primarykey二次查询主表;
b.建议使用其他索引方案......
针对目前phoenix的二级索引方案,我个人我建议你必须得很谨慎建议使用。据我所知其无人能及的膨胀性,我个人建议只考虑到在用在比较比较小的表上,因此对该表是写少读多。