1. MySQL和MongoDB 简介
MySQL和MongoDB是当今最流行的关系型和非关系型数据库系统,它们被广泛应用于各类企业级应用和Web应用。MySQL是一个开源的关系型数据库管理系统,它使用SQL语言作为查询语言和开发接口。MongoDB是一个基于文档存储的NoSQL数据库,它使用类似JSON的BSON格式存储数据。
虽然MySQL和MongoDB都是数据库管理系统,但它们在数据存储、查询语言、事务处理、数据模型等方面存在显著的差异。
2. 数据存储方式的差异
2.1 MySQL 数据存储
MySQL是一个基于关系型模型的数据库系统,它使用表(Table)的形式存储数据。表由多行多列组成,每行代表一个记录,每列代表一种属性。表中的所有记录必须遵循相同的结构,即都有相同的列。
--创建user表
CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`age` int(11) NOT NULL,
`gender` enum('M','F') NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
上面的SQL语句创建了一个名为user的表,表中包含id、name、age和gender四个列。其中id是主键,在插入记录时自增长。
2.2 MongoDB 数据存储
MongoDB是一个基于文档存储的数据库系统,它将数据存储在“文档”中。文档是一种类似于JSON格式的数据结构,由键值对组成,不同的文档可以具有不同的结构。MongoDB的一个数据库可以包含多个文档,文档之间没有明确的关系。
db.createCollection('user', {
validator: {
$jsonSchema: {
bsonType: "object",
required: [ "name", "age", "gender" ],
properties: {
name: {
bsonType: "string",
description: "must be a string and is required"
},
age: {
bsonType: "int",
minimum: 18,
maximum: 60,
description: "must be an integer in [18, 60] and is required"
},
gender: {
bsonType : "string",
enum: [ "M", "F"],
description: "can only be one of the enum values and is required"
}
}
}
}
})
上面的代码创建了一个名为user的集合,它的文档结构由name、age和gender三个属性组成,并且对属性类型和取值范围做了一些限制。
3. 查询语言的差异
3.1 MySQL查询语言
MySQL使用SQL语言进行查询,它是一种功能强大的语言,可以进行复杂的数据处理操作。以下是一些SQL语句示例:
--查询所有用户
SELECT * FROM user;
--查询年龄大于20岁的用户
SELECT * FROM user WHERE age > 20;
--查询男性用户
SELECT * FROM user WHERE gender = 'M';
可以看到,SQL语句可以进行简单的过滤和排序,也可以进行连接、子查询和聚合操作。
3.2 MongoDB查询语言
MongoDB使用查询表达式进行查询,它是一种基于JSON格式的查询语言,通过指定键值对的方式筛选文档。以下是一些查询表达式示例:
--查询所有用户
db.user.find();
--查询年龄大于20岁的用户
db.user.find({ "age": { $gt: 20 } });
--查询男性用户
db.user.find({ "gender": "M" });
可以看到,MongoDB查询表达式相较于SQL语句来说语法更简洁、更易读。
4. 事务处理的差异
4.1 MySQL事务处理
MySQL支持ACID事务,通过BEGIN、COMMIT和ROLLBACK语句实现事务处理。BEGIN表示开启一个新的事务,COMMIT表示提交当前事务,ROLLBACK表示回滚当前事务。以下是一个简单的事务处理示例:
--创建用户表
CREATE TABLE IF NOT EXISTS `user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(50) NOT NULL,
`age` int(11) NOT NULL,
`gender` enum('M','F') NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--开始事务
BEGIN;
--插入用户记录
INSERT INTO user (name, age, gender) VALUES ('Jack', 25, 'M');
--更新用户记录
UPDATE user SET age = 30 WHERE name = 'Jack';
--提交事务
COMMIT;
上面的SQL语句中,我们使用BEGIN开启了一个事务,然后进行了插入和更新操作,最后使用COMMIT提交了这个事务。
4.2 MongoDB事务处理
MongoDB在3.7.6版本中增加了对多文档事务的支持,事务处理在MongoDB中使用Transaction语句实现。
session = db.getMongo().startSession( { readConcern: { level: "snapshot" }, writeConcern: { w: "majority" } } );
session.startTransaction( { readConcern: { isolationLevel: 'snapshot' }, writeConcern: { w: 'majority' } } );
try {
db.user.insertOne( { _id: 1, name: "Jack", age: 25, gender: "M" } );
db.user.updateOne( { _id: 1 }, { $set: { age: 30 } } );
session.commitTransaction();
} catch (error) {
session.abortTransaction();
}
上面的代码中,我们使用startTransaction方法开启一个新的事务,并进行插入和更新操作,最后使用commitTransaction提交事务。如果在事务处理中出现错误,可以通过abortTransaction方法回滚事务。
5. 数据模型的差异
5.1 MySQL数据模型
MySQL使用表的结构模型来处理数据,所有记录都存储在表中。表中的每条记录都需要按照预定的模式进行定义。MySQL的数据模型是一个明确、静态的模型。
5.2 MongoDB数据模型
MongoDB使用动态文档模型来处理数据,文档可以包含不同的结构,不同的文档可以拥有不同的字段或结构,这意味着文档可以十分灵活地适应数据的改变和需求的变化。
6. 总结
MySQL和MongoDB都是非常优秀的数据库管理系统,它们在数据存储方式、查询语言、事务处理和数据模型方面存在很大的差异。针对具体的业务需求,开发者需要根据系统的特点和数据量来选择合适的数据库系统。