MongoDB非关系型数据库存储设计

1 需求分析

1.1总体需求分析

订单管理系统是物流管理系统的一部分,通过对客户下达的订单进行管理及跟踪,动态掌握订单的进展和完成情况,提升物流过程中的作业效率,从而节省运作时间和作业成本,提高物流企业的市场竞争力。

订单管理系统的主要功能是通过统一订单提供用户整合的一站式的供应链服务,订单管理以及订单跟踪管理能够使用户的物流服务得到全程的满足。订单管理系统是物流管理链条中不可或缺的部分,通过对订单的管理和分配,使仓储管理和运输管理有节的结合,稳定有效地实现物流管理中各个环节充分发挥作用,使仓储,运输,订单成为一个有机整体,满足物流系统信息化的需求。

订单管理是对商户下达的各种指令进行管理,查询,修改,打印等功能,同时将业务部门处理信息反馈到商户。订单管理系统一般包括:订单处理,订单确认,订单状态管理(包括取消,付款,发货等多种状态,以及订单出库和订单查询)等。

2 数据库设计

2.1mongodb数据库

​​​​在这里插入图片描述
本次系统采用非关系型数据库Mongodb, 与关系型数据库相比,MongoDB的优点: 不需要提前创建表:在MySQL中如果想要写入一条数据的话必须要先创建好一张表然后才能写入数据。可以任意添加或减少字段。可以处理json结构:在MongoDB可以存储一个json对象。可以使用upsert操作,即修改的数据不存在时直接插入。充分利用了计算机内存,所以查询和插入效率要远大于MySQL。我自己测试(400w随机数据)的时候只有在没有索引的情况下MongoDB的查询效率要远大于MySQL,插入效率和MySQL差不多都是8w条左右1分钟。在有索引的时候MySQL的查询要速度要高于MongoDB。

2.2系统架构图

在这里插入图片描述

2.3 模块设计

2.3.1 客户信息集合

customer_id: 客户ID
c_sex:客户性别
c_phone: 客户电话
c_name: 客户姓名
c_address: 客户地址

2.3.2产品信息集合

P_id:产品编号,
P_name: 产品名字,
P_type: 产品类型,
P_unit: 产品单位
P_price: 产品单个价格(¥)

2.3.3 订单信息集合

O_id:订单编号
O_date: 订单日期
O_disabled:订单退货或作废
P_info:产品信息
C_info:客户信息

上面的设计嵌入式的设计将订单和产品的信息融合到了订单信息中,好处是一次性就可以将信息提取,而不用再去 客户信息 和 产品信息 两个表中获取对应的信息,增加计算的时间。

2.4 数据操作

2.4.1增加操作

普通数据添加:
在这里插入图片描述

多维数据对象添加:
在这里插入图片描述

数组信息添加:
在这里插入图片描述

向内嵌文档添加值需要使用到 一个数组更新操作符
$push: 用于向数组中追加值
示例: 以client为例, 向内嵌文档c_phone.电话中添加 020-777777, 代码如下:

db.client.update({c_name:“吴小明”},{$push:{“c_phone.电话”:“020-777777”}})
返回结果;
WriteResult({ “nMatched” : 1, “nUpserted” : 0, “nModified” : 1 })
查询得:
在这里插入图片描述

如果我们需要让c_phone中的值不重复, 那么需要使用到一个新的操作符
$addToSet: 向数组中添加一个新元素, 如果数组中已经存在了该元素, 则不会添加。

2.4.2删除操作

使用操作符 $pull
KaTeX parse error: Expected '}', got 'EOF' at end of input: …c_name:"吴小明"},{pull:{“c_phone.电话”:“020-777777”}})
返回结果;
WriteResult({ “nMatched” : 1, “nUpserted” : 0, “nModified” : 1 })
查询得:
在这里插入图片描述 运行代码后可以看出c_phone的电话中值为020-77777的数据已经被删除掉了。

2.4.3 查询操作

条件限制查询
db.product.findOne({P_name:‘数据结构’})
在这里插入图片描述

