MongoDB:面向文档的数据库,每一个json字符串就是一个文档
关系型数据库难实现,有很多挑战。
序列化方案:用文本字段存json字符串,但先变成二进制,变成bson的形式,存入dumps,取出时要loads调差问卷web前端设计网页(传统的方法)
{
num:5
problems:[
{type:"danxuan",time:"...",xuanxiang:"...."},
{type:"danxuan",time:"...",xuanxiang:"...."},
{type:"danxuan",time:"...",xuanxiang:"...."},
{type:"danxuan",time:"...",xuanxiang:"...."},
{type:"danxuan",time:"...",xuanxiang:"...."},
]
}
table wenjuan< id,author,time,content>
先把要存储的数据转化,即序列化变成一个对象,取得时候先解析数据才能使用而面对大数据,如何扩展数据库:
提升性能:scale-up(成本太高,配置要求太严格) vs scale-out
集群情况下主键自增的问题:分布式数据库只能加锁,但是还是顺序的存储,根本上还是没有改变。
大数据情况下,由集群来实现,就没有主键的问题,MongoDB为每一个记录设置一个id
没有结构是MongoDB的特点,无需定义表结构,直接插入数据,即文档(json字符串)
MongoDB sql
一个文档就是一条记录 一个集合(就是一堆东西放一起,没有固定结构)就是一张表
数据库 数据库
server server
优势:
特点:没有表结构,容易扩展,id非自增,objectid,出生时就考虑集群。
python,javascript(做前端后台用同一种语言)全栈开发,流行的,用一个语言来整体开发MapReduce分布式,MongoDB可以实现。 mangodb运维很简单,双机热备自动解决方案,集群添加新的结点
劣势:
不支持join查询,即不能进行连接查询,不同集合不能进行连接。不支持事务数据非实时写入,数据可能会丢失。
stu<id,name,stuno,...>
course<id,name,cridet,...>
stu_course<id,id_stu,id_course>
stu{name:lilei,stuno:1101}
stu{name:cdcd,stuno:1102}
course{name:math..}
stu_course{...} {...} {....}
在关系型数据库可以连接,但是mangodb不行
stu_course{
stu_name:"xiaoming",
stuno:'20151209032027',
courses:[
coursename:'math',courseteacher:'xxx',...
coursename:'english',courseteacher:'xxx',...
coursename:'hanyu',courseteacher:'xxx',...
...
]
}//这个表浪费空间
course_stu{
course_name:'english',
course_credit;4
students:[
stu_name:"xiaoming",stuno:'20151209032027',
stu_name:"yansiyu",stuno:'20151209032033',
stu_name:"quxiaojuan",stuno:'20151209031017',
]
}//这个表也有重复信息冗余
student{name:"..",stuno:".."}
course{coursename:"..",course_id:"..."}
course_stu{stuno:"..",}//这种方法开发实现会比较困难。
使用MongoDB进行插入数据的时候,可以通过变量的输入进行。直接插入变量,这种方式简单易于书写。直接在命令窗口输入容易出错。
通过mapreduce的方式存储数据。
在进行MongoDB的学习中,对索引的引入也是很重要的,老师上课讲了一个问题,当加上索引创建十万条记录和没有索引创建十万条记录那个插入效率快,其实应该想到没有索引插入快,毕竟索引本身也占有物理空间,添加索引在插入的同时还需要记录下位置,插入效率当然慢。但是通过建立索引拉取数据的时候,还是可以明显地看到查询的时间短了很多。
网友评论