文档模型(JSON)使用介绍

AlgoAmberEclipse
• 阅读 2775

一、背景

E.F.Codd在1970年首次提出了数据库系统的关系模型,从此开创了数据库关系方法和关系数据理论的研究,为数据库技术奠定了理论基础,数据库技术也开始蓬勃发展。而随着几大数据库厂商陆续发布的商业数据库管理系统几乎都支持关系数据模型,数据库技术逐渐统一到以关系型数据库为主导。

2001年后,互联网技术迅速发展,数据量迅速膨胀并并大,人类逐步进入大数据时代。大数据给传统的数据管理方式带来了严峻的挑战,关系型数据库在容量,性能,成本等多方面都难以满足大数据管理的需求。NoSQL数据库通过折中关系型数据库严格的数据一致性管理,在可扩展性、模型灵活性、经济性和访问性等方面获得了很大的优势,可以更好地适应大数据应用的需求,成为大数据时代最重要的数据管理技术。

二、产品介绍

SequoiaDB是新一代分布式文档类数据库,其数据模型为文档模型(JSON),而非传统的关系型数据模型。关系模型以二维表来表示实体与实体之间的联系,在数据建模时需要对数据对象进行拆分,再将各自的信息存到对应的表里,在需要时再将各个表连接起来。而巨杉数据库以一个文档为单位进行存储,支持数组和文档嵌套,关系模型中需要拆分的信息可以直接用一个文档来表示。

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它基于ECMAScript的一个子集,为纯文本格式,支持嵌套结构与数组。

JSON 具有如下形式:

1、对象是一个无序的“键值对”集合,以“{”(左大括号)开始,“}”(右大括号)结束。每一个元素名后跟一个“:”(冒号);而元素之间使用“,”(逗号)分隔;
文档模型(JSON)使用介绍

2、数组是值的有序集合,以“[”(左中括号)开始,“]”(右中括号)结束。值之间使用“,”(逗号)分隔;
文档模型(JSON)使用介绍

3、值可以为由双引号包裹的字符串,数值,对象,数组,true,false,null,以及 SequoiaDB 数据库特有的数据结构(例如日期,时间等)组成。
文档模型(JSON)使用介绍

三、场景设计

文档模型应用场景非常广泛,这里以一个大家比较熟悉且经常会用到的一个场景——购物车为例,介绍文档模型的使用。
购物车是网上购物时存放感兴趣商品的虚拟篮子,打开购物车,通常希望看到各个商品的概要信息,如所属店铺名称、商品名称、价格、数量等,若商品是服装,可能还需要展示尺码、颜色等属性信息。
当我们用文档模型来表达购物车应用时,一种参考数据模型如下所示:

{
  "_id": {
    "$oid": "57b44b2b2b57085321000001"
  },
  "items": [    
    {
      "shopid": 8224,
      "picture": "http://www.sequoiadb.com/product.jpg",
      "amount": 1,
      "price": "117.59",
      "itemname": "Coffee",
      "itemid": 194987
    },
    {
      "shopid": 9291,
      "attribute": [
        {
          "color": "Blue",
          "size": "M"
        },
        {
          "color": "Pink",
          "size": "M"
        }
      ],
      "picture": "http://www.sequoiadb.com/product.jpg",
      "amount": 2,
      "price": "17.63",
      "itemname": "T-shirt",
      "itemid": 543514
    }
  ],
  "isactive": true,
  "uid": 123456
}

每个用户都对应一个文档,文档中由用户标识、状态及购物车物品几个字段,其中购物车是一个嵌套文档,里面包含对应用户购物车中的商品。每个商品都具有名称、价格、数量等信息,还可以根据需要为不同种类商品添加不同字段,比如这里的“attribute”字段,用于存放服装类商品的属性信息,如颜色、尺码,当然,同类商品可以具有不同个数、不同内容的属性信息,可以非常灵活地处理。

四、JSON API实现

对于一个购物车,常见的操作有:增加商品、删除商品、增加商品数量、修改商品属性、商品统计。在文档模型下,我们提供与之对应的一套完善的API来表示跟购物车相关的一系列操作。

4.1 增加商品

当我们希望在购物车中增加一本价格为99元的书时,可以使用如下的update语句:

db.mall.cart.update({
  $push:{
    items:{
      shopid:6666,
      amount:1,
      price:"99.00",
      itemname:"Book",
      itemid:206053
    }
  }
},
{
  uid:123456
})

