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实战读书笔记(二):面向文档的数据的更多相关文章

  1. 机器学习实战 - 读书笔记(13) - 利用PCA来简化数据

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习心得,这次是第13章 - 利用PCA来简化数据. 这里介绍,机器学习中的降维技术,可简化样品数据. ...

  2. MongoDB实战读书笔记(一):JavaScript shell操作MongoDB

    1 基本增删改查 基本概念: 数据库:同关系型数据库 集合:类似关系型数据库的表 文档:类似关系型数据库的行 字段:类似关系型数据库的列 操作: insert:新增,若新增数据的主键已经存在,则会抛异 ...

  3. R语言实战读书笔记(二)创建数据集

    2.2.2 矩阵 matrix(vector,nrow,ncol,byrow,dimnames,char_vector_rownames,char_vector_colnames) 其中: byrow ...

  4. 机器学习实战读书笔记(二)k-近邻算法

    knn算法: 1.优点:精度高.对异常值不敏感.无数据输入假定 2.缺点:计算复杂度高.空间复杂度高. 3.适用数据范围:数值型和标称型. 一般流程: 1.收集数据 2.准备数据 3.分析数据 4.训 ...

  5. Java并发编程实战 读书笔记(二)

    关于发布和逸出 并发编程实践中,this引用逃逸("this"escape)是指对象还没有构造完成,它的this引用就被发布出去了.这是危及到线程安全的,因为其他线程有可能通过这个 ...

  6. iPhone与iPad开发实战读书笔记

    iPhone开发一些读书笔记 手机应用分类1.教育工具2.生活工具3.社交应用4.定位工具5.游戏6.报纸和杂志的阅读器7.移动办公应用8.财经工具9.手机购物应用10.风景区相关应用11.旅游相关的 ...

  7. RethinkDB是什么?—— 面向文档的NOSQL数据库,MVCC+Btree索引,pushes JSON to your apps in realtime采用push思路,优化的ssd存储

    RethinkDB是什么? RethinkDB是新一代的面向文档的数据库存储管理系统,原本是MySQL中针对SSD优化的一个存储引擎,后来脱离了MySQL成为了独立的系统. 数据如何存储在磁盘上? 数 ...

  8. 机器学习实战 - 读书笔记(07) - 利用AdaBoost元算法提高分类性能

    前言 最近在看Peter Harrington写的"机器学习实战",这是我的学习笔记,这次是第7章 - 利用AdaBoost元算法提高分类性能. 核心思想 在使用某个特定的算法是, ...

  9. Spring实战读书笔记

    Spring实战读书笔记 Spring-core Spring之旅 - DI 和 AOP 概念 spring 的Bean容器 spring 的 核心模块 Spring的核心策略 POJO 最小侵入式编 ...

随机推荐

  1. 学号20175313 《实现Linux下Sort -t : -k 2功能》第十二周

    目录 一.题目要求 二.题目理解 三.设计思路 四.代码实现 五.代码链接 六.运行结果截图 七.参考资料 一.题目要求 实现Linux下Sort -t : -k 2的功能 二.题目理解 -t 分隔符 ...

  2. arcpy workspace already in transaction mode

    arcpy workspace already in transaction mode RuntimeError: workspace already in transaction mode 同一个工 ...

  3. 风控分类模型种类(决策、排序)比较与模型评估体系(ROC/gini/KS/lift)

    python信用评分卡建模(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_ca ...

  4. 阿里内部分享:我们是如何?深度定制高性能MySQL的

    阿里云资深数据库工程师赵建伟在“云栖大会上海峰会”的分享.核心是阿里云的数据库服务和MySQL分支的深度定制实践分享. 阿里巴巴MySQL在全球都是有名的.不仅是因为其性能,还因为其是全世界少数拥有M ...

  5. microsoft 官方学习资源

    https://devblogs.microsoft.com/dotnet/  :_NET Blog https://docs.microsoft.com/zh-cn/learn/ :Microsof ...

  6. [C++]数据结构:线性表之顺序表

    1 顺序表 ADT + Status InitList(SeqList &L) 初始化顺序表 + void printList(SeqList L) 遍历顺序表 + int ListLengt ...

  7. 上证50ETF申赎清单

    [ETF50] Fundid1=510051 CreationRedemptionUnit=900000 MaxCashRatio=0.50000 Publish=1 CreationRedempti ...

  8. swift 第十二课 as 的使用方法

    忽略的基础性的问题,应该早点写出这个问题的解释比较好,毕竟 swift 好多的地方都用到了 as as!as?,是非常容易搞晕大脑的 1,as使用场合          (1)从派生类转换为基类,向上 ...

  9. whereis which type find

    1. whereis  name whereis命令只能用于搜索程序名,而且只搜索二进制文件(参数-b).man说明文件(参数-m)和源代码文件(参数-s).如果省略参数,则返回所有信息. 2. wh ...

  10. 【编程开发】非对称加密过程详解(基于RSA非对称加密算法实现)

    1.非对称加密过程:         假如现实世界中存在A和B进行通讯,为了实现在非安全的通讯通道上实现信息的保密性.完整性.可用性(即信息安全的三个性质),A和B约定使用非对称加密通道进行通讯,具体 ...