为什么要选择SQL?

本文解释为什么选择一个NoSQL数据存储为Web应用程序的数据库是错误的,而选择传统的好像无新意的SQL却是正确的。

人们选择NoSQL的主要的原因有:

1. 对程序员更加容易
使用NoSQL的解决方案是直接将文档写到数据存储,而使用SQL则是需要使用Insert插入新数据库记录。确实写入原始JSON对象到数据存储中比使用Insert SQL语句容易。

下面我们比较一下抓取过去24小时的注册用户信息的案例:
MySQL


SELECT *
FROM users
WHERE signup_time >= CURDATE() - INTERVAL 1 DAY

Mongo


db.users.find({
"signup_time": {
$gt: new Date(Date.now() - 24*60*60 * 1000)
}
})

在第一种情况下,好像是人类使用交谈语言彼此交流,而在第二种是纯JavaScript,你必须使用JSON对象构建你的查询,甚至需要24小时单位转为毫秒单位。

这还不是结束!最有趣的部分是当你想让你的数据库为你提供过去一周所有注册用户信息时,或者至少两次登陆网站的用户。使用NoSQL比较麻烦。

而一个简单的关系查询,虽然不能在NoSQL数据存储中直接表达,它却可以使用一条SQL表达。为了在NoSQL中实现,你必须依靠非标准化denormalisation(需要将数据聚合存储在某个特定地方,而不是随时根据需要进行计算),或者使用让人疯狂的map-reduce。

不要忘记,如今SQL使用已经是非常容易和超级安全(例如Django的内置ORM和Rails的Active Record),这让你在大多数情况下避免编写SQL。

2. 扩展性更好
这是个狡猾的陷阱,因为隐含了两个错误的假设:
1. 扩展性实际上是你的问题
2. NoSQL扩展比现有的SQL解决方案更好

首先,除非你每秒启动几千次查询和几TB数据,否则扩展性就不是问题,万一有问题,你可以采取一个完全托管的解决方案如AWS的RDS。

其次,NoSQL不比SQL扩展更好。至少不是你以为的方式。MySQL用于如脸谱网和推特等高流量的网站,像GitHub和Bsecamp,几乎都是使用PHP。

NoSQL写得更快
一般来说这是真的,不过你的应用程序真需要“快写”吗?除非你的目标是运行日志服务之类的,但是你的Web应用程序类似:

一个人写入内容被其他人查询消费。

这是脸谱网,推特、YouTube、博客、网上商店、文件共享服务等网站的绝大多数工作。你的应用程序也不例外。

选择一个SQL数据库正确的原因
每一种技术都有它的优点和缺点,现在我们看看为什么SQL几乎是每个Web应用程序的正确选择。

1. 生态系统
你不能击败SQL的生态系统。SQL是自1974就存在的一种语言,时间超过40年。背后有大量的工具和服务。

SQL在世界各地每一个计算机学院教授。所有的云提供商提供SQL数据库作为一种服务,你可以零付出使用(例如Amazon的RDS,谷歌云SQL和SQL Azure数据库)

这可能听起来不是很重要,但软件的进步和演化有一个基础理念,不重复发明轮子,使用他人提供的解决方案解决常见问题的。

2. 事务和ACID
SQL提网站生产运行的可靠保障。这是因为在市场上几乎每一个SQL解决方案都可以组合你多个SQL查询变成一个ACID单元,这称为事务。

在实践中,这意味着你可以在你的数据库组合多个改变为一个事务,你可以提交确认和回滚,这些能够保证你交易的原子性,一致性,隔离和耐久性。

简单的说;SQL你可以100%保证意图确切反映到数据库中。

3. 存储
SQL数据库系统为生产应用中非常重要的另一个重要的“特征”是:它可以节省您的存储。

此功能是免费的,因为SQL需要预定义的表结构(schema)才能存储数据。这允许磁盘只能存储每行的列内容。相反,NoSQL解决方案必须存储整个文件(所有的键和值)在磁盘上,因为没有预先定义的存储结构文件。

随着数据集的增长,问题变得更大,你会很容易有许多 NoSQL的GB级别数据,如果在SQL数据库系统可能用不到一半。

结论
本文不是对NoSQL数据存储的否定。市场上最著名的NoSQL数据存储都是伟大的解决方案,都是为生产环境Web应用准备的。

Redis可能是唯一的一个特殊NoSQL数据存储,它没有试图要求从SQL数据库迁移出来,这就是为什么它受到普遍赞扬且能繁荣发展的原因。

Choose SQL

YesSQL 数据库框架使用 SQL 数据库和特定的数据结构,结合了 SQL 和 NoSQL 的优点,不错的设计。