MongoDB应用案例:使用 MongoDB 存储商品分类信息

使用 MongoDB 存储商品分类信息 此文已由作者温正湖授权网易云社区发布。欢迎访问网易云社区,了解更多网易技术产品运营经验。这是一篇MongoDB官网上的一篇文章,分析了使用MongoDB存储商品分类信息相比其他数据库的优势,并讲述了如何将其保存到MongoDB中。原址点击:User case – Product Catalog。MongoDB中文社区有大神已将其翻译成中文。在此不重复造车,直接转载。欢迎一起探讨。关系型数据库解决方... 阅读详情

关系型数据库解决方案


针对不同商品,创建不同的表

比如音乐专辑、电影这2种商品,有一部分共同的属性,但也有很多自身特有的属性,可以创建2个不同的表,拥有不同的schema。

CREATE TABLE `product_audio_album` (
    `sku` char(8) NOT NULL,
    ...
    `artist` varchar(255) DEFAULT NULL,
    `genre_0` varchar(255) DEFAULT NULL,
    `genre_1` varchar(255) DEFAULT NULL,
    ...,
    PRIMARY KEY(`sku`))
...
CREATE TABLE `product_film` (
    `sku` char(8) NOT NULL,
    ...
    `title` varchar(255) DEFAULT NULL,
    `rating` char(8) DEFAULT NULL,
    ...,
    PRIMARY KEY(`sku`))
...

这种做法的主要问题在于

  • 针对每个新的商品分类,都需要创建新的表
  • 应用程序开发者必须显式的将请求分发到对应的表上来查询,一次查询多种商品实现起来比较麻烦

所有商品存储到单张表

CREATE TABLE `product` (
    `sku` char(8) NOT NULL,
    ...
    `artist` varchar(255) DEFAULT NULL,
    `genre_0` varchar(255) DEFAULT NULL,
    `genre_1` varchar(255) DEFAULT NULL,
    ...
    `title` varchar(255) DEFAULT NULL,
    `rating` char(8) DEFAULT NULL,
    ...,
    PRIMARY KEY(`sku`))

将所有的商品存储到一张表,这张表包含所有商品需要的属性,不同的商品根据需要设置不同的属性,这种方法使得商品查询比较简单,并且允许一个查询跨多种商品,但缺点是浪费的空间比较多。

提取公共属性,多表继承

CREATE TABLE `product` (
    `sku` char(8) NOT NULL,
    `title` varchar(255) DEFAULT NULL,
    `description` varchar(255) DEFAULT NULL,
    `price`, ...
    PRIMARY KEY(`sku`))

CREATE TABLE `product_audio_album` (
    `sku` char(8) NOT NULL,
    ...
    `artist` varchar(255) DEFAULT NULL,
    `genre_0` varchar(255) DEFAULT NULL,
    `genre_1` varchar(255) DEFAULT NULL,
    ...,
    PRIMARY KEY(`sku`),
    FOREIGN KEY(`sku`) REFERENCES `product`(`sku`))
...
CREATE TABLE `product_film` (
    `sku` char(8) NOT NULL,
    ...
    `title` varchar(255) DEFAULT NULL,
    `rating` char(8) DEFAULT NULL,
    ...,
    PRIMARY KEY(`sku`),
    FOREIGN KEY(`sku`) REFERENCES `product`(`sku`))
...

上述方案将所有商品公共的属性提取出来,将公共属性存储到一张表里,每种商品根据自身的需要创建新的表,新表里只存储该商品特有的信息。

Entity Attribute Values 形式存储

所有的数据按照 的3元组的形式存储,这个方案实际上是把关系型数据库当KV存储使用,模型简单,但应对复杂的查询不是很方便。

ENTITYATTRIBUTEVALUES
sku_00e8da9btypeAudio Album
sku_00e8da9btitleA Love Supreme
sku_00e8da9b……
sku_00e8da9bartistJohn Coltrane
sku_00e8da9bgenreJazz
sku_00e8da9bgenreGeneral
………

