作为主库的 nosql 只有 CockroachDB、TiKV 以及 MongoDB(从4.0后事务似乎可用了),CockrouchDB 已经收费,另外 YugabyteDB 也可选,但大家的反馈都不好。

不需要考虑事务的业务可以选择 ScyllaDB 和 mongodb。ScyllaDB 可以兼当 cache,唯属于关系模型。

当然,更专用的 cache 是 redis, garnet 等,想省钱则 kvrocks,只要响应速度能满足要求能省则省。

所谓 cache 本质上就是物化视图,也叫做 continuous view。ScyllaDB 对此有很好的支持 ScyllaDB 物化视图 | ScyllaDB 文档,最早看到这个是在 greenplumn,我也曾借助 canal 在 mysql 上实现了一个初级的 hotview。所以用 redis 做缓存从某种角度就是靠程序员手写物化视图。

不过也有人在 redis 上直接做业务的,例如秒杀——sorry,秒杀不算,秒杀场景用到的是 redis 的分布式锁功能,不属于 cache。

我们说 cache 是视图也就意味着它的变动是由数据变更后反映出来的,例如有一些场景订单量骤增,数据更新慢要排队列,因此自己先更新 cache,后面再同步,舍弃一致性以追求响应。这种做法破坏了因果链,就像论坛发帖,有些人先把帖附加在 HTML,看起来好像成功了,响应非常快,用户就把网页关了,导致帖子最终消失。我不认为是一种恰当的做法。像这种订单场景,增加一个 PENDING 状态的订单就可以了。当然 cache 派也可以继续声称这种 cache 就是订单表的 PENDING 分表,似乎也说得通,但是查询就要两头查了。

既然 ScyllaDB 可以充当 cache,并且还有牛X的物化视图,如果 ScyllaDB 支持事务,ScyllaDB 是不是最佳选择?

以前我会倾向这个看法,但我现在不这么认为。实际上所有搞关系模型的 NoSQL(NewSQL) 都有点误入歧途。这些数据库都要定义表,不同的是表有一些独特的有趣的字段类型,如 list set 等等,甚至还支持未声明的字段,看起来很酷很 nosql。的确,这种模型就有点像鸟笼,静态为主动态为辅,很有巧思,但它对 ORM 框架设计者提出了新的要求,这种 list set 类型的字段,如何映射?一个 list(int),很可能存的都是 id,本质上是 list(subclass)。

其次,cassandra 有这些字段,别的数据库有别的字段,很难形成一套普适的 ORM 框架。这是 NewSQL 很大的误区。

因此,如果事务支持得当 mongodb 及 couchbase 是最有价值的,couchbase 已经收费,退出了竞争。mongodb 这种文档数据库结合 ODM 技术,可将 Schema 完全置于编程语言,彻底摆脱关系依赖,由此可以彻底解决阻抗失配问题,让建模变得极其简单,这是新项目弯道超车的好方案。

另一方面,假如要适配这些数据库,一套 ORM 映射是不够的,可能要针对每个数据库做一套 DO。在入库时 O -> DO 入库,查询时 DO -> O 供用户使用。这套 multi DO 观念可以兼容 redis 等 cache,后面系统可以考虑这样设计。

class User{
} class UserRedis{
static UserReids fromUser(User user){}
static User toUser();
}
class UserMongo{
...
}
class UserPG{
...
}
class UserScylla{
}

