当前位置:首页 » 操作系统 » mongodb数据库设计

mongodb数据库设计

发布时间: 2022-06-09 13:45:53

⑴ 如何在MongoDB中建立新数据库和集合

一、创建Mongodb数据库

由于Mongodb不是关系型数据库文件,实际上,它并不存在传统关系型数据库中的所谓“数据库”的概念,但不用担心,当你第一次新增数据时,mongodb就会以collection集合的形式进行保存和新建,而不需要你手工去新建立。下面是例子:

1)列出当前的数据库
MongoDB shell version: 1.8.1
connecting to: test
> show dbs
admin 0.03125GB
local (empty)
可以使用show dbs来列出当前有多少个数据库,上面看到的是有两个,分别是admin和local。

2) 定义新的数据库名
我们通过使用“use new-databasename”的语法去使用一个新的数据库,注意,即使你的数据库还没建立起来,依然可以这样使用,因为mongodb会在真正插入了数据后,才会真正建立起来。
>use mkyongdb
switched to db mkyongdb
> show dbs
admin 0.03125GB
local (empty)
注意,在use mkyongdb后,mkyongdb实际上还没真正建立起来,只是表明目前是在使用mkyongdb了。

3)保存数据
定义一个collection,名为“users”,然后插入数据,如下:
> db.users.save( {username:"mkyong"} )
> db.users.find()
{ "_id" : ObjectId("4dbac7bfea37068bd0987573"), "username" : "mkyong" }
>
> show dbs
admin 0.03125GB
local (empty)
mkyongdb 0.03125GB

可以看到,用db.users.find()可以找出已插入的数据。这个时候,名为“users”的collection已经建立起来了,同时,数据库mkyongdb也建立起来了。转载,仅供参考。

⑵ 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的数据模块与传统的数据库模型有什么区别

mogodb是非关系型(NoSQL)数据库,它文档型数据库。

我用过mongodb做了个小项目练习,我简单说说(因为我也了解不深)它与传统数据库的区别吧:

最基本的区别就是数据模型的区别:

  1. 传统数据库 从大到小为数据库,表,行。而mongodb是:数据库,集合,文档,BSON(类似json的二进制数据)。

  2. 传统数据库需要预定义表结构(一经定义,不能改变),而mongodb不需要,而且文档结构可变化(比如说用来相关的文档是放在同一个集合的,但同一个集合的文档不一定结构都是相同的)

  3. 应该还有,想不起来了。

数据模型不同,对应的查询方式也不同。传统的数据库查询方式都是sql,而mongodb的查询方式和sql完全不一样。

还有其他的,如提高可靠性的方案,原子操作的级别等等也不一样。

传统数据库的一些概念在mongodb是不存在的。

设计数据库的时候也不一样,传统数据库在设计时会进行范式化规范化,而mongodb数据库进行设计时候往往会反范式。


下面是从网络拿来的:

对于NoSQL并没有一个明确的范围和定义,但是他们都普遍存在下面一些共同特征:

  1. 不需要预定义模式:不需要事先定义数据模式,预定义表结构。数据中的每条记录都可能有不同的属性和格式。当插入数据时,并不需要预先定义它们的模式。

  2. 无共享架构:相对于将所有数据存储的存储区域网络中的全共享架构。NoSQL往往将数据划分后存储在各个本地服务器上。因为从本地磁盘读取数据的性能往往好于通过网络传输读取数据的性能,从而提高了系统的性能。

  3. 弹性可扩展:可以在系统运行的时候,动态增加或者删除结点。不需要停机维护,数据可以自动迁移。

  4. 分区:相对于将数据存放于同一个节点,NoSQL数据库需要将数据进行分区,将记录分散在多个节点上面。并且通常分区的同时还要做复制。这样既提高了并行性能,又能保证没有单点失效的问题。

  5. 异步复制:和RAID存储系统不同的是,NoSQL中的复制,往往是基于日志的异步复制。这样,数据就可以尽快地写入一个节点,而不会被网络传输引起迟延。缺点是并不总是能保证一致性,这样的方式在出现故障的时候,可能会丢失少量的数据。

  6. BASE:相对于事务严格的ACID特性,NoSQL数据库保证的是BASE特性。BASE是最终一致性和软事务。

NoSQL数据库并没有一个统一的架构,两种NoSQL数据库之间的不同,甚至远远超过两种关系型数据库的不同。可以说,NoSQL各有所长,成功的NoSQL必然特别适用于某些场合或者某些应用,在这些场合中会远远胜过关系型数据库和其他的NoSQL。