MongoDB 解决方案

MognoDB 与关系型数据库不同,其无schema,文档内容可以非常灵活的定制,能很好的使用上述商品分类存储的需求; 将商品信息存储在一个集合里,集合里不同的商品可以自定义文档内容。

比如一个音乐专辑可以类似如下的文档结构

{
  sku: "00e8da9b",
  type: "Audio Album",
  title: "A Love Supreme",
  description: "by John Coltrane",
  asin: "B0000A118M",

  shipping: {
    weight: 6,
    dimensions: {
      width: 10,
      height: 10,
      depth: 1
    },
  },

  pricing: {
    list: 1200,
    retail: 1100,
    savings: 100,
    pct_savings: 8
  },

  details: {
    title: "A Love Supreme [Original Recording Reissued]",
    artist: "John Coltrane",
    genre: [ "Jazz", "General" ],
        ...
    tracks: [
      "A Love Supreme Part I: Acknowledgement",
      "A Love Supreme Part II - Resolution",
      "A Love Supreme, Part III: Pursuance",
      "A Love Supreme, Part IV-Psalm"
    ],
  },
}

而一部电影则可以存储为

{
  sku: "00e8da9d",
  type: "Film",
  ...,
  asin: "B000P0J0AQ",

  shipping: { ... },

  pricing: { ... },

  details: {
    title: "The Matrix",
    director: [ "Andy Wachowski", "Larry Wachowski" ],
    writer: [ "Andy Wachowski", "Larry Wachowski" ],
    ...,
    aspect_ratio: "1.66:1"
  },
}

所有商品都拥有一些共同的基本信息,特定的商品可以根据需要扩展独有的内容,非常方便; 基于上述模型,MongoDB 也能很好的服务各类查询。

查询某个演员参演的所有电影,并按发型日志排序
db.products.find({'type': 'Film', 'details.actor': 'Keanu Reeves'}).sort({'details.issue_date', -1})

上述查询也可以通过建立索引来加速

db.products.createIndex({ type: 1, 'details.actor': 1, 'details.issue_date': -1 })
查询标题里包含特定信息的所有电影
db.products.find({
    'type': 'Film',
    'title': {'$regex': '.*hacker.*', '$options':'i'}}).sort({'details.issue_date', -1})

可建立如下索引来加速查询

db.products.createIndex({ type: 1, details.issue_date: -1, title: 1 })

扩展

当单个节点无法满足海量商品信息存储的需求时,就需要使用MongoDB sharding来扩展,假定大量的查询都是都会基于商品类型,那么就可以使用商品类型字段来进行分片。

db.shardCollection('products', { key: {type: 1} })

分片时,尽量使用复合的索引字段,这样能满足更多的查询需求,比如基于商品类型之后,还会经常根据商品的风格标签来查询,则可以把商品的标签字段作为第二分片key。

db.shardCollection('products', { key: {type: 1, 'details.genre': 1} })

如果某种类型的商品,拥有相同标签的特别多,则会出现jumbo chunk的问题,导致无法迁移,可以进一步的优化分片key,以避免这种情况。

db.shardCollection('products', { key: {type: 1, 'details.genre': 1, sku: 1} })

加入第3分片key之后,即使类型、风格标签都相同,但其sku信息肯定不同,就肯定不会出现超大的chunk。

大数据时代基于MongoDB的金融系统建设案例 本文作者:云本开源系统架构师张志刚。张老师于2021年MongoDB中文社区长沙大会分享:MongoDB在金融行业的应用实践。2021年MongoDB中文社区杭州大会将于7月3日(下周六)在杭州余杭区举办,点击链接即可了解详情: https://sourl.cn/CWUgfP[/caption] 摘要 大数据时代背景下金融系统建设面临重重挑战,下边我们分享基于MongoDB建设金融系统的案例。目前该项目已稳定运行4年,经受住了大数据量时的高性能、高可靠的考验,也提升了金融系统的用户体验。 项. 阅读详情

相关推荐