其中,{uid:123456}为更新的匹配条件,表示用户标识为123456的用户,$push表示在数组末尾增加一个元素。$push的语法为:

{
  $push:{
    <字段名1>:<值1>,
    <字段名2>:<值2>,
    ...
  }
}

$push 将给定数值(<值1>)插入到目标数组(<字段名1>)中,操作对象必须为数组类型的字段。

4.2 删除商品

如果希望从购物车中删除特定的商品,也可以使用update语句。与增加商品使用更新符$push不同的是,删除购物车中商品使用的是$pull更新符,其对应语句为:

db.mall.cart.update({
  $pull:{
    items:{
      shopid:6666,
      amount:1,
      price:"99.00",
      itemname:"Book",
      itemid:206053
    }
  }
},
{
  uid:123456
})

同样的,{uid:123456}为更新的匹配条件,表示用户标识为123456的用户。$pull表示从数组中清除匹配的数组元素。
$pull的语法为:

{
  $pull: {
    <字段名1>:<值1>,
    <字段名2>:<值2>,
    ...
  }
}

$pull清除指定数组对象(<字段名1>,<字段名2>,...)的指定值(<值1>,<值2>,...)。操作对象必须为数组类型的字段。如果记录中不存在指定的数组对象,跳过不做任何操作;如果指定的值不存在数组对象中,也不做任何操作。
另外,巨杉数据库支持$replace语法,在不改变_id(由数据库自动生成的唯一标识)的情况下,改变文档内容,对应的语句为:

db.mall.cart.update( {
  $replace:{
    uid:123456,
    items:[{
      itemid:5856,
      itemname:"Cup",
      amount:1, 
      price:"69.00",
      shopid:8224
    }
          ]
  }
}, 
{  
  uid:123456 
} )

修改前后的效果为:

文档模型(JSON)使用介绍

注意,这里在使用find时使用了两个JSON对象作为参数,这是巨杉数据库find函数的特殊语法,前一个JSON对象表示的是查询条件,代表用户标识uid为123456,第二个JSON对象表示的是selector,它控制返回结果的字段,可以理解为标准SQL语法中select语句后面的字段名,表示返回结果中只需要包含select后面的指定的字段。
$replace语法为:

{
  $replace:{
    <字段名1>:<值1>,
    <字段名2>:<值2>,
    ...
  }
}

$replace操作是将文档全部替换成"{<字段名1>:<值1>,<字段名2>:<值2>,...}"。除了保留原始的 _id 之外,原始文档的内容会全部清空,并替换成"{<字段名1>:<值1>,<字段名2>:<值2>,...}"。

4.3 增加商品数量

当我们需要修改购物车中某一商品的数量时,可以使用update语句搭配特定的更新符来完成。实现语句为:

db.mall.cart.update({
  $inc:{
    "items.0.amount":1
  }
},
{
  "uid":123456
})

这里使用了更新符$inc,表示给购物车中第一个商品的amount增加1,注意这里表示购物车中第一个商品的语法:items.0.amount,其中,0表示购物车中商品的序数,数组元素从0开始计数。
$inc的语法为:

{
  $inc:{
    <字段名1>:<值1>,
    <字段名2>:<值2>,
    ...
  }
}

$inc 操作是给指定“<字段名>”增加指定的“<值>”。
修改购物车中商品数量除了可以通过$inc来实现外,还可以使用$set来做,$set语法为:

{
  $set:{
    <字段名1>:<值1>,
    <字段名2>:<值2>,
    ...
  }
}

$set操作是将指定的“<字段名>”更新为指定的“<值>”。

4.4 商品统计

对于某一个用户的购物车中的商品,如何获取购物车中的商品总数呢?或者当买家在准备结账时选择了多个商品时,如何在数据库中获取所选商品的数量和总价格呢?要获取这些信息,需要借助JavaScript代码来实现。
文档模型(JSON)使用介绍

通过这种方式,可以得到购物车中每一件商品的单价、数量等信息,根据不同的应用需求,可以在数据库中方便的查询商品的信息并进行处理。

五、结论

SequoiaDB采用JSON定义的数据模型(对象存储),将程序中的对象以原生的方式保存在数据库中,并且可以对其中而已属性或子对象进行检索匹配,可以大幅度弱化复杂的关系模型,加快应用的开发速度,并减少系统的运维成本。