NoSQL 述评的更多相关文章

  1. NoSql数据库使用半年后在设计上面的一些心得

    NoSql数据库这个概念听闻许久了,也陆续看到很多公司和产品都在使用,优缺点似乎都被分析的清清楚楚.但我心里一直存有一个疑惑,它的出现究竟是为了解决什么问题? 这个疑惑非常大,为此我看了很多分析文章, ...

  2. 非关系型数据库(NoSql)

    最近了解了一点非关系型数据库,刚刚接触,觉得这是一个很好的方向,对于大数据 方面的处理,非关系型数据库能起到至关重要的地位.这里我主要是整理了一些前辈的经验,仅供参考. 关系型数据库的特点 1.关系型 ...

  3. 关系型数据库与NoSQL数据库

    关系型数据库的优缺点 优点: 可以做事务处理,从而保证了数据的一致性: 可以进行JOIN等多表查询: 由于以SQL标准化为前提,数据更新的开销很小(相同的字段基本上都只有一处). 缺点: 大量数据的写 ...

  4. 几款主流 NoSql 数据库的对比

    最近小组准备启动一个 node 开源项目,从前端亲和力.大数据下的IO性能.可扩展性几点入手挑选了 NoSql 数据库,但具体使用哪一款产品还需要做一次选型. 我们最终把选项范围缩窄在 HBase.R ...

  5. “NOSQL” 杂谈

    引言: nosql 的兴起和革命,在我看来已经开始逐渐影响到了传统的sql的地位,但是仅仅是影响而已,取代是不太可能的. 正文: 两年前,一个偶然的机会开始接触到 nosql ( mongodb ). ...

  6. Squirrel: 通用SQL、NoSQL客户端

    安装 配置数据库 配置驱动 配置连接 如果你的工作中,需要使用到多个数据库,又不想在多种客户端之间切换来切换去.那么就需要找一款支持多数据库的客户端工具了.如果你要连接多个关系型数据库,你就可以使用N ...

  7. NoSQL和MongoDB

     NoSQL(NoSQL=Not Only SQL),意即“不仅仅是SQL”.关系数据库关注在关系上,NoSQL关注在存储上. 发展背景 (1)传统关系型数据库遇到了性能瓶颈. 高并发读写(High ...

  8. NoSQL指南

    一.数据库发展 1.早期出现的数据库包括平面文件数据管理系统.分层数据管理系统和网络数据管理系统,分别对应的数据结构是线性表.树和图. 平面文件数据管理系统是使用磁带对数据进行顺序存储的,带来的问题不 ...

  9. NoSQL与RDBMS的九点区别联系

    原文链接:http://blog.sina.com.cn/s/blog_5373fb0b0101ft8a.html     1 理解ACID与BASE的区别(ACID是关系型数据库强一致性的四个要求, ...

  10. 本人为巨杉数据库(开源NoSQL)写的C#驱动,支持Linq,全部开源,已提交github

    一.关于NoSQL的项目需求 这些年在做AgileEAS.NET SOA 中间件平台的推广.技术咨询服务过程之中,特别是针对我们最熟悉的医疗行业应用之中,针对大数据分析,大并发性能的需求,我们也在慢慢 ...

随机推荐

  1. USB和CAN都是用差分信号来传输数据,为什么CAN的传输距离能比USB远那么多?

    USB和CAN的区别 今天在看USB项目设计实例的时候,突然想到一个问题,从而引发了一些思考.经过思考加上查阅资料,写出了这一篇文章作为记录. 问题 ​ USB和CAN都是用两条线作为差分线以差分信号 ...

  2. c++中字符/串->整数

    char字符->整数数字:std::isdigit 用于判断某个字符是否为数字(0-9). 字符串->数字:std::stoi 用于将字符转换为整数. int isdigit( int c ...

  3. USB协议详解第10讲(USB描述符-报告描述符)

    1.报告描述符的概念和作用 开门见山,报告描述符就是描述报告(HID接口上传输事务中的数据)的一组数据结构. 首先大家可能会问,报告又是什么?我们前面讲过,USB主机一般是以中断的方式向HID设备发送 ...

  4. Eigen矩阵除法

    看了网上很多帖子,很多都没有说Eigen如何做矩阵除法.我这里补充一下.其他运算一般都可以查到: 对于Matrix来说,我们需要先将其转换成数组,因为Eigen矩阵不能做除法(很烦). 比如我们一个2 ...

  5. LinearRegression线性回归

    1.LinearRegression将方程分为两个部分存放,coef_存放回归系数,intercept_则存放截距,因此要查看方程,就是查看这两个变量的取值. 2.回归系数(regression co ...

  6. 忽略某个已经托管给git的文件,防止二次提交

    # 执行命令将文件加入不提交队列 git update-index --assume-unchanged 你的文件路径 # 执行命令将文件取消加入不提交队列 git update-index --no ...

  7. webpack中 ,有哪些常见的Loader?他们是解决什么问题的?

    1. css-loader 翻译css ,可以把sass / less 代码翻译成 css 代码 : 2. imgage-loader 加载并压缩图片文件 3. source-map-loader 加 ...

  8. promise是什么?它有哪些作用?

    promsie是es6新增的特性,用来解决回调地狱的问题(异步深层嵌套问题) : 也叫做期约函数,是js内部的构造函数 ,可以当作一个容器,里面保存着某个未来才会结束的事件,比如异步请求 :

  9. Tomcat弱口令上传war包

    Tomcat弱口令上传war包 思路:   利用弱口令登录管理页面 ---> 部署war包 ---> getshell 环境:   vulhub靶场:tomcat/tomcat8   启动 ...

  10. MySQL,你只需要看这一篇文章就够了!PART04--完结篇

    MySQL--DAY04 索引 定义 索引是在数据库表的字段上添加的,是为了提高查询效率存在的一种机制. 一张表的一个字段可以添加一个索引,当然,多个字段联合起来也可以添加索引. 索引相当于一本书的目 ...