MongoDB在电商系统中的应用案例

电商系统是典型的“数据密集+场景复杂”型应用:商品信息需支持动态属性扩展,用户行为日志需秒级写入,大促期间订单需抗住百万级并发,个性化推荐依赖实时数据聚合……传统关系型数据库在应对这些需求时往往力不从心。本文以某头部电商平台(简称“E商”)的实践为例,深入解析MongoDB如何通过灵活的文档模型、水平扩展能力及丰富的索引特性,解决电商场景中的核心挑战,并给出从数据建模到生产落地的全流程经验。支持商品属性动态扩展(原Oracle需DBA审批表结构修改);大促期间订单写入性能提升50%;

AI天才研究院 1319

MongoDB实战:内容存储与数据分析案例解析

本文介绍了MongoDB在内容存储和分析应用方面的实际案例和实用技巧。通过灵活的数据结构和非模式特性,MongoDB能够高效存储和快速分析各种复杂的数据。案例分享展示了MongoDB在社交媒体、电商平台等领域的应用,以及如何通过聚合框架和索引功能进行数据分析。最后,本文展望了MongoDB的未来发展趋势,包括实时分析、云服务、集成AI和多模支持等方面。

silenceallat的博客 1626

车载以太网入坑指南,从小白到懂哥的进阶之路【技术分享】

各位技术大佬们好!最近公司项目涉及到车载以太网,刚开始完全懵逼,花了大半个月时间各种查资料、测试设备,总算是摸清了门道。想着互联网上卧虎藏龙,肯定有不少大佬对这个技术感兴趣,所以写个帖子分享一下,顺便求各位大佬指点。

starelink的博客 1262

电商推荐系统(上):推荐系统架构、数据模型、离线统计与机器学习推荐、历史热门商品、最近热门商品、商品平均得分统计推荐、基于隐语义模型的协同过滤推荐、用户商品推荐列表、商品相似度矩阵、模型评估和参数选取

文章目录 第1章 项目体系架构设计 1.1 项目系统架构 1.2 项目数据流程 1.3 数据模型 第2章 工具环境搭建 2.1 MongoDB(单节点)环境配置 2.2 Redis(单节点)环境配置 2.3 Spark(单节点)环境配置 2.4 Zookeeper(单节点)环境配置 2.5 Flume-ng(单节点)环境配置 2.6 Kafka(单节点)环境配置 第3章 创...

qq_43265673的博客 7679

vuecil3+版本下,兼容ie等不支持es6的低版本浏览器

*综上,完成兼容性涉及到的配置的文件有,对应在页面中查看代码,就不单独附代码了:main.js。

yhr0322的博客 835

从零开始使用matlab实现EKF-SLAM算法(含完整代码)

扩展卡尔曼滤波器同步定位与建图 (EKF-SLAM) 算法建立在 EKF 的基础上,集成了 EKF 的功能,可解决机器人技术中最具挑战性的问题之一:同时定位与建图 (SLAM)。 EKF-SLAM采用EKF方法来同时估计机器人的状态和周围环境的布局,而无需事先了解位置。 这种双重功能对于在未知环境中运行的自主系统至关重要,使它们能够在绘制区域地图时有效导航。 EKF-SLAM 算法一直是自动驾驶车辆和机器人系统开发的基石,为处理现实世界环境中固有的不确定性提供了一个强大的框架。

mjmmm的博客 6636

基于Vue+express+mongoDB在线点餐系统设计-计算机毕业源码设计

开发工具: WebStorm 开发环境:Nodejs + vue + express + mongodb数据库 这是一个采用 Vue 和 Node.js 开发的在线点餐管理系统,包括了用户和管理员2个身份。管理员登陆后首页展示今天营业统计和历史统计图,可以添加管理商品分类,添加管理商品信息,商品带图片上传,处理用户的订单,查询历史订单信息,管理桌号点餐码,修改店铺和个人信息;用户前台根据桌号点餐,提交订单后后台管理员可以收到语音提示! 用到的主要技术有:express、bcrypt、passport、pas