SequoiaDB巨杉数据库2.6 最新版下载

SequoiaDB巨杉数据库技术博客

SequoiaDB巨杉数据库社区

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java如何操作非关系型数据库redis(
redis简单介绍:是一种Nosql数据库,Nosql全称是NotOnlySQL,是一种不同于关系型数据库的数据库管理系统设计方式。对NoSQL最普遍的解释是“非关系型的”,强调KeyValueStores和文档数据库的优点,而不是单纯的反对RDBMSSowhatcanIdowithJedis?All
Wesley13 Wesley13
3年前
MongoDB是什么
MongoDB是什么?MongoDB是一款为web应用程序和互联网基础设施设计的数据库管理系统。没错MongoDB就是数据库,是NoSQL类型的数据库。那么nosql又是什么?NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的we
Wesley13 Wesley13
3年前
mySQL (关系型数据库管理系统)
MySQL是一个关系型数据库管理系统,由瑞典MySQLAB公司开发,目前属于 Oracle 旗下产品。MySQL是最流行的关系型数据库管理系统之一,在WEB应用方面,MySQL是最好的RDBMS(RelationalDatabaseManagementSystem,关系数据库管理系统)应用软件。MySQL是一种关系数据库管理系统,关
Stella981 Stella981
3年前
Neo4j入门
前言关系,指事物之间相互作用、相互影响的状态。数据之间的关系也是如此,数据之间关系的存储在RDS就已经开始。从数据库支持的外键,到手动建立的关系表,人们采取了许多方法,只为了解决查询复杂、缓慢等问题。在NoSQL兴起的今天,图数据库进入了我们的视野,关系模型静态、刚性、不灵活的本质在网络状的存储结构里已然不复存在。现在,让我们以初学者的身份
Wesley13 Wesley13
3年前
Java面试题
91,什么是ORM?        对象关系映射(ObjectRelationalMapping,简称ORM)是一种为了解决程序的面向对象模型与数据库的关系模型互不匹配问题的技术;        简单的说,ORM是通过使用描述对象和数据库之间映射的元数据(在Java中可以用XML或者是注解),将程序中的对象自动持久化到关系数据库中或者将
Stella981 Stella981
3年前
RDS、DDS 和 GaussDB 理不清?看这一篇足够了!
当前,华为云提供的数据库服务主要包括三大类:关系型数据库服务,非关系型数据库服务以及数据库工具服务。如下图所示:!(https://pic1.zhimg.com/80/v2d75be0bd71ca51f396e85a79e9f40e4d_720w.jpg)关系型数据库和非关系型数据库均可分为开源和自研两大类。其中,自研数据库统一为GaussDB
Stella981 Stella981
3年前
Redis数据库的安装与基本应用
一:了解NoSQL1:介绍:Nosql的全称是NotOnlySql,这个概念早起就有人提出,在09年的时候比较火。Nosql指的是非关系型数据库,而我们常用的都是关系型数据库。就像我们常用的mysql,sqlserver一样,这些数据库一般用来存储重要信息,应对普通的业务是没有问题的。但是,随着互联网的高速发展,传统的关系型数据库
Stella981 Stella981
3年前
Linux下5大关系型数据库管理系统
by Bentutu.com数据库管理系统(DBMS),可以用来创建、维护和管理数据库。关系型数据库管理系统(RDBMS),是一个数据以表格形式存储的DBMS,数据键关系也以表格形式存储。现在,多数流行的商业和开源数据库基本上基于关系型数据库模型。!(https://my.oschina.net/uploads/img/201103/051
Wesley13 Wesley13
3年前
mysql数据介绍
数据库1.相关概念用来存储数据的仓库库:文件夹表:文件数据:记录一个变量:字段2.常见数据库关系型:数据间存在某种关联关系oracle:目前最好的关系型数据库,体现在用户管理,分布式上,但是商业收
非关系型数据库(NoSQL)
NoSQL是区别于传统关系数据库的数据库管理系统的总称。NoSQL数据库的产生是为了解决和多种数据类型带来的挑战,尤其是大数据应用问题。因为NoSQL数据库去掉了关系数据模型的特点,数据之间没有关系,易于扩展。此外,得益于NoSQL数据库的无关数据模型,数
AlgoAmberEclipse
AlgoAmberEclipse
Lv1
谁家玉笛暗飞声,散入春风满洛城。
文章
5
粉丝
0
获赞
0