范围条件查询
$gte:大于等于
$gt:大于
$lte:小于等于
$lt:小于
$eq:等于
$ne:不等于

查询价格小于50元的产品
db.product.find({“P_price”:{$lt:“50”}}).pretty()
在这里插入图片描述

多个条件查询
类似mysql中的AND语法
db.product.find({$and:[{“P_unit”:“5”},{“P_price”:“39.9”}]}).pretty()
在这里插入图片描述

数组条件查询
db.client.find({“c_phone.电话”:“10086”}).pretty()
在这里插入图片描述

限制查询字段
查询价格小于50元的产品的名字和类型
db.product.find({“P_price”:{$lt:“50”}},{P_name:1,P_type:1}).pretty()

在这里插入图片描述

limit语法 skip语法
$limit:用于限制Mongodb聚合管道返回的文档数
KaTeX parse error: Expected '}', got 'EOF' at end of input: …uct.aggregate({limit:2}).pretty()
db.product.aggregate({$skip:3}).pretty()
在这里插入图片描述

2.4.4 修改操作

使用操作符 s e t ,如果没有这条数据的话,是会自动添加一条,还用到用 set,如果没有这条数据的话,是会自动添加一条, 还用到用 set,如果没有这条数据的话,是会自动添加一条,还用到用进行了定位对第一个元素的更改

在这里插入图片描述

执行代码之后成功修改了电话。

2.5 索引创建

索引是提高查询查询效率最有效的手段。索引是一种特殊的数据结构,索引以易于遍历的形式存储了数据的部分内容(如:一个特定的字段或一组字段值),索引会按一定规则对存储值进行排序,而且索引的存储位置在内存中,所在从索引中检索数据会非常快。如果没有索引,MongoDB必须扫描集合中的每一个文档,这种扫描的效率非常低,尤其是在数据量较大时。
对产品文档(product)“P_name”字段创建索引
在这里插入图片描述

3高可用、容灾方案设计

MongoDB独立模式可以简单且快速的构建MongoDB数据库系统,然而独立模式存在弊端,即一旦MongoDB发生宕机,将会面临数据丢失的风险,这在生产环境中是不允许发生的,此时我们可以利用MongoDB提供的高可用机制,即复制。
MongoDB支持两种复制类型:传统的主/从复制和副本集,副本集可以理解为传统主/从复制的一种复杂形式 , 支持自动故障恢复功能 , 拥有更高的可用性

3.1 副本集成员架构图

在这里插入图片描述

客户端程序(Client Application)通过驱动器(Driver)连接副本集主节点(Primary)进行读写操作,当主节点数据副本发生变化,此时副本节点(Secondary)通过Replication(复制)同步主节点的数据副本,使副本集中副本节点与主节点存储相同数据副本。
副本集中的各节点还会通过传递心跳信息(Heartbeat)来检测各自的健康状态。当主节点故障时,拥有投票权的副本节点和仲裁节点(Arbiter)会触发一次新的选举操作,并从副本节点中选举出新的主节点,以确保副本集正常运行。

4高并发高负载扩展方案

4.1 mongodb分片

在Mongodb里面存在另一种集群,就是分片技术,可以满足MongoDB数据量大量增长的需求。
当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时,我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。
在这里插入图片描述

上图中主要有如下所述三个主要组件:

Shard:
用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个relica set承担,防止主机单点故障
Config Server:
mongod实例,存储了整个 ClusterMetadata,其中包括 chunk信息。
Query Routers:
前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用

5安全设计

5.1 添加管理员 设置访问权限

MongoDB安装时不添加任何参数,默认是没有权限验证的,登录的用户可以对数据库任意操作而且可以远程访问数据库,需以–auth参数启动。在刚安装完毕的时候MongoDB都默认有一个admin数据库,此时admin数据库是空的,没有记录权限相关的信息。当admin一个用户都没有时,即使mongod启动时添加了–auth参数,如果没有在admin数据库中添加用户,此时不进行任何认证还是可以做任何操作(不管是否是以–auth 参数启动),直到在admin库中添加了一个用户。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值