计算机源码设计案例的博客 1291

声音事件检测metric:PSDS

这项工作为多声道声音事件检测(SED)系统的性能评估定义了一个新的框架,它克服了传统的collar-based事件决定、事件F-cores和事件错误率的限制。拟议的框架引入了对事件检测的定义,该定义对标签的主观性更为稳健。它还采用了多声道接收器操作特性(ROC)曲线,以提供比F1分数更全面的系统性能洞察力,并建议将这些曲线简化为单一的多声道声音检测分数(PSDS),这允许系统独立于操作点(OPs)进行比较。所提出的方法还能更好地了解不同声音类别的数据偏差和分类稳定性。

Maestro_T的博客 2730

MongoDB详解(有这一篇就够了)

MongoDB 是由C++语言编写的,基于分布式文件存储的数据库,是一个介于关系数据库和非关系数据库之间的产品,是最接近于关系型数据库的NoSQL数据库。MongoDB 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于JSON对象。字段值可以包含其他文档,数组及文档数组类似于MongoDB优点:数据处理能力强,内存级数据库,查询速度快,扩展性强,只是不支持事务。

lfnew的博客 8710

MOSFET导通电阻Rdson全解析:物理组成、公式推导与工程选型要点

在功率电子设计中,MOSFET作为核心开关器件,其导通电阻Rdson直接决定导通损耗与系统效率。从半导体物理角度看,Rdson并非单一固定值,而是由源极电阻、沟道电阻、累积层电阻、JFET区电阻、漂移区电阻及衬底电阻等多个分量串联而成,并随栅极驱动电压、结温以及击穿电压等级发生显著变化。理解Rdson的物理来源与数学表达,有助于工程师在低压大电流与高压小电流等不同场景中合理选型、优化驱动电压并准确估算热损耗。文章从沟道电阻公式出发,深入剖析耐压与导通电阻的物理矛盾、温度系数的影响规律,并给出数据手册参数的正

weixin_29163857的博客 198

【GameFramework框架】二、GameFramework框架介绍

Game Framework框架是由E大(Ellan Jiang)开源的一款基于Unity的通用游戏框架。Game Framework框架提供了游戏开发中常用的框架基础模块,将基础模型进行了封装,在资源管理和资源更新方面比较完善,可以大大加大开发进程,加快开发速度,并且还在在此此处上保证产品质量。实在是代码开发、框架学习、编程进阶、居家旅行哦不对,是提升自己的最佳实践。Game Framework框架。

优快云博客专家,Unity3D高级软件工程师,《Unity 3D从入门到实战》作者。 5851

获取免费图书信息保存到Mongodb数据库中

简单说明 爬取网站网址:‘http://books.toscrape.com/’,选择任意一个图书分类,爬取其详情页信息,分别为图书名、价格以及简介,保存到Mongodb当中 使用工具 requests:pip install requests -i https://pypi.douban.com/simple lxml: ~ pymongo: pip install requests -i https://pypi.douban.com/simple 基本实现思路 对网站网址:'http://boo

进阶中的小白 753

《PLECS仿真与实战:从建模到高端应用》-专栏文件目录

《PLECS仿真与实战:从建模到高端应用》是一本系统介绍PLECS电力电子仿真软件的实用指南。全书共10章,首先介绍软件安装与基础操作,包括RC电路仿真等入门内容;随后深入讲解各类电力电子电路的建模与仿真,涵盖整流、交交变换、直流变换、逆变等电路;最后探讨PWM控制建模和直流调速系统等高端应用。书中配有丰富的示例程序和波形分析方法,附录还包含电力电子器件、代码生成等实用资料。该书适合电力电子领域工程师和学生系统学习电路仿真技术。

544

MongoDB应用案例:使用MongoDB存储商品分类信息

