`
dongbei
  • 浏览: 5734 次
  • 性别: Icon_minigender_1
  • 来自: 大连
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

关系型数据库MySQL和文档型数据库MongoDB设计实例对比

阅读更多
MySQL需要多个表,多次查询才能搞定的问题,MongoDB只需要一个表,一次查询就能搞定,对比完成,相对MySQL而言,MongoDB显得更胜一筹,至少本例如此。

MySQL是关系型数据库中的明星,MongoDB是文档型数据库中的翘楚。下面通过一个设计实例对比一下二者:假设我们正在维护一个手机产品库,里面除了包含手机的名称,品牌等基本信息,还包含了待机时间,外观设计等参数信息,应该如何存取数据呢?

如果使用MySQL的话,应该如何存取数据呢?

如果使用MySQL话,手机的基本信息单独是一个表,另外由于不同手机的参数信息差异很大,所以还需要一个参数表来单独保存。

CREATE TABLE IF NOT EXISTS `mobiles` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `name` VARCHAR(100) NOT NULL,
    `brand` VARCHAR(100) NOT NULL,
    PRIMARY KEY (`id`)
);

CREATE TABLE IF NOT EXISTS `mobile_params` (
    `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
    `mobile_id` int(10) unsigned NOT NULL,
    `name` varchar(100) NOT NULL,
    `value` varchar(100) NOT NULL,
    PRIMARY KEY (`id`)
);

INSERT INTO `mobiles` (`id`, `name`, `brand`) VALUES
(1, 'ME525', '摩托罗拉'),
(2, 'E7'   , '诺基亚');

INSERT INTO `mobile_params` (`id`, `mobile_id`, `name`, `value`) VALUES
(1, 1, '待机时间', '200'),
(2, 1, '外观设计', '直板'),
(3, 2, '待机时间', '500'),
(4, 2, '外观设计', '滑盖');



注:为了演示方便,没有严格遵守关系型数据库的范式设计。

如果想查询待机时间大于100小时,并且外观设计是直板的手机,需要按照如下方式查询:

SELECT * FROM `mobile_params` WHERE name = '待机时间' AND value > 100;
SELECT * FROM `mobile_params` WHERE name = '外观设计' AND value = '直板';



注:参数表为了方便,把数值和字符串统一保存成字符串,实际使用时,MySQL允许在字符串类型的字段上进行数值类型的查询,只是需要进行类型转换,多少会影响一点性能。

两条SQL的结果取交集得到想要的MOBILE_ID,再到mobiles表查询即可:

SELECT * FROM `mobiles` WHERE mobile_id IN (MOBILE_ID)



如果使用MongoDB的话,应该如何存取数据呢?

如果使用MongoDB的话,虽然理论上可以采用和MySQL一样的设计方案,但那样的话就显得无趣了,没有发挥出MongoDB作为文档型数据库的优点,实际上使用MongoDB的话,和MySQL相比,形象一点来说,可以合二为一:

db.getCollection("mobiles").ensureIndex({
    "params.name": 1,
    "params.value": 1
});

db.getCollection("mobiles").insert({
    "_id": 1,
    "name": "ME525",
    "brand": "摩托罗拉",
    "params": [
        {"name": "待机时间", "value": 200},
        {"name": "外观设计", "value": "直板"}
    ]
});

db.getCollection("mobiles").insert({
    "_id": 2,
    "name": "E7",
    "brand": "诺基亚",
    "params": [
        {"name": "待机时间", "value": 500},
        {"name": "外观设计", "value": "滑盖"}
    ]
});



如果想查询待机时间大于100小时,并且外观设计是直板的手机,需要按照如下方式查询:

db.getCollection("mobiles").find({
    "params": {
        $all: [
            {$elemMatch: {"name": "待机时间", "value": {$gt: 100}}},
            {$elemMatch: {"name": "外观设计", "value": "直板"}}
        ]
    }
});



注:查询中用到的$all,$elemMatch等高级用法的详细介绍请参考官方文档中相关说明。
分享到:
评论