⑷ mongodb 创建数据库有什么需要注意的

根据自己实际的应用告知几点:
mongodb的自动sharding 功能:自动切分数据和平衡数据分配。这个很重要。选择合理的shard 能否让数据更均衡的存储。
数据库多集群的配置,可以根据自己的业务场景进行。
就是数据库建模的问题,从根本上认识mongodb和mysql 的区别。关系和文档型数据库两种。
文档型数据库里面很有东西,比如一个表中如果存储的层次过于深,这个可能在检索或者find 时的结构会很复杂,
数据库索引的使用,高效的查询比什么都重要。

⑸ mongodb 设计原则 一般内嵌多少层

让我们回顾下这些方案
你可以采取内嵌,或者建立one端或者N端的引用,也可以三者兼而有之。
你可以在one端或者N端冗余多个字段
下面这些是你需要谨记的:
1、优先考虑内嵌,除非有什么迫不得已的原因。
2、需要单独访问一个对象,那这个对象就不适合被内嵌到其他对象中。
3、数组不应该无限制增长。如果many端有数百个文档对象就不要去内嵌他们可以采用引用ObjectID的方案;如果有数千个文档对象,那么就不要内嵌ObjectID的数组。该采取哪些方案取决于数组的大小。
4、不要害怕应用层级别的join:如果索引建的正确并且通过投影条件(第二章提及)限制返回的结果,那么应用层级别的join并不会比关系数据库中join开销大多少。
5、在进行反范式设计时请先确认读写比。一个几乎不更改只是读取的字段才适合冗余到其他对象中。
6、在mongodb中如何对你的数据建模,取决于你的应用程序如何去访问它们。数据的结构要去适应你的程序的读写场景。

⑹ 用mongodb怎么设计论坛这样的数据库

有效的数据模型是为应用服务的,设计构架的关键问题是文档模型适合使用嵌入式模型(embed)还是使用引用模型(references)。
嵌入式数据模型(Embedded Data Models)
在MongoDB中,你可能将相关数据嵌入到一个单一结构或文档,这些模式通常被称为“非正规”模型,但是它充分利用了MongoDB富文档模型的有点。
嵌入式数据模型允许应用程序存储相关的信息在一条数据库记录中,这样应用程序可能需要更少的查询和更新来完成常规的操作。

⑺ windows下安装好mongodb后怎么创建数据库

一、安装mongoDB
1、解压mongodb-win32-i386-1.8.2至E:\MyProgram\mongodb-win32-i386-1.8.2(你可以按照自己的路径来,路径中最好不要有空格,要不然麻烦)
2、新建文件夹C:\DATA\DB,这是mongoDB的默认数据文件夹,你也可以在文件夹E:\MyProgram\mongodb-win32-i386-1.8.2新建一个文件夹data作为mongoDB的数据库文件存储目录
3、进入CMD,运行命令E:\MyProgram\mongodb-win32-i386-1.8.2\bin\mongod.exe -dbpath E:\MyProgram\mongodb-win32-i386-1.8.2\data,OK,mongoDB已经安装成功并已经在运行中了,你将会看到如下:

