面向文档的数据
Schema 设计原则
在任何数据库系统中建模数据时,下面这些问题都需深思熟虑。
- 数据的基本单元是什么?
RDBMS中有带行列的数据表,键值存储中有指向不定类型值的键,MongoDB中数据的基本是BSON文档。 - 如何查询并更新数据?
RDBMS有即时查询和联结操作查询,MongoDB也有即时查询但不支持联结操作,键值存储只能根据单个键获取值。 - 应用程序的访问模式是什么?
除了理解数据的基本单元和数据库的特性,还需明确应用程序的需求。
在确定理想的数据模型前,必须问无数个与应用程序有关的问题,读写比是多少?需要何种查询?数据是如何更新的?能想到什么并发问题?数据的结构化程度如何?
设计电商数据模型
电商站点通常要求有事务,而事务是RDBMS的主要特性。
产品分类
> var doc={
slug:"gardening-tools",
ancestors:[
{name:"Home",slug:"home"},
{name:"Outdoors",slug:"outdoors"},
],
parent_id:ObjectId(),
name:"Gardening Tools",
description:"Gardening gadgets galore!"
};
> db.categories.insert(doc);
> db.categories.find();
{
"_id" : ObjectId("5a05b1e6f156220da1caf69e"),
"slug" : "gardening-tools",
"ancestors" : [
{
"name" : "Home",
"slug" : "home"
},
{
"name" : "Outdoors",
"slug" : "outdoors"
}
],
"parent_id" : ObjectId("5a05b1e6f156220da1caf69d"),
"name" : "Gardening Tools",
"description" : "Gardening gadgets galore!"
}
产品信息
存放基本产品信息,如产品名称、SKU,其他表用来关联送货信息和价格历史、属性等等。
# 创建数据库
> use eshop;
#创建文档
> var doc = {
slug:"wheel-barrow-9902", // URL短名称,需设置唯一性索引。
sku:"9902",
name:"Extra Large Wheel Barrow",
description:"Heavy duty wheel barrow...",
// 产品详情
detail:{
weight:47,// 重量
weight_units:"lbs", // 计量单位
model_num:4039283402,//厂商型号代码
manufacturer:"Acme",
color:"Green"//颜色
},
total_reviews:4,
average_reviews:4.5,
// 当前价格
pricing:{
retail:589700, //零售价
sale:489700//特价
},
//历史价格
price_history:[
{retail:529700, sale:429700, start:new Date(2017,11,23), end:new Date(2017,12,21)},
{retail:529700, sale:529700, start:new Date(2017,10,21), end:new Date(2017,10,30)}
],
// 产品分类
category_ids:[
new ObjectId('5a05b1e6f156220da1caf69e')
],
main_cat_id: ObjectId(),
// 产品标签
tags:['tools', 'gardening', 'soil']
};
# 插入文档
> db.products.insert(doc);
# 设置索引
> db.products.ensureIndex({slug:1},{unique:true})
> db.getCollection('products').ensureIndex({slug:1},{unqiue:true})
根据分类中的产品
> db.products.find({category_ids=>category['id']});
Error: Line 1: Unexpected token =>
查看指定产品的所有分类
db.categories.find({_id:{$in:product['category_ids']}});
ReferenceError: product is not defined :
@(shell):1:26