文档型数据库

简介

  • MongoDB:文档型数据库,按照文档的形式存储

    • Web App(用的较多)
  • 数据库管理系统(DBMS)

    • 需要把具体如何实现的如 增删改查 隐藏在系统软件中,对用户软件透明

基础概念:

  • 文档(数据模型) 【关系数据库的数据模型是表格】
    • 用<key/attribute,value>存放,json的格式
    • 一个文档里还可以包括子文档
    • 每个文档都有个_id,如果在一个文档中没有说_id是什么,数据库会自动分配一个,可以通过_id找到数据库的任何一个文档
    • 一个文档可以是做一个对象(json)
  • 文档集(collection)

    • 文档的集合(一个文档集可以视为一类对象)
  • 数据库(database)

    • 若干个文档集构成一个数据库
    • 部署在一个服务器上,【一般】一个数据库对应一个应用

文档的访问接口

  • 插入文档
    • db.foo.insert({“bar”:”baz”})
      • db:datebase foo:collection
    • db.foo.batchinsert() 批量插入
  • 查找文档
    • db.blog.find() [查blog文档集的所有文档]
    • Joe=db.people.findOne({“name”:”joe”,”age”:20}); [查people文档集特定属性的文档]
    • db.users.find({},{“username”:1,”email”:1}) [只返回users文档的username,email这两个属性、前面的空括号表明不限定如何查询条件,如果这里去掉后面两个属性就变成查询条件了]
    • db.users.find({“age”:{“$gte”:18,”$lte”:30}}) 【查年龄在18~30的用户文档】
    • db.raffle.find({“ticket_no”}:{“$in”} :{ [725,542,390]}})
  • 删除文档
    • db.foo.remove()
    • db.mailing.list.remove({“opt-out”:true})
  • 更新文档
    • db.users.update({“_id” : ObjectId(“28h32j223e92e”)},…{“$set” : {“favorite book” : “War and Peace”}}) 【$set指置换】
    • db.games.update({“game” : “pinball”, “user” : “joe”},…{“$inc” : {“score” : 50}})

文档模型的设计思想

  • 优点:每个元素都被视为对象(储存为json格式)

存储器件

  • 数据处理性能的宗旨

    • 提高数据访问的局部性:
    • 对磁盘/闪存而言
      • 减少I/O的次数;
      • 变随机访问为顺序访问。
    • 对内存而言
      • 增加Cache的命中率
  • 数据库的基本存储架构

    • 以页为单位存放数据。每一页为512bytes的整数倍,4KB到4MB。

索引:

  • 对于非聚集索引,有些查询甚至可以不访问数据页。
  • 聚集索引可以避免数据插入操作集中于表的最后一个数据页。

  • 当然,众所周知,虽然索引可以提高查询速度,但是它们也会导致数据库系统更新数据的性能下降,因为大部分数据更新需要同时更新索引。

  • 参考 https://www.cnblogs.com/ccsccs/articles/4243644.html

B-Tree

B-Tree的平衡性

  • 每个节点的大小固定(e.g. 4KB或8KB),因此最多只能容纳n个键和n+1个指针。

什么决定B-Tree的效率?

  • 树的高度决定查询需要I/O次数。
  • 对于同样规模的数据,n越大树的高度越低。
  • 为了提高B-Tree的效率,我们需要增加n,即增加每个节点容纳键和指针的数量。
    • 用简短的数据类型定义键的属性,e.g. smallint.
    • 对B-Tree进行压缩。
0%