MongoDB实战读书笔记(二):面向文档的数据
1 schema设计原则
1.1 关系型数据库的三大设计范式
- 第一范式(1NF)无重复的列
- 第二范式(2NF)属性完全依赖于主键 [ 消除部分子函数依赖 ]
- 第三范式(3NF)属性不依赖于其它非主属性 [ 消除传递依赖 ]
参考:https://blog.csdn.net/zhangminemail/article/details/56834253
1.2 选择Mongodb需要考虑
- 读写比例、查询语句是否复杂、是否需要聚合函数、数据量
- 数据基本单位是什么
- RDBMS:表
- 键值数据库:键指向的值
- Mongodb:BSON文档
- 是否需要强事务支持
- 如何记录生成好的唯一ID或者主键,如:RDMS支持联合主键
1.3 schema基础
(1)文档设计
// 商品
{
_id: ObjectId("4c4b1476238d3b4dd5003981"), // 唯一ID
slug:"wheelbarrow-9092", // 唯一slug
sku:"9092",
name:"Extra Large wheelbarrow",
description:"Heav y duty wheelbarrow...",
details:{ // 嵌套文档
weight:47,
wight_units:"lbs",
model_num: 4039283402,
manufacturer:"Acme",
color:"green"
},
total_reviews:4,
average_review:4.5,
pricing:{
retail:589700,
sale:489700
},
price_history:[{
retail:529700,
sale:429700,
start:new Date(2010,4,1),
end:new Date(2010,4,8)
},{
retail:529700,
sale:529700,
start:new Date(2010,4,9),
end:new Date(2010,4,16)
}],
primary_category: ObjectId("6a5b1476238d3b4dd5000048"), // 一对多
category_ids:[ // 多对多
ObjectId("6a5b1476238d3b4dd5000048"),
ObjectId("6a5b1476238d3b4dd5000049")
],
main_cat_id: ObjectId("6a5b1476238d3b4dd5000048"),
tags:["tools","gardening","soil"]
}
(2)唯一slug
// http://domain.com/products/4c4b1476238d3b4dd5003981
// 展示相对友好一些
// http://domain.com/products/wheelbarrow-9092
db.products.createIndex({slug:1},{unique:true});
(3)内嵌文档
一般用于需要动态修改的内容
如:details为商品详情,每个商品包含的信息不一样。如果是U盘,还需要标识内存大小;如果是桌子,需要标识高度等。
(4)一对多
一个商品只对应一个主要类别,一个类别下有多个商品
(5)多对多
一个商品对应多个关联类别,一个类别有多个商品
(6)关系结构
类别文档可以复用,所以我们需要把它提取出来,而不是像商品信息那样直接嵌套在商品中。
// 类别文档 Home -> Outdoors -> Gardening Tools
{
_id: ObjectId("6a5b1476238d3b4dd5000048"), // Outdoors的子类别
slug:"gardening-tools",
name:"Gardening Tools",
description:"Gardening gadgets glore!",
parent_id: ObjectId("55804822812cb336b78728f9"),
// 冗余数据,用于快速查找
ancestors:[{
name:"Home", // 商品类别
_id:ObjectId("55804822812cb336b78728fa"),
slug:"home"
},{
name:"Outdoors", // Home的子类别
_id:ObjectId("55804822812cb336b78728f9"),
slug:"outdoors"
}]
}
(7)查询
// 查询该类别的所有商品
db.products.find({category_ids:ObjectId("6a5b1476238d3b4dd5000048")})
// 查询商品的所有类别信息
db.categories.find({_id:{$in:product['category_ids']}})
db.products.findOne({'slug':'wheelbarrow-9092'})
1.4 用户和订单:一个用户多个订单
(1)订单
// 订单
{
_id:ObjectId("6a5b1476238d3b4dd5000118"),
user_id:ObjectId("4c4b1476238d3b4dd5003981"), // 用户ID
state:"CART",
line_items:[{
_id:ObjectId("4c4b1476238d3b4dd5003981"),
sku:"9092",
name:"Extra Large Wheelbarrow",
quantity:1,
pricing:{
retail:5897,
sale:4897
}
},{
_id:ObjectId("4c4b1476238d3b4dd5003982"),
sku:"10027",
name:"Rubberized Work Glove, Black",
quantity:2,
pricing:{
retail:1499,
sale:1299
}
}],
shipping_address:{
street:"588 5th",
city:"Brooklyn",
state:"NY",
zip:11215
},
sub_total:6196
}
(2)用户
{
_id:ObjectId("4c4b1476238f3b4dd5000042"),
username:"test",
email:"test@test.com",
first_name:"Kyle",
last_name:"Banker",
hashed_password:"bd1cfa194c3a603e7186780824b04419",
addresses:[{
name:"home",
street:"588 5th",
city:"Brooklyn",
state:"NY",
zip:11215
},{
name:"word",
street:"1 E. 23th",
city:"New York",
state:"NY",
zip:10010
}],
payment_methods:[{
name:"VISA",
payment_token:"43f6ba6b8106fc7"
}]
}
(3)查询操作
// 查询用户的所有订单
db.orders.find({user_id:user['_id']})
// 查询订单的用户信息
db.users.findOne({_id:orders['user_id']})
1.5 评价
{
_id: ObjectId("4c4b1476238d3b4dd5000041"),
product_id: ObjectId("4c4b1476238d3b4dd5003981"),
date: new Date(2010,5,7),
title:'Amazing',
text:'Amzing.I love it.',
rating:4,
user_id: ObjectId("4c4b1476238f3b4dd5000042"),
username: "dgreethumb",
helpful_votes:3,
voter_ids:[ // 评论者的用户ID,阻止多次投票
ObjectId("4c4b1476238f3b4dd5000133"),
ObjectId("4c4b1476238f3b4dd5000003"),
ObjectId("4c4b1476238f3b4dd5001032")
]
}
2 核心概念:数据库、集合、文档
2.1 数据库
(1)数据库是集合和索引的命名空间和物理分组
(2)管理数据库
// 使用garden数据库
> use garden
// 删除当前数据库
> db.dropDatabase()
// 数据库当前状态
> db.stats()
{
"db": "garden",
"collections": NumberInt("4"),
"views": NumberInt("0"),
"objects": NumberInt("477985"),
"avgObjSize": 178.613015052774,
"dataSize": 85374342, // 数据库实际BSON大小
"storageSize": 30539776,// 额外的为集合增长预留的空间
"numExtents": NumberInt("0"),
"indexes": NumberInt("9"),
"indexSize": 10194944, // 索引总大小
"ok": 1
}
2.2 集合
(1)集合是结构或概念上相似的文档的容器。
(2)管理集合
// 显式创建集合
db.createCollection("users");
// 显式创建集合并指定分配空间的大小(字节)
db.createCollection("users",{size:20000});
// 集合名不能超过128个字符
// 重命名集合
db.products.renameCollection("store_products");
(3)固定集合
- 指定集合的大小和集合的容量,类似一个队列,满了之后新的数据进来,最久的数据出去
// Max size:16384kB 数量:100
> db.createCollection("users.actions",{capped:true,size:16384,max:100})
(4)TTL集合
- MongoDb允许在特定的时间后废弃文档数据。
// 一分钟失效,依赖索引机制
> db.reviews.createIndex({time_field:1},{expireAfterSeconds:3600})
(5)系统集合
> db.system.users.find()
> db.system.version.find()
2.3 文档
(1)类型
- 字符串:UTF-8编码,不能由$开始,不包含圆点、不能包含null字节
- 数字:double、int、long
- 时间:从Unix纪元计时开始时间值使用64b整数的毫秒表示
- 虚拟类型:
// 配合应用程序的converter进行转换
// 参考:https://www.cnblogs.com/linzhanfly/p/9578738.html
{
time_with_zone:{
time:new Date(),
zone:"EST"
}
}
(2)限制
BSON文档大小限制为16MB
文档嵌套深度最大为100
插入操作上限为16MB,即如果插入100W条数据需要分割为多个大量插入的文档组。
MongoDB实战读书笔记(二):面向文档的数据的更多相关文章
- 机器学习实战 - 读书笔记(13) - 利用PCA来简化数据
前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第13章 - 利用PCA来简化数据. 这里介绍,机器学习中的降维技术,可简化样品数据. ...
- MongoDB实战读书笔记(一):JavaScript shell操作MongoDB
1 基本增删改查 基本概念: 数据库:同关系型数据库 集合:类似关系型数据库的表 文档:类似关系型数据库的行 字段:类似关系型数据库的列 操作: insert:新增,若新增数据的主键已经存在,则会抛异 ...
- R语言实战读书笔记(二)创建数据集
2.2.2 矩阵 matrix(vector,nrow,ncol,byrow,dimnames,char_vector_rownames,char_vector_colnames) 其中: byrow ...
- 机器学习实战读书笔记(二)k-近邻算法
knn算法: 1.优点:精度高.对异常值不敏感.无数据输入假定 2.缺点:计算复杂度高.空间复杂度高. 3.适用数据范围:数值型和标称型. 一般流程: 1.收集数据 2.准备数据 3.分析数据 4.训 ...
- Java并发编程实战 读书笔记(二)
关于发布和逸出 并发编程实践中,this引用逃逸("this"escape)是指对象还没有构造完成,它的this引用就被发布出去了.这是危及到线程安全的,因为其他线程有可能通过这个 ...
- iPhone与iPad开发实战读书笔记
iPhone开发一些读书笔记 手机应用分类1.教育工具2.生活工具3.社交应用4.定位工具5.游戏6.报纸和杂志的阅读器7.移动办公应用8.财经工具9.手机购物应用10.风景区相关应用11.旅游相关的 ...
- RethinkDB是什么?—— 面向文档的NOSQL数据库,MVCC+Btree索引,pushes JSON to your apps in realtime采用push思路,优化的ssd存储
RethinkDB是什么? RethinkDB是新一代的面向文档的数据库存储管理系统,原本是MySQL中针对SSD优化的一个存储引擎,后来脱离了MySQL成为了独立的系统. 数据如何存储在磁盘上? 数 ...
- 机器学习实战 - 读书笔记(07) - 利用AdaBoost元算法提高分类性能
前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习笔记,这次是第7章 - 利用AdaBoost元算法提高分类性能. 核心思想 在使用某个特定的算法是, ...
- Spring实战读书笔记
Spring实战读书笔记 Spring-core Spring之旅 - DI 和 AOP 概念 spring 的Bean容器 spring 的 核心模块 Spring的核心策略 POJO 最小侵入式编 ...
随机推荐
- 学号20175313 《实现Linux下Sort -t : -k 2功能》第十二周
目录 一.题目要求 二.题目理解 三.设计思路 四.代码实现 五.代码链接 六.运行结果截图 七.参考资料 一.题目要求 实现Linux下Sort -t : -k 2的功能 二.题目理解 -t 分隔符 ...
- arcpy workspace already in transaction mode
arcpy workspace already in transaction mode RuntimeError: workspace already in transaction mode 同一个工 ...
- 风控分类模型种类(决策、排序)比较与模型评估体系(ROC/gini/KS/lift)
python信用评分卡建模(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_ca ...
- 阿里内部分享:我们是如何?深度定制高性能MySQL的
阿里云资深数据库工程师赵建伟在“云栖大会上海峰会”的分享.核心是阿里云的数据库服务和MySQL分支的深度定制实践分享. 阿里巴巴MySQL在全球都是有名的.不仅是因为其性能,还因为其是全世界少数拥有M ...
- microsoft 官方学习资源
https://devblogs.microsoft.com/dotnet/ :_NET Blog https://docs.microsoft.com/zh-cn/learn/ :Microsof ...
- [C++]数据结构:线性表之顺序表
1 顺序表 ADT + Status InitList(SeqList &L) 初始化顺序表 + void printList(SeqList L) 遍历顺序表 + int ListLengt ...
- 上证50ETF申赎清单
[ETF50] Fundid1=510051 CreationRedemptionUnit=900000 MaxCashRatio=0.50000 Publish=1 CreationRedempti ...
- swift 第十二课 as 的使用方法
忽略的基础性的问题,应该早点写出这个问题的解释比较好,毕竟 swift 好多的地方都用到了 as as!as?,是非常容易搞晕大脑的 1,as使用场合 (1)从派生类转换为基类,向上 ...
- whereis which type find
1. whereis name whereis命令只能用于搜索程序名,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返回所有信息. 2. wh ...
- 【编程开发】非对称加密过程详解(基于RSA非对称加密算法实现)
1.非对称加密过程: 假如现实世界中存在A和B进行通讯,为了实现在非安全的通讯通道上实现信息的保密性.完整性.可用性(即信息安全的三个性质),A和B约定使用非对称加密通道进行通讯,具体 ...