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等高级用法的详细介绍请参考官方文档中相关说明。
分享到:
相关推荐
常见的非关系型数据库有MongoDB、Redis、Cloudant和HBase。非关系型数据库的特点在于高效(数据常驻内存,减少I/O延迟)和灵活的架构,但可能牺牲了数据的安全性(如断电可能导致数据丢失,尽管有些如Redis支持将...
然而,随着大数据时代的到来,关系型数据库在处理海量数据时可能面临性能瓶颈,这促使了NoSQL数据库的出现,如MongoDB、Cassandra等,它们在大数据场景下展现出更高的灵活性和处理速度。 数据库系统则是管理和控制...
设计实例对比分析MySQL和MongoDB,我们可以深入理解这两种数据库的核心特性和应用场景。MySQL作为关系型数据库,遵循ACID(原子性、一致性、隔离性、持久性)原则,以表格形式存储数据,适合处理结构化、规则性强的...
2. **数据模型设计**:选择合适的数据模型,如关系型数据库(如MySQL、PostgreSQL)或非关系型数据库(如MongoDB、Cassandra)。关系型数据库适用于结构化数据,非关系型数据库则适用于半结构化或无结构化数据。 3....
总的来说,这个项目提供了从传统关系型数据库迁移至NoSQL数据库的实际案例,同时也展示了如何利用邮件验证增强用户注册的安全性。对于学习和理解MongoDB的使用、NoSQL数据库在实际项目中的应用,以及Web应用开发中的...
本资源为腾讯云数据库产品介绍,涵盖了数据库基础知识、腾讯云关系型数据库和非关系型数据库、腾讯云数据库服务和计费方案等内容。通过本资源,读者可以了解数据库的类型、特性和功能,掌握腾讯云数据库产品的优势和...
在数据库开发中,我们主要关注两种类型的数据库:关系型数据库(如MySQL, PostgreSQL, Oracle)和非关系型数据库(如MongoDB, Cassandra)。关系型数据库遵循固定的结构,数据以表格形式存在,通过键值对关联;而非...
- 非关系型数据库(NoSQL):如MongoDB、Cassandra,适用于大数据和高并发场景,支持多种数据模型如键值对、文档、列族和图形数据库。 2. 数据库模式: - 实体关系模型(ER模型):用于描述实体、属性和关系,是...
1.2 非关系型数据库介绍:非关系型数据库又称为NoSQL数据库,它包括键值对存储、文档存储、列存储和图数据库等多种类型,其特点是结构简单、水平扩展性强,适合大数据和高并发的应用场景。 1.3 非关系型数据库种类...
本文将从 MySQL 的基本操作和使用、优化、部署、数据库基本介绍、关系型数据库、非关系型数据库、MySQL 服务器、数据库对象、基本 SQL 操作、字符集、校对集、存储引擎、乱码问题解决、字段(列)类型、列属性等方面...
2. Mysql和MongoDB的特点:Mysql是一种关系型数据库,而MongoDB是一种NoSQL数据库。它们的数据结构和存储方式不同,需要不同的备份策略。 3._backup策略:备份策略基本上都是周期性的全库备份和增量备份。全库备份...
Spring MVC、Hibernate、MySQL和MongoDB是Web开发中常见的四大技术栈,它们分别在应用程序的模型-视图-控制器(MVC)架构、对象关系映射(ORM)、关系型数据库和文档型数据库方面发挥着重要作用。 Spring MVC是...
常见的数据库管理系统(DBMS)包括Oracle、MySQL、SQL Server和MongoDB等。 二、关系型数据库 在关系型数据库中,数据以表格形式存在,表格之间通过键进行关联。SQL(Structured Query Language)是用于操作和查询...
MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),它以其高效、稳定和易于管理的特点,在互联网行业中占据了重要的位置。本篇文章将深入探讨MySQL的基础知识,包括数据库的基本概念、数据库模型、主流DBMS...
2. **非关系型数据库**(NoSQL数据库):这类数据库不依赖于传统的表格模式,而是采用不同的数据模型(例如键值对、文档、列族或图形)。它们的设计理念是为了应对大数据量和高并发访问的需求。 - **常见的非关系型...
基于canal的mysql与redismemcachedmongodb的nosql数据实时同步方案案例canalclient”指的是一个使用C++实现的项目,它利用了阿里巴巴开源的Canal工具来实现实时同步MySQL数据库的数据到NoSQL数据库,如Redis、...
- **数据库类型**:分为关系型数据库(如MySQL、Oracle、SQL Server等)和非关系型数据库(如Redis、MongoDB)。关系型数据库通过外键关联表与表之间的关系,而非关系型数据库则以对象形式存储数据,依赖对象自身...
2. **数据库类型**:根据项目需求,可以选择关系型数据库(如MySQL、PostgreSQL)或非关系型数据库(如MongoDB、Redis)。关系型数据库适合处理结构化数据,非关系型数据库则在处理半结构化或非结构化数据时更有优势...
在SSM中,MyBatis作为数据访问层,与MySQL等关系型数据库交互。 4. **Redis**:Redis是一个内存数据结构存储系统,可以用作数据库、缓存和消息中间件。其高速读写性能使得它成为理想的缓存选择。在SSM整合中,Redis...