首页数据库mongodb数据库设计,mongodb使用场景是什么

mongodb数据库设计,mongodb使用场景是什么

编程之家2023-10-20102次浏览

老铁们,大家好,相信还有很多朋友对于mongodb数据库设计和mongodb使用场景是什么的相关问题不太懂,没关系,今天就由我来为大家分享分享mongodb数据库设计以及mongodb使用场景是什么的问题,文章篇幅可能偏长,希望可以帮助到大家,下面一起来看看吧!

mongodb数据库设计,mongodb使用场景是什么

mongodb使用场景是什么

使用场景:

(1)网站数据:MongoDB适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。

(2)缓存:由于性能很高,MongoDB也适合作为信息基础设施的缓存层。在系统重启之后,由MongoDB搭建的持久化缓存层可以避免下层的数据源过载。

(3)大尺寸,低价值的数据。

(4)高伸缩性的场景:MongoDB适合由数十或数百台服务器组成的数据库。

(5)用于对象及JSON数据的存储:MongoDB的BSON数据格式适合文档化格式的存储及查询。

mongodb数据库设计,mongodb使用场景是什么

mongodb设计特点:

(1)面向集合存储,容易存储对象类型的数据。在MongoDB中数据被分组存储在集合中,集合类似RDBMS中的表,一个集合中可以存储无限多的文档。

(2)模式自由,采用无模式结构存储。在MongoDB中集合中存储的数据是无模式的文档,采用无模式存储数据是集合区别于RDBMS中的表的一个重要特征。

(3)支持完全索引,可以在任意属性上建立索引,包含内部对象。MongoDB的索引和RDBMS的索引基本一样,可以在指定属性、内部对象上创建索引以提高查询的速度。除此之外,MongoDB还提供创建基于地理空间的索引的能力。

(4)支持查询。MongoDB支持丰富的查询操作,MongoDB几乎支持SQL中的大部分查询。

(5)强大的聚合工具。MongoDB除了提供丰富的查询功能外,还提供强大的聚合工具,如count、group等,支持使用MapReduce完成复杂的聚合任务。

mongodb数据库设计,mongodb使用场景是什么

如何用mongodb设计用户权限表

例如:mysql安装配置好后,有一个自带的mysql数据库,里面有一张user表,用来存放用户,以及用户权限,而mongodb这个最像关系型的数据库,有没有这样的表呢。

一,掌握权限,理解下面4条基本上就差不多

1,mongodb是没有默认管理员账号,所以要先添加管理员账号,在开启权限认证。

2,切换到admin数据库,添加的账号才是管理员账号。

3,用户只能在用户所在数据库登录,包括管理员账号。

4,管理员可以管理所有数据库,但是不能直接管理其他数据库,要先在admin数据库认证后才可以。这一点比较怪

二,添加管理员账号

[root@localhost zhangy]# mongo

MongoDB shell version: 2.4.6

connecting to: tank

> use admin//切换到admin数据库

switched to db admin

> show collections;

system.indexes

system.users//用户表

> db.system.users.find();//用户表没有数据

> db.addUser('tank','test');//添加一个管理员账号

{

"user":"tank",

"readOnly": false,

"pwd":"988432606980d0695e4f668f6bbc643a",

"_id": ObjectId("529e5d543b6a4608ac833429")

}

三,开启动用户权限认证

[root@localhost zhangy]# vim/etc/mongodb.conf//将auth=true前面的注释拿掉

[root@localhost zhangy]#/etc/init.d/mongod restart//重启生效

四,用户只能在用户所在数据库登录,管理员需要通过admin认证后才能管理其他数据库

[root@localhost zhangy]# mongo

MongoDB shell version: 2.4.6

connecting to: tank

> show dbs;//显示所有数据库失败,因为还没有认证

Wed Dec 4 06:39:50.925 listDatabases failed:{"ok": 0,"errmsg":"unauthorized"} at src/mongo/shell/mongo.js:46

> db.auth('tank','test');//认证失败,因为这个用户不属于tank这个数据库

Error: 18{ code: 18, ok: 0.0, errmsg:"auth fails"}

0

> use admin//切换到admin数据库

switched to db admin

> db.auth('tank','test');//在admin数据库认证成功

> use tank;//切换到tank数据库

switched to db tank

> show collections;//不会在提示没有权限了

contact

system.indexes

users

五,添加普通用启

> use tank;

switched to db tank

> db.addUser('tank1','test');//为tank数据库添加了一个可读写用户tank1

{

"_id": ObjectId("529e5f8474b4c660718a70f3"),

"user":"tank1",

"readOnly": false,

"pwd":"35dd47abff098f5b4f0b567db8edeac5"

}

> db.addUser('tank2','test',true);//为tank数据库添加了一个只读用户tank2

{

"user":"tank2",

"readOnly": true,

"pwd":"1792916c544d247538ded52e6df7b887",

"_id": ObjectId("529e67553992b24438d5e315")

}

> exit//退出

bye

[root@localhost zhangy]# mongo

MongoDB shell version: 2.4.6

connecting to: tank

> db.auth('tank1','test');//刚添加的用户可以登录。

六,php客户端连接

1,推荐方法一

$mongo= new Mongo();

$db=$mongo->selectDB('tank');//切换到tank数据库

$db->authenticate("tank3","test");//认证

$users=$db->selectCollection("users");//选取users表

$cursor=$users->find();//读取数据

foreach($cursor as$id=>$value){

echo"$id:"; print_r($value); echo"<br>";

}

这种方式比较好理解,根命令行下的操作过程差不多。

2,推荐方法二

$mongo= new Mongo("mongodb://tank3:test@127.0.0.1:27017/tank");//认证用户,这里的数据库,只启认证作用

$db=$mongo->selectDB('tank');//选取数据库

$users=$db->selectCollection("users");

$cursor=$users->find();

foreach($cursor as$id=>$value){

echo"$id:"; print_r($value); echo"<br>";

}

上面二种方法的不同在于,一个先选数据库在认证,一个先认证在选数据库。

mongodb数据库如何建表

MongoDB创建表步骤,Mongo常用的数据库操作命令,查询,添加,更新,删除_MongoDB性能监测。

use Admin(切换到创建用户)

db.TestDb(创建数据库)

db.addUser(“userName”,”Pwd”)创建用户

db.auth(“userName”,”Pwd”)设置用户为允许连接的用户

db.createCollection(“TableName”)创建表

showcollections查看表是否创建成功

db.TableName.Save({age:1})添加数据

db.TableName.find()查看添加的数据是否成功(如果没有查询到任何的结果,说明添加失败)

推荐学习《python教程》。

mongodb数据库适合做什么

mongodb众所周知不支持事务,所以需要强事务的业务根本不能考虑mongodb。

mongodb的优势就是文档存储:

1.业务经常变动,需要不时的添加字段,那么mongodb比较适合,关系型数据库添加字段的复杂度也还好

2.嵌套文档,业务数据比较复杂,适合嵌套文档式存储,那么mongodb非常合适,这个关系型数据库比较难搞,虽然MySQL和pg也有文档存储,但MySQL的不成熟,pg毕竟现在生产中使用还是偏少,个人也不了解,这里不谈。但这不仅仅这一点优势,具体下面会细说。

3. upsert支持,查询速度也不慢

4.高可用的副本集支持

5.查询语法非常丰富,嵌套文档查询功能非常强大,不是重度用户可能不能理解

下面说说一个具体的使用事例:

项目的一条数据在10kb左右,如果使用关系型数据库那么需要将这条数据拆分成大概几百条左右,建造多个表,设计较复杂,这种数据大概在一百万条左右,想想拆分后在十几亿的数据量就可怕。打平后的数据什么DB也都可以拿下,只是一百万变十几亿比较恐怖而已。

如果采用MySQL存储,每次查询需要使用外键查询多个表,从这些表中拉取数据,性能肯定要下降很多,比不上只在一个表查询,而且只拉取少两个数量级的数据。查询也还好,业务允许可以对结果做缓存,放到redis里去。

但是重点来了,需求要增量更新部分数据,这时候需要更新多个表,根本没法做到原子性(注意事务不是原子操作),当然也可以使用cas等技术补偿,达到最终一致性。但使用mongodb存储只需要update一条数据,对相应的嵌套文档中内容更新,可以做到原子性,是不是很方便?

推荐学习《python教程》

具体说说该项目的难点,查询无法使用缓存,可能会很吃惊,但是业务决定了确实做不了,而且增量更新的量达到上万的QPS,如果不能保证原子性想想多么可怕!

所以mongodb在这里帮了大忙,关系型数据库解决不了这个难题。

有人可能要问,mongodb没有事务,上游数据写入也会有问题,你不可能所有数据都存一个表吧?

当然不是的,我们mongodb里的数据是从MySQL中清洗出来存到mongodb中的,mongodb只做单点的业务需求,综合的数据还是在MySQL中。

此项目我们用了上百个副本集,保证系统的高可用,这些副本集配置只要一条shell就搞定,如果用MySQL的主从不知道怎么配(我自己不懂),估计DBA得忙死,而该项目完全不需要也没用到DBA。

说了这么多mongo的优点,也说说他的缺点:

1.查询优化器和MySQL没法比

2.不支持reload,只能冷重启,初始化配置的时候比较麻烦

3.没有事务,不敢存储第一手数据,多用来做备份数据的存储

mongodb可以做很多事情,取决于你脑洞,性能不差,存一些相对不重要的数据,mongodb嵌套文档功能强大,多看看官方文档挖掘挖掘有用信息,每次都能发现惊喜。

关于mongodb数据库设计到此分享完毕,希望能帮助到您。

海康威视视频服务器,海康威视服务器能不能卖qq服务器错误?qq显示的文件服务器错误