您已经看到了为什么以及如何在JSON中建模数据。 一旦在JSON中有了数据,就可以在任何简单的键值数据库中存储和检索JSON文档。 如果您的应用程序只需要根据**设置和获取文档,请使用任何键值存储。 你都准备好了。
这种情况很少发生。
您不能仅仅使用数据库来存储和检索JSON。 你在试图解决一个真正的商业问题。 您正在开发一个业务应用程序。 对于业务应用程序,问题、操作和报告不会因为数据库不支持查询而改变。 业务应用程序必须做许多需要多对象操作的事情:
- 处理订单结帐。
- 搜索存储顾客正在寻找的鞋子的数据。
- 上个月我们有多少新客户?
- 生成今天到期的未完成装运清单。
- 使用不区分大小写的客户名称检索客户订单。
- 加载新的库存数据。
- 合并客户列表。
为了完成这些任务,您需要高效地搜索数据库。 对数据进行选择-连接-分组-项目-聚合-排序处理以生成报告。 同样,您必须插入、更新、删除和合并来表示现实世界的业务流程。
现在,问题是,你将如何用获取和设置API为NoSQL关键值系统实现所有这些? 你可以通过编写一个程序来完成每项任务。 当然,编写应用程序是昂贵的。 扩展、调试和维护它会使成本更高。
想象一个用例:寻找订单超过10,000美元的高价值客户。 使用NoSQL应用编程接口方法,您可以编写一个程序来检索对象,并在程序中进行过滤、分组和聚合。
现在,问题是,你将如何在一个具有获取和设置API的NoSQL关键值系统中实现所有这些? 你可以通过编写一个程序来完成每项任务。 当然,编写应用程序是昂贵的,扩展、调试和维护它会使它更加昂贵。
这就是关系数据库管理系统和SQL被发明的原因。 SQL确实自然地设置了处理。 在关系模型中,这些任务都可以通过一系列语句来完成。 每个SQL语句获取一组元组,进行处理,并生成另一组元组。
选择c。客户,客户。姓名,SUM(o金额)
从订单到内部连接行项目l开(o客户IDl。CustID)
内部连接客户(o)CustID外面的c。CustID)
GROUP BY c 。CustID,c .名称HAVING SUM(o金额)> 10000
按金额订购(o金额)DESC
随着NoSQL关键值数据库的发展,他们增加了地图简化框架,这样开发人员就可以使用和级联它们来完成复杂的工作。 卡珊德拉、蒙古数据库和库基在分布式NoSQL数据库上引入了类似于SQL的语言,使查询更加容易。 蒙古数据库应用编程接口看起来不同,但是您仍然会看到类似于SQL的东西。
Couchbase N1QL(非第一范式查询语言)在灵活的JSON数据模型上提供了所有的选择-连接-项目操作。 N1QL为布尔表达式定义了一个四值布尔逻辑,它包括灵活模式中的新MISSING值和数据类型的排序序列。 此外,N1QL扩展了SQL来访问和操作嵌套JSON结构的所有部分。
N1QL将JSON文档集作为输入,对它们进行处理,并为您提供一组JSON文档。 只需在SQL定义中用JSON替换元组,就可以得到N1QL。
让我们看看如何用N1QL编写前面的查询。 非常接近于SQL,但它可以访问嵌套数据,并在ORDERS文档中进行数组的非嵌套。
选择客户。身份证,顾客。名称,SUM(订单行。金额)
来自订单的订单。行项目作为订单行
关键订单上的内部加入客户。CustID
按客户分组。身份证,顾客。姓名
有总和(订单行。金额)> 10000
按金额排序(订单行。金额)DESC
除了选择,Couchbase N1QL还支持传统的SQL语句:插入、更新、删除和合并。 以下是一些例子:
插入订单(键,值)
值(“1。美国广播公司。X382″, {“O_ID”:482, “O_D_ID”:3, “O_W_ID”:4});
更新订单集O _开利_标识”ABC987 “其中O _标识=482,O _ D _标识=3,O _ W _标识=4
从新订单中删除,其中编号为291,编号为3482,编号为2483
融入客户使用
(从新客户中选择国际开发委员会,其中状态=’CA ‘)作为NC
开关键数控。CID
匹配后,更新客户集。状态= ‘ CA
下面是基于SQL的关系数据库管理系统和N1QL之间的比较:
|
查询功能 |
关系数据库管理系统上的SQL |
关于JSON的SQL |
| 目标 | 表、元组、列 | 键空间,JSON文档,键值 |
| 参考 | 平面参照:表格。圆柱 E.g. 顾客。姓名,顾客。活力 |
平面和嵌套:键空间。keyvalue E.g. 顾客。姓名,顾客。地址。拉链, 顾客。联系人[0]。电话。可动的 |
|
声明 |
选择、插入、更新、删除、合并 |
选择、插入、更新、删除、合并 |
|
查询操作 |
|
|
|
计划 |
预定列 |
|
|
数据类型 |
SQL数据类型 转换函数 |
|
|
询问处理 |
输入:元组集 输出:元组集 |
输入:JSON集 输出:JSON集 |
摘要:
与RDBMS相比,NoSQL数据库让您能够以低得多的延迟和低得多的成本读写大量数据。没有查询就像没有方向盘的发动机一样。 通过库基对JSON的查询,你可以问一些重要的问题,比如——我在哪里可以找到我最喜欢的啤酒?.
SELECT
挑选”},
Array_agg({“name”:左边的name})
brewery,
Array_agg({“name”:Array_agg({“name”:brewery)。名称})geo})
Array_count(
Array_agg(brewery.NAME))
AS
syncnavigator brewery_count
FROM
`beer-sample`
beer
LEFT
OUTER
JOIN
`beer-sample`
brewery
ON
keys
啤酒厂_计数brewery_id
WHERE
type
= ‘beer’
AND
brewery.type
= ‘brewery’
AND
brewery.state
= ‘California’
GROUP
BY
NAME
ORDER
BY
brewery_idNAME))
在哪里
NAME
ASC
limit
5
;