【摘要】电商业务一个基本的功能模块就是存储品类丰富的商品信息,各种商品特性、参数各异,MongoDB 灵活的文档模型非常适合于这类业务,本文主要介绍如何使用 MongoDB 来存储商品分类信息,内容翻译自User case - Product Catalog 关系型数据库解决方案 上述问题使用传统的关系型数据库也可以解决,比如以下几种方案 针对不同商品,创建不同的表 比如音乐专辑、电影这2种...

Joy0921的博客 5174

Python操作WPS文档

在Python中,我们可以使用第三方库来操作WPS文档,实现自动化的文档处理。本文将介绍如何使用Python来打开、读取、修改和保存WPS文档的内容。库,我们可以打开、读取、修改和保存WPS文档的内容。你可以根据自己的需求进一步扩展和优化这些代码,实现更复杂的文档处理功能。安装完成后,我们就可以开始使用它来操作WPS文档了。方法将修改后的文档保存到指定的路径。方法将修改后的文档保存到指定的路径。在上面的代码中,我们通过修改段落的。属性,可以改变段落的文本内容。完成对文档的修改后,我们可以使用。

2301_79366177的博客 5617

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

mongodb存数据php,使用 MongoDB 数据库存储商品信息

电商业务一个基本的功能模块就是存储品类丰富的商品信息,各种商品特性、参数各异,MongoDB 灵活的文档模型非常适合于这类业务,本文主要介绍如何使用 MongoDB 来存储商品分类信息。关系型数据库解决方案上述问题使用传统的关系型数据库也可以解决,比如以下几种方案针对不同商品,创建不同的表比如音乐专辑、电影这2种商品,有一部分共同的属性,但也有很多自身特有的属性,可以创建2个不同的表,拥有不同的s...

weixin_34982065的博客 372

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

MongoDB 应用案例

MongoDB 应用案例 下面列举一些公司MongoDB的实际应用: Craiglist上使用MongoDB的存档数十亿条记录。 FourSquare,基于位置的社交网站,在Amazon EC2的服务器上使用MongoDB分享数据。 Shutterfly,以互联网为基础的社会和个人出版服务,使用MongoDB的各种持久性数据存储的要求。 bit.ly, 一个基于Web的网址缩

Terry - 专注外贸B2C 2533

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

《MongoDB管理与开发精要》——1.3节MongoDB实际应用案例

1.3 MongoDB实际应用案例随着MongoDB的进一步发展和产品进一步成熟,国内外已经有几十家公司将MongoDB应用到生产环境,本节列举几个供读者参考,详细介绍请读者参考http://www.mongodb.org/ display/DOCS/Production+Deployments。1.3.1 国内案例淘宝网成立于2003年5月10日...

weixin_33755649的博客 166

1.5V升3V升压芯片选型与PCB设计实战:PW5100应用指南

升压转换器是电池供电设备的核心,通过开关储能实现电压提升。在低输入电压下,启动电路和开关管驱动决定芯片能否可靠工作,同步整流架构则影响轻载效率。这些技术直接关系到电池寿命和系统稳定性,广泛应用于电子秤、遥控器、无线门铃等产品。以单节干电池升3V为例,PW5100芯片在启动电压、静态电流和效率方面表现突出,配合合理的电感和PCB布局,可实现高达92%的转换效率,满足低功耗设计需求。

weixin_34203832的博客 267

深入了解MongoDB:灵活的文档型数据库与应用案例

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

jixn的博客 3028

Python爬虫项目实战-Scrapy+Charles+MongoDB+Redis实现分布式京东全网信息爬取2020最新版

目录 一、基础知识 二、开发环境及项目结构 三、结果展示 四、实战源码 4.1 数据模型-items.py 4.2 存储操作(以MongoDB为存储数据库)-pipelines.py 4.3 项目配置-settings.py 4.4 中间件配置-middlewares.py 4.5 分类信息抓取-jd_category.py 4.6 抓取商品详细信息-jd_product.py 4.7 分布式操作的实现-add_category_to_redis.py 五、项目使用方法 一、.

Data _designer 3334
上一篇: kafka同步到Elasticsearch
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值