对数据结构的同情心

我们在设计上层数据模型的时候,要对底层的数据结构抱有同情心,不要硬把关系型的数据模型,裹挟到只支持key-value的NoSQL数据库里。否则,就像是牛最爱吃的是草,你非得让它尝尝巧克力一样,不对口。

对数据结构抱有同情心,就像Martin Thompson在设计软件的时候,同情计算机中的机械硬件,是一个道理。Martin主张,要想开发出来高性能的软件,不要一味的追求流行的技术,而是深入理解底层硬件的工作原理,实现软硬的和谐。比如说,为了解决False sharing问题,他在设计队列的时候,故意给队列的头和尾指针加上填充,来保证他们不出现在同一个缓存线里。

基于key-value的NoSQL数据库,说白了就是一个Hashmap。Hashmap的最大特点,是能够快速的实现数据的保存和读取。假如我是一个使用hashmap的数据库,然后你告诉我,你们全校每个同学的颜值(假设大伙的颜值都不一样),只要你说个值,我只动一下手指头,就能告诉你它对应的人名。可是如果你的问题是,我们学校里谁颜值最高,我算起来可就麻烦了,得一个一个比一比。这时候,如果我用的不是hashmap,而是一个对有序数据更友好的Treemap,找到颜值最高的人,基本动一下手指头就行了。

除此之外,key-value数据库还有一些常见的其他因素值得注意。比如,每插入一对数据,除了主数据以外,往往还得加上一些辅助数据,比如主数据的修改时间。如果辅助数据所占的比例很大,数据库的使用效率就会很低,这时要尽量提高主数据的占比。你开一个动车,只送一个乘客,必定赔本,所以要尽量每趟多拉一些乘客。

只有理解底层数据结构的特点和局限,并且同情他们,在设计上层数据模型的时候,把它们考虑进去,才可能开发出一个和谐,高效的系统。

关于牛的事,我没有做过实验,万一你家的牛喜欢巧克力,只能祝福你能挤到巧克力味的牛奶。