MongoDB电商数据建模

面向文档的数据

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

你可能感兴趣的:(MongoDB电商数据建模)