相关推荐

    关系型数据库.pptx

    常见的非关系型数据库有MongoDB、Redis、Cloudant和HBase。非关系型数据库的特点在于高效(数据常驻内存,减少I/O延迟)和灵活的架构,但可能牺牲了数据的安全性(如断电可能导致数据丢失,尽管有些如Redis支持将...

    数据库应用与设计-大型数据库系统架构设计方法_架构设计_关系型数据库_数据库系统_

    然而,随着大数据时代的到来,关系型数据库在处理海量数据时可能面临性能瓶颈,这促使了NoSQL数据库的出现,如MongoDB、Cassandra等,它们在大数据场景下展现出更高的灵活性和处理速度。 数据库系统则是管理和控制...

    MySQL和MongoDB设计实例对比分析

    设计实例对比分析MySQL和MongoDB,我们可以深入理解这两种数据库的核心特性和应用场景。MySQL作为关系型数据库,遵循ACID(原子性、一致性、隔离性、持久性)原则,以表格形式存储数据,适合处理结构化、规则性强的...

    数据库开发设计实例 方案 案例 实例

    2. **数据模型设计**:选择合适的数据模型,如关系型数据库(如MySQL、PostgreSQL)或非关系型数据库(如MongoDB、Cassandra)。关系型数据库适用于结构化数据,非关系型数据库则适用于半结构化或无结构化数据。 3....

    瑞吉外卖+MongoDB+qq邮箱验证,实验所有源码+数据库全拷贝

    总的来说,这个项目提供了从传统关系型数据库迁移至NoSQL数据库的实际案例,同时也展示了如何利用邮件验证增强用户注册的安全性。对于学习和理解MongoDB的使用、NoSQL数据库在实际项目中的应用,以及Web应用开发中的...

    10 腾讯云数据库产品介绍

    本资源为腾讯云数据库产品介绍,涵盖了数据库基础知识、腾讯云关系型数据库和非关系型数据库、腾讯云数据库服务和计费方案等内容。通过本资源,读者可以了解数据库的类型、特性和功能,掌握腾讯云数据库产品的优势和...

    数据库开发实例(经典案例)

    在数据库开发中,我们主要关注两种类型的数据库:关系型数据库(如MySQL, PostgreSQL, Oracle)和非关系型数据库(如MongoDB, Cassandra)。关系型数据库遵循固定的结构,数据以表格形式存在,通过键值对关联;而非...

    数据库相关文档

    - 非关系型数据库(NoSQL):如MongoDB、Cassandra,适用于大数据和高并发场景,支持多种数据模型如键值对、文档、列族和图形数据库。 2. 数据库模式: - 实体关系模型(ER模型):用于描述实体、属性和关系,是...

    MySQL DBA运维笔记 超详细

    1.2 非关系型数据库介绍:非关系型数据库又称为NoSQL数据库,它包括键值对存储、文档存储、列存储和图数据库等多种类型,其特点是结构简单、水平扩展性强,适合大数据和高并发的应用场景。 1.3 非关系型数据库种类...

    mysql 核心知识要点

    本文将从 MySQL 的基本操作和使用、优化、部署、数据库基本介绍、关系型数据库、非关系型数据库、MySQL 服务器、数据库对象、基本 SQL 操作、字符集、校对集、存储引擎、乱码问题解决、字段(列)类型、列属性等方面...

    基于Mysql和MongoDB的协同备份方案研究与实现.pdf

    2. Mysql和MongoDB的特点:Mysql是一种关系型数据库,而MongoDB是一种NoSQL数据库。它们的数据结构和存储方式不同,需要不同的备份策略。 3._backup策略:备份策略基本上都是周期性的全库备份和增量备份。全库备份...

    Springmvc+hibernate+mysql+mongodb

    Spring MVC、Hibernate、MySQL和MongoDB是Web开发中常见的四大技术栈,它们分别在应用程序的模型-视图-控制器(MVC)架构、对象关系映射(ORM)、关系型数据库和文档型数据库方面发挥着重要作用。 Spring MVC是...

    数据库应用技术 题和答案

    常见的数据库管理系统(DBMS)包括Oracle、MySQL、SQL Server和MongoDB等。 二、关系型数据库 在关系型数据库中,数据以表格形式存在,表格之间通过键进行关联。SQL(Structured Query Language)是用于操作和查询...

    MySQL数据库管理与应用.docx

    MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),它以其高效、稳定和易于管理的特点,在互联网行业中占据了重要的位置。本篇文章将深入探讨MySQL的基础知识,包括数据库的基本概念、数据库模型、主流DBMS...

    一文读懂mysql数据库

    2. **非关系型数据库**(NoSQL数据库):这类数据库不依赖于传统的表格模式,而是采用不同的数据模型(例如键值对、文档、列族或图形)。它们的设计理念是为了应对大数据量和高并发访问的需求。 - **常见的非关系型...

    cpp-基于canal的mysql与redismemcachedmongodb的nosql数据实时同步方案案例canalclient

    基于canal的mysql与redismemcachedmongodb的nosql数据实时同步方案案例canalclient”指的是一个使用C++实现的项目,它利用了阿里巴巴开源的Canal工具来实现实时同步MySQL数据库的数据到NoSQL数据库,如Redis、...

    MySQL基础PDF版

    - **数据库类型**:分为关系型数据库(如MySQL、Oracle、SQL Server等)和非关系型数据库(如Redis、MongoDB)。关系型数据库通过外键关联表与表之间的关系,而非关系型数据库则以对象形式存储数据,依赖对象自身...

    服务器 数据库 框架搭建案例

    2. **数据库类型**:根据项目需求,可以选择关系型数据库(如MySQL、PostgreSQL)或非关系型数据库(如MongoDB、Redis)。关系型数据库适合处理结构化数据,非关系型数据库则在处理半结构化或非结构化数据时更有优势...

    ssm框架整合redis+mongodb实例

    在SSM中,MyBatis作为数据访问层,与MySQL等关系型数据库交互。 4. **Redis**:Redis是一个内存数据结构存储系统,可以用作数据库、缓存和消息中间件。其高速读写性能使得它成为理想的缓存选择。在SSM整合中,Redis...

Global site tag (gtag.js) - Google Analytics