此时是mongoDB的运行状态,你可以按Ctrl+C结束运行状态或者直接关掉CMD结束运行。
二、运行mongoDB时的错误与处理
完成安装后,结束掉所有CMD窗口,然后进行如下操作:
1、运行E:\MyProgram\mongodb-win32-i386-1.8.2\bin\mongo,可能会报错误:couldn't connect to server 127.0.0.1 shell/mongo.js,原因是mongod.exe没有启动,
2、既然没启动,那咱就启动呗,运行E:\MyProgram\mongodb-win32-i386-1.8.2\bin\mongod,可能会报错误:dbpath (/data/db/) does not exist, terminating,看这样子,本人觉得还得在data文件夹下再建一个db文件夹啊,如此即新建一db文件夹,再运行mongod命令,结果提示一样,不知道怎么搞啦,咱google吧
找到文章http://www.mongodb.org/display/DOCS/Starting+and+Stopping+Mongo
说“To start Mongo in default mode, where data will be stored in the /data/db directory (or c:\data\db on Windows), and listening on port 27017”,哦,原来默认的文档路径在c:\data\db,啥也不说,直接按这个建文件夹,再次运行命令mongod,OK了,启动成功,这个命令窗口不能关闭,否则mongoDB就退出了
三,使用mongo命令
保持mongod命令窗口的运行状态,再新开一命令窗口
输入E:\MyProgram\mongodb-win32-i386-1.8.2\bin\mongo,出现
MongoDB shell version:1.8.2
connecting to:test
>
OK,连接成功。
1,show dbs 显示数据库列表
2,use Northwind 进入Northwind数据库,大小写敏感
3,show collections 显示数据库中的集合
4,db 用于查看当前所在的数据库
5,db.Customer.count() 查看集合Customer的记录总数
6,db.Customer.findOne({"_id":"1"}) 查看CustomerId=1的记录
新增数据
1,use MyTest,这个数据库不存在,无所谓,mongo会创建,
MongoDB在使用前,并不要求您事先创建好相应的数据库,设计数据表结构!
在MongoDB中,没有【表】的概念,取而代之的是【集合】,也没有【数据记录】的概念,取而代之的是【文档】,我们可以把【文档】理解成一个【对象】,任意的对象,甚至可以有复杂的嵌套层次。
因此,我们不用再写代码从【数据表字段】到C#类的【属性,字段】的转换了,现在直接就可以读写整个对象了。
而且MongoDB不支持Join操作,所以,如果有【关联】操作,就需要你自己来处理
2,item={"Key":"1","text":"wokao","number":3}
3,db.table1.insert(item),mongo将建立集合table1,并将item插入,完成了新增加数据库的工作
4,db.table1.find()显示table1中的数据,MongoDB的文档使用的是一种称为BSON格式的对象,与Javascript中的JSON类似
5,额外的,输入item1={"Id":5,"str":"asdfasdf"},再插入db.table1.insert(item1),再用find()命令看,也插入成功了~,注意到结构和item不一样!但不建议这样做。
注意到:【每个文档有一个名为 "_id" 的成员】,我可没有定义啊。
其实,MongoDB会为每个文档都创建这样一个文档成员,我们指定的 "key", "id" 对于MongoDB来说:它们并不是【文档的主键】,MongoDB只认 "_id",你可以指定,但如果不指定,MongoDB就自动添加。
修改数据
1,var t=db.table1.findOne({"Id":5}),获取一条记录
2,t.str="wokao"
3,db.table1.update({"Id":5},t)
删除数据
db.table1.remove({"Id":5})
查找数据
上面已经有find和findOne命令,即用于查询
db.table1.find()
MongoDB的查询条件中,并没有 >, <, >= , <= 这些运算符,而是使用 "$lt", "$lte", "$gt", "$gte"
新建表
db.MyTest.table2.save({})
删除表
db.table1.drop()或db.runCommand({"drop","table1"})
删除数据库
db.runCommand({"dropDatabase": 1}),此命令只能删除当前数据库
获取服务端状态信息
db.runCommand({"serverStatus" : 1})

⑻ 怎么用mongodb创建数据库

use 命令

MongoDB use DATABASE_NAME 用于创建数据库。该命令将创建一个新的数据库,如果它不存在,否则将返回现有的数据库。

语法:

use DATABASE 语句的基本语法如下:
use DATABASE_NAME

示例:

如果想创建一个数据库名称 <mydb>, 那么 use DATABASE 语句如下:
>use mydb
switched to db mydb

要检查当前选择的数据库使用命令 db
>db
mydb

如果想检查数据库列表,使用命令show dbs.

>show dbs
local 0.78125GB
test 0.23012GB

创建的数据库mydb 列表中是不存在的。要显示的数据库,需要把它插入至少一个文件。
>db.movie.insert({"name":"tutorials yii"})
>show dbs
local 0.78125GB
mydb 0.23012GB
test 0.23012GB

在 MongoDB 默认数据库测试。如果没有创建任何数据库,然后集合将被存储在测试数据库。

⑼ mongodb使用场景是什么

使用场景:

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

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

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

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

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

mongodb设计特点:

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

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

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

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

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

热点内容
怎么给自己手机写一个脚本 发布:2024-11-01 20:23:41 浏览:241
c语言大小写判断 发布:2024-11-01 20:21:53 浏览:130
php的点餐系统源码 发布:2024-11-01 20:13:53 浏览:714
拜占庭算法 发布:2024-11-01 20:10:31 浏览:357
xcode编译参数 发布:2024-11-01 20:00:04 浏览:665
苹果5怎么设置密码锁屏 发布:2024-11-01 19:54:55 浏览:124
宝塔上传文件夹 发布:2024-11-01 19:39:50 浏览:257
java云编译器 发布:2024-11-01 19:34:24 浏览:385
免费源码分享网 发布:2024-11-01 19:29:19 浏览:855
硬盘8mb缓存 发布:2024-11-01 19:20:02 浏览:192