精选MySQL与MongoDB:选择数据管理解决方案

通过优锐课核心java学习笔记中,我们可以看到,码了很多专业的相关知识, 分享给大家参考学习。

1. 简介

可以公平地说,作为IT专业人员,我们生活在数据管理时代的黄金时代。随着我们的软件系统在无数的可伸缩性和可用性要求的驱动下变得越来越复杂和分散,多年来使用的传统解决方案开始落后。

本教程的目的是对两种数据管理解决方案进行公平的概述:以MySQL为代表的成熟且广泛使用的关系数据库,以及一个新的子代MongoDB,MongoDB又代表了新一代数据存储。决不是一场与明确赢家的战斗。相反,其目的是通过研究MySQL和MongoDB的功能,讨论每个开发人员具有的不同保证和限制,帮助开发人员做出选择并找到适合其应用程序的合适选择。

2. RDBM系统的优势

数据管理软件的历史和发展并不是花费时间的特别令人兴奋的话题。在相当长的一段时间里,关系数据库管理系统一直处于领导地位,多年来选择很明显,无论是MySQL,PostreSQL还是Oracle,仅举几例。 SQL(及其特定于供应商的方言)是查询关系数据存储的实际标准,根据定义,每个后端软件开发人员都必须学习并至少了解一些基础知识。直到最近,当出现了一系列新的数据管理系统时,它的运行情况令人惊讶地良好,这种现象也被称为NoSQL(或不仅仅是SQL)运动。

3. NoSQL运动的新时代

如今,现代软件系统在数据量和请求/事务吞吐量要求方面面临的挑战表明,关系数据存储通常成为瓶颈,从而对整个系统的可伸缩性施加了限制。传统上,解决此问题的方法是购买一个更大的盒子(所谓的垂直可伸缩性),但是在某些时候要付出的代价变得非常非常高,使整个系统变得非常昂贵和不切实际。

业界一直在积极寻求一种便宜的方法来构建复杂的分布式系统,而不是使用水平可伸缩性。它还意味着想出关系数据存储的替代方案,它们也可以水平扩展。那一刻,NoSQL运动开始了。

4.表格,文档,图形,键/值

关系数据模型以元组和关系(通常称为表)表示所有数据。结构化数据非常适合此模型,并且很长一段时间没有其他可行的替代方案。随着NoSQL的发展,开发了许多替代数据模型,催生了一大堆专用数据存储系统。

NoSQL解决方案可以分为几类。文档数据存储旨在用于存储,查询和管理文档(半结构化数据)。该类别中较成熟的代表包括CouchDB,Couchbase,MongoDB,OrientDB和HyperDex。键/值数据存储区旨在存储,查询和管理关联数组(也称为字典或哈希)。

此类别中使用最广泛的代表包括DynamoDB,FoundationDB,HyperDex,MemcacheDB,Redis,Riak,Aerospike和OrientDB。图形数据存储旨在有效地存储和操作图形结构。该类别的著名代表包括Neo4J,InfiniteGraph,GraphBase和OrientDB。最后但并非最不重要的一点是,宽列数据存储采用了混合方法(结合了键/值数据存储和传统关系数据存储的某些特征)。该类别中最先进的代表包括Accumulo,Cassandra和HBase。

请注意,上面列出的不同NoSQL数据存储列表远非完整,它仅包含最知名和使用最广泛的名称,但是还有更多的名称。

5. MySQL和MongoDB:明智的决策

足够的介绍,让我们继续进行更实际的事情。在本教程的这一部分中,我们将使用MySQL和MongoDB来研究应用程序开发过程的所有方面,还花费一些时间来讨论部署和监视。目的是讨论每个数据存储区所做的取舍和设计决策,并分析它们如何改变我们开发应用程序的方式。此外,本教程的另一个目的是在考虑到应用程序体系结构,数据访问模式和存储要求的情况下,帮助确定MongoDB可能是比MySQL更好的选择(反之亦然)。

就像我们现在已经说过的那样,MongoDB是一个文档数据存储。它存储JSON样式的文档,这些文档被分组为集合。 MongoDB数据模型层次结构的顶部是一个数据库(请参阅官方文档以获取全面的详细信息)。 MongoDB的当前生产就绪版本为3.0.4。

从另一方面来看,MySQL是关系数据存储。数据存储在包含列的表中。这些表被分组到数据库中(请参阅官方文档以获取全面的详细信息)。 MySQL的当前生产就绪版本为5.6.25。

MySQL支持多个存储引擎,每个存储引擎都有自己的用途,并且具有其他存储引擎不具备的某些功能。在本教程中,我们假设使用了InnoDB存储引擎,因为它是默认和最通用的存储引擎,除特殊用例外,建议使用它。

5.1.强制模式与无模式

MySQL作为关系数据存储区,其数据模型需要严格的架构:所有表均应使用定义的列来创建。 只有这样,才能使用SQL语言存储和查询数据。 由于每次需要修改数据模型时,都应先更改架构,然后再迁移数据,这使开发和部署过程变得有些复杂。 这是使用MySQL Shell和SQL语言创建新数据库,新表并向其中插入一行所需的典型步骤示例:

 

 

1

2

3

4

5

6

7

CREATE DATABASE tutorial;

USE tutorial;

CREATE TABLE chapters (

    id INT PRIMARY KEY AUTO_INCREMENT,

    title VARCHAR(255) NOT NULL

);

INSERT INTO chapters (title) VALUES ("MySQL and MongoDB: trade-offs, not battles");

相比之下,MongoDB不会对存储在集合中的文档强加任何架构。 这是应用程序的责任,MongoDB唯一的限制就是受支持的数据类型。 它可以立即使用MongoDB存储任何形状的JSON文档,从而大大加快了开发过程。

 

文档的结构可能会随着时间的推移而发展和变化,不同代的文档可能会共存于同一集合中。 如有必要,应由应用程序开发人员决定如何执行数据清除或迁移。 让我们看一下如何使用MongoDB shell实现创建新数据库,新集合并将一个文档插入其中的相同步骤:

1

2

3

4

5

use tutorial

 

db.chapters.insert({

    "title": "MySQL and MongoDB: trade-offs, not battles"

})

 

值得一提的是,即将发布的MySQL 5.7版本(目前处于发布候选阶段)引入了本机JSON支持。 通过引入这种新的JSON数据类型,可以在MySQL中组合强制模式和无模式数据。

5.2 归一化与复制

关系数据库领域的规范化是组织表以最小化数据冗余的过程。 它涉及将表分解为冗余程度较小(和较小)的表,而不会丢失数据。 它还假定在旧表中定义外键,引用新表的主键。 例如,这是在MySQL中创建两个表的方式,其中books表引用了authors表:

 

01

02

03

04

05

06

07

08

09

10

11

12

CREATE TABLE authors (

    id INT PRIMARY KEY AUTO_INCREMENT,

    name VARCHAR(255) NOT NULL

);

CREATE TABLE books (

    id INT PRIMARY KEY AUTO_INCREMENT,

    title VARCHAR(255) NOT NULL,

    author_id INT NOT NULL,

    FOREIGN KEY (author_id) REFERENCES authors(id)

);

INSERT INTO authors (name) VALUES ("Michael Kofler");

INSERT INTO books (title, author_id) VALUES ("The Definitive Guide to MySQL 5", 1);

MongoDB的标准化已过时。 取而代之的是,仔细的数据建模和一定程度的数据重复是最大程度地利用文档数据存储的方式。 在修改的情况下,决定数据重复级别并使所有数据片段保持同步也是应用程序的责任。 例如:

1

2

3

4

5

6

db.books.insert( {

    "title": "The Definitive Guide to MySQL 5",

    "author": {

        "name": "Michael Kofler"

    }

})

5.3. 关系与参考

在规范化的数据库中,通常使用SQL的JOIN子句合并来自两个或多个MySQLtables的记录(也有其他技术,但总的来说它们基本上导致相同的结果)。 例如:

01

02

03

04

05

06

07

08

09

10

11

db.authors.insert({

    "name": "Michael Kofler",

    "_id": 1 

})

db.books.insert({

    "title": "The Definitive Guide to MySQL 5",

    "author": {

        "$ref": "authors",

        "$id": 1

    }

})

MongoDB支持文档引用,但不支持联接:要解析引用,应执行其他查询(导致关系世界N + 1查询臭名昭著)。 例如,在下面的代码段中,我们将引用书本集合中的作者集合引用,而不是嵌入作者详细信息:

1

db.authors.insert({

    "name": "Michael Kofler",

    "_id": 1 

})

db.books.insert({

    "title": "The Definitive Guide to MySQL 5",

    "author": {

        "$ref": "authors",

        "$id": 1

    }

})

 

必需的往返行程是为无模式的灵活性付出的代价。 但是,正如我们在``标准化与复制''一节中已经提到的那样,一定程度的数据复制和对数据访问模式的仔细分析可能会缓解该问题。

5.4. 事务与原子更新

事务是数据管理系统针对其数据执行的逻辑工作单元。交易的重要性被封装在其基本属性中:交易必须是原子的,一致的,隔离的且持久的(也称为ACID模型)。 MySQL是一个完全事务性的关系数据存储,对于无法容忍数据丢失或不一致的任务关键型应用程序来说,它是一个完美的选择。但是,事务不是免费的:它们极大地限制了数据存储的水平可扩展性,MySQL也不例外。

MongoDB不支持交易担保。相反,它支持单个文档级别的原子更新。这意味着当一个更新操作修改多个文档时,每个文档的修改都是原子的,但是整个操作不是原子的,其他操作可能会交错。值得一提的是,可以在MongoDB之上实现类似事务的语义(使用两阶段提交技术),但是它需要非常复杂的实现。

5.5. SQL vs JSON

SQL是一种专用的编程语言,旨在管理关系数据库管理系统中保存的数据。 它是MySQL支持的唯一查询语言,并提供了一些特定于供应商的扩展。 尽管简单,但SQL是一种非常强大的语言,它基本上由两部分组成:数据定义语言(DDL)和数据操作语言(DML)。 我们已经看到了很多示例,但是让我们看一下从表中选择行的最简单也是最有用的示例:

1

2

SELECT * FROM books;

SELECT * FROM books WHERE title LIKE "%MySQL%";

MongoDB中,所有内容都是一个文档,以JSON表示。 MongoDB没有专用的语言来管理文档,而是采用了非常不同的方法。 文档操作或查询是使用非常丰富的一组运算符来描述的,这些运算符与其他任何文档一样都使用JSON结构彼此组成。 这种统一的表示功能非常强大,表达力强,易于理解,而且不需要学习另一种编程语言。 大多数操作员都是不言自明和直观的,例如:

1

2

3

4

5

6

db.books.find();

db.books.find({

    "title": {

        "$regex": "MySQL"

    }

});

5.6. 存储过程与脚本

存储过程是关系数据存储的服务器端可用的一种特殊例程。 存储过程可以用不同的编程语言实现,但是大多数情况下,它们是使用SQL或其特定于供应商的方言编写的,MySQL就是这种情况。 通常,存储过程通过直接在服务器上执行某些逻辑来帮助提高应用程序的性能,从而需要在服务器和客户端之间发送较少的信息。 例如,这是一个非常简单的MySQL存储过程:

 

 

1

2

3

4

5

6

7

8

9

DELIMITER //

CREATE PROCEDURE find_books

(IN pattern CHAR(255))

BEGIN

    SELECT COUNT(*) FROM books WHERE title LIKE pattern;

END //

DELIMITER ;

 

CALL find_books("%MySQL%");

MongoDB以在服务器上执行JavaScript代码的形式支持服务器端脚本。 这些服务器端脚本可能类似于存储过程,但其实现不只是简单的脚本,因为它支持map / reduceparadigm,该模型首先由Google填充,并被大数据分析广泛采用。 本质上,通过向map / reduce命令提供脚本,可以跨许多MongoDB数据存储实例并行处理大型和超大型数据集。 让我们看一个非常幼稚的map / reduce脚本示例,该示例计算有多少本书的书名中带有“ MySQL”字符串:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

db.runCommand( {

    mapReduce: "books",

    map: function() {

        if (this.title.indexOf("MySQL") >= 0) {

            emit("MySQL", 1);       

        }

    },

    reduce: function(key, counters) {

        count = 0;

 

        for (var index = 0; index < counters.length; ++index) {

            count += counters[index];                   

        }

 

        return count;

    },

    out: { inline: 1 }

} )

MySQL存储过程示例相比,MongoDB看起来过于冗长和复杂。 但是,一旦map / reduce范式的概念变得更加清晰,该示例将变得非常简单,从而为应用许多数据处理,探索和分析技术开辟了一个全新的领域。

5.7.  GROUP BY与汇总

在数据管理领域中,``汇总函数''是一种功能,其中多个数据记录的值根据特定的汇总条件分组在一起,从而产生更有意义或度量的单个值。 SQL语言定义了一组用于执行聚合的特定子句:GROUP BY和HAVING。 标准分组函数集包括AVG(),COUNT(),MAX(),MIN(),STD()和SUM()。

 

01

02

03

04

05

06

07

08

09

10

11

CREATE TABLE orders (

    id INT PRIMARY KEY AUTO_INCREMENT,

    publisher VARCHAR(255) NOT NULL,

    product VARCHAR(255) NOT NULL,

    price NUMERIC (15,2) NOT NULL

);

INSERT INTO orders (product, publisher, price) VALUES

    ("The Definitive Guide to MySQL 5", "APress", 37.36),

    ("MySQL Cookbook", "O’Reilly", 49.65),

    ("Learning MySQL", "O’Reilly", 29.48);

SELECT publisher, SUM(price) FROM orders GROUP BY publisher;

MongoDB提供一组专门的聚合操作,用于处理文档并返回计算的(或聚合的)结果。 聚合操作将来自多个文档的值分组在一起,并且可以对分组的数据执行各种操作以返回单个结果。 MongoDB中的聚合可以通过两种方式完成:使用聚合管道或单用途聚合方法和命令。

让我们看一下我们准备演示MySQL聚合的同一示例,这次使用MongoDB的聚合管道:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

db.books.insert( {

    "title": "The Definitive Guide to MySQL 5",

    "publisher": "APress",

    "price": 37.36

})

db.books.insert( {

    "title": "MySQL Cookbook",

    "publisher": "O’Reilly",

    "price": 49.65

})

db.books.insert( {

    "title": "Learning MySQL",

    "publisher": "O’Reilly",

    "price": 29.48

})

db.books.aggregate([

    { $match: {} },

    { $group: {

        "_id": "$publisher",

        "price": {

            "$sum": "$price"

        }

    }}

]);

 

我们在存储过程与脚本一节中讨论的map / reduce命令也可以被视为进行聚合的一种方式。

 

 

5.8. 集群和分片/分区

如今,数据量呈指数增长,并且数据存储的单个物理实例经常无法以可接受的速度持久化和管理如此大量的数据。群集是一项技术,可以使许多单独的计算实例协同工作。关于数据存储,群集与数据分片/分区并排,这是一种在多个数据存储实例之间拆分大量数据的技术。

相当长一段时间以来,MySQL一直在MySQL Cluster版本中可用,该版本声称是可写伸缩,实时,符合ACID的交易数据存储。 MySQL Cluster建立在分布式多主机架构之上,该架构支持自动分片/分区并水平扩展以服务于读写密集型工作负载。

从历史上看,MySQL Cluster的名声过于复杂,难以配置,监视和维护。与独立的MySQL部署相比,数据架构的设计方式应考虑到数据分片/分区,否则数据存储的性能将受到很大影响。最后,与常规的MySQL发行版相比,MySQL Cluster具有许多限制。

MongoDB文档数据存储使用分片集群的概念开箱即用地支持分片/分区。 MongoDB分片/分区的强项是配置简单。它在水平方向上可以很好地缩放,但是有很多限制要注意。

5.8.1. 复写

复制是一种确保数据安全(通过在许多数据存储实例之间复制数据)并在许多情况下提高处理此数据的应用程序的可伸缩性和容错能力的一项重要技术。 MySQL支持传统的主/从复制,默认情况下是异步的,但也可以使用半同步和延迟复制模式。

MongoDB通过引入副本集来实现复制。基本上,它是主/从复制,但是MongoDB使用一些不同的术语。主服务器称为主服务器,接收所有写操作,而从服务器称为辅助服务器,从主服务器应用操作。副本集支持的最大功能之一是自动故障转移:当主副本不与副本集的其他成员通信时,副本集将尝试选择另一个成员成为新的主副本。

公平地说,也可以配置具有自动故障转移功能的MySQL主/从复制,但是在MySQL社区中对此功能存在一些担忧和讨论。

5.9. 全文搜索

长期以来,MySQL支持使用特殊类型的索引实现的全文本索引和搜索。 值得一提的是,仅从MySQL 5.6版本分支开始,InnoDB存储引擎才提供全文索引支持。

有趣的是,可以使用自然语言搜索(短语搜索),布尔搜索(术语搜索)在MySQL中进行全文搜索,其中要搜索的单词可能被标记为``必须存在''或``必须不存在''以及查询扩展 搜索(对自然语言搜索的略微修改)。 但是,目前群集的MySQL部署中不支持全文本索引(有关MySQL群集的简短讨论,请参见群集和分片/分区)。 让我们看一个简单的例子:

1

01

02

03

04

05

06

07

08

09

10

11

12

13

14

CREATE TABLE products (

    id INT PRIMARY KEY AUTO_INCREMENT,

    product VARCHAR(255) NOT NULL,

    description VARCHAR(255) NOT NULL,

 

    FULLTEXT product_description (product, description)

);

INSERT INTO products (product, description) VALUES

    ("The Definitive Guide to MySQL 5", "This book shows readers how to connect to MySQL via all of the major APIs, including PHP, Perl, Java, JSP, and C#"),

    ("MySQL Cookbook", "Ideal for beginners and professional database and web developers"),

    ("Learning MySQL", "Book travels far into MySQL's subtleties, including complex queries and joins");

SELECT * FROM products

    WHERE MATCH (product, description)

    AGAINST ('database guide' IN NATURAL LANGUAGE MODE);

 

不久前,MongoDB中引入了全文搜索支持。 与MySQL相似,它是使用字符串内容(或字符串数组)上特殊类型的索引来实现的。 MongoDB还支持短语搜索,术语搜索和布尔搜索的组合。 它易于使用且实现优雅,但并非没有限制。 不幸的是,目前,MongoDB无法控制要指定针对其执行全文本搜索的字段子集:它始终与全文本索引中包含的所有字段匹配。 让我们看一下MongoDB全文搜索的实际作用:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

db.products.insert({

    "product": "The Definitive Guide to MySQL 5",

    "description": "This book shows readers how to connect to MySQL via all of the major APIs, including PHP, Perl, Java, JSP, and C#"

})

db.products.insert({

    "product": "MySQL Cookbook",

    "description": "Ideal for beginners and professional database and web developers"

})

db.products.insert({

    "product": "Learning MySQL",

    "description": "Book travels far into MySQL's subtleties, including complex queries and joins"

})

db.products.createIndex({

    product: "text",

    description: "text"

})

db.products.find({

    $text: {

        $search: "database guide"

    }

})

5.10. 发展历程

在开发方面,MySQL提供了广泛的连接器集,可用于选择的大多数主流编程语言与服务器进行通信。 关于Java开发,MySQL包含一个符合JDBC 3.0和JDBC 4.0规范的JDBC驱动程序。

尽管很少见到使用直接JDBC接口与关系数据存储进行通信的代码(已构建了许多框架来简化此过程),但还是很高兴知道所涉及的内容。 让我们看一下连接到MySQL并执行单个SELECT语句的以下代码片段:

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

try {

    connection = DriverManager.getConnection("jdbc:mysql://localhost/tutorial");

 

    Statement statement = null;

    ResultSet resultSet = null;

 

    try {

        statement = connection.createStatement();

        resultSet = statement.executeQuery("SELECT * FROM books");

                 

        while (resultSet.next()) {

            // Now do something with the ResultSet ....

        }

    } catch (SQLException ex) {

        // Log exception

    } finally {

        if (resultSet != null) {

        try { resultSet.close(); } catch ( SQLException ex) { /* ignore */ }

        }

 

        if (statement != null) {

        try { statement.close(); } catch ( SQLException ex) { /* ignore */ }

        }

    }

} catch (SQLException ex) {

    // Log exception

} finally {

    if (connection != null ) {

        try { connection.close(); } catch( SQLException ex ) { /* ignore */ }

    }

}

它看起来很冗长,并且充满了异常处理。 MongoDB依次具有丰富的驱动程序生态系统,除了主流语言外,还包括适用于Erlang,Go,Node.js和Scala的驱动程序。 由于可以自由制定自己的规范,MongoDB正在开发下一代驱动程序,并迅速使现有实现适应行业最新趋势(例如ReactiveMongo:适用于MongoDB的Reactive Scala驱动程序) 。

例如,让我们看一下使用Java和Morphia驱动程序连接到MongoDB的一种方法(假设我们有Book和Author数据模型类):

1

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

18

19

20

21

db.products.insert({

    "product": "The Definitive Guide to MySQL 5",

    "description": "This book shows readers how to connect to MySQL via all of the major APIs, including PHP, Perl, Java, JSP, and C#"

})

db.products.insert({

    "product": "MySQL Cookbook",

    "description": "Ideal for beginners and professional database and web developers"

})

db.products.insert({

    "product": "Learning MySQL",

    "description": "Book travels far into MySQL's subtleties, including complex queries and joins"

})

db.products.createIndex({

    product: "text",

    description: "text"

})

db.products.find({

    $text: {

        $search: "database guide"

    }

})

 

从历史上看,由于社区支持的库集丰富,因此Java对JSON的支持非常好,因此可以轻松地将JSON文档转换为Java类(或从Java类转换)。

更不用说Java社区已经开发了很多不同的对象关系映射框架(ORM)来从低级JDBC接口中进行抽象,这实质上使编写代码像MongoDB的示例一样简洁。 但是,重要的是要了解它们会增加很多复杂性

5.10.1. 部署方式

MySQL和MongoDB均可在大多数主要操作系统上使用。在大多数情况下,MySQL是从特定于平台的软件包中安装的,需要对系统的特权访问。尽管也提供了可下载的存档,但取决于操作系统,配置和版本(例如MySQL Cluster),安装可能会变得非常复杂且不直观(但是可能不需要特权访问系统)。

相反,在大多数情况下,MongoDB是作为可下载的存档分发的,可以将其解压缩并立即使用。明智的默认设置在这里起着至关重要的作用,因为它需要最少的配置,只需运行MongoDB服务器并开始用文档填充数据存储即可。

值得一提的是,借助容器化和Docker,部署过程(我们已经习惯了)的格局正在迅速变化。从传统的基于程序包的发行版到预配置的容器,将可安装的程序包和可下载运行的模型压平:一切都变成一个映像,作为隔离的容器运行,可在几毫秒内获得。

更不用说许多云提供商(AWS,Cloud Foundry,Open Shift等)提供了MySQL和/或MongoDB的软件即服务产品,并负责所有配置,基础架构和可扩展性细节。

5.11. 监控与诊断

显然,监视是任何数据存储管理过程的关键组成部分。有许多用于监视选择的数据存储的商业解决方案,但让我们讨论一下MySQL和MongoDB发行版中可用的解决方案。

MySQL有几种执行监视和诊断的方法。首先是SHOW ENGINE STATUS命令。其次,MySQL支持性能模式,这是一种用于在较低级别监视MySQL服务器执行的功能。最后,MySQL支持DTrace探针(并非每个操作系统都支持),该探针旨在提供有关MySQL服务器中查询执行的信息以及在此过程中使用的系统的不同区域。

MongoDB发行版包含许多命令行实用程序,可用于快速检索有关每个数据存储实例的性能和活动的统计信息。不仅如此,每个正在运行的MongoDB实例还提供一个Web界面,该界面通过一个简单的网页公开诊断和监视信息。最后,MongoDB包含许多命令,可通过外壳连接到数据库以获取有关数据库状态的见解。

 

 

 

5.12. 安全

MySQL使用基于特权的安全模型。 MySQL特权系统的主要功能是对用户进行身份验证并将该用户与特定数据库上的特权相关联(例如CREATE,DROP,SELECT,INSERT,UPDATE,DELETE等)。

到目前为止,MySQL特权系统不支持一些功能:无法明确指定应拒绝给定用户的访问权限,并且无法指定用户有权创建或删除数据库中的表但不能创建用户或删除数据库本身。在传输层上,MySQL支持使用TLS v1.0协议的SSL(安全套接字层)在客户端和服务器之间建立安全(加密)连接。

MongoDB的安全功能包括身份验证,授权和审核。它的基础是具有灵活权限集的基于角色的访问控制。值得一提的是,MongoDB通过定义一组内置角色为用户定义角色提供了基础。还可以使用TLS / SSL(传输层安全性/安全套接字层)对MongoDB的所有网络流量进行加密,以确保只有目标客户端才能读取。

5.13. 权衡而非战斗

如我们所见,MySQL和MongoDB都具有相同的共同目标:为用户提供全面的数据管理解决方案。但是,他们每个人实现此目标的方式都非常不同。从一方面来看,我们看到了相当成熟且经过考验的关系数据存储。从另一面看,我们遇到了年轻但很快成熟的文档数据存储,因此适合某些类别的现代Web应用程序。

正如本教程中多次提到的那样,这不是一场战斗,我们也没有在寻找胜利者。而是,我们正在寻找更适合的应用程序需求的解决方案。更重要的是,如今,异构数据存储基础架构已成为一种规范而不是例外:例如,MongoDB可能完全适合分析和报告需求,而MySQL可以存储计费交易。幸运的是,借助本教程,将能够选择合适的工具来完成这项工作。

在许多方面,可以说MongoDB是为Web构建的:拥抱JSON,学习时间非常短,快速开发的基础,每个发行版都添加了新功能。 MySQL经过了久经考验的,保守的和过时的方式,但是随着关系数据存储试图调整自身以适应现代应用程序需求,事情发生了迅速的变化。

5.15. MySQL还是 MongoDB?

关于MySQL和MongoDB的说法已经很多了。当MongoDB比MySQL更受青睐时,最好以一组建议结束讨论,反之亦然。

首先,如果的数据对的业务至关重要,则MySQL很可能是一个更安全的选择:ACID属性的存在是有原因的。但是每个应用程序都是不同的。内容管理系统,日志管理,分析,论坛和博客,事件存储,产品目录,库存管理,那些类型的应用程序可能会受益于MongoDB作为数据存储。

无模式数据模型是快速开发的推动力:只需随需引入新属性,而无需执行模式演变和数据迁移。可以说,但是MongoDB处理文档和运行查询的风格对开发人员更友好(而且,它不需要像SQL一样学习任何语言)。与MySQL集群的配置(和管理)相比,配置MongoDB的副本集和分片集群真的非常容易和快捷。

现代的架构模式正在促进拆分应用程序的读写路径(例如,命令和查询职责隔离或仅CQRS)。这样一来,应用程序的设计方式可以由MySQL提供写路径,但MongoDB可以作为读路径的数据存储,其中数据段组成有意义的文档。

5.16.  MySQL和MongoDB:如今

值得一提的是,Twitter和Facebook这两家公司成功地运营了其中一些最大的MySQL部署。他们通过无数博客文章愉快地分享了自己的经验:Twitter上的MySQL,Twitter上的MySQL以及Mysos的孵化,Twitter如何使用MySQL每天存储2.5亿条推文,WebScaleSQL:基于上游MySQL的协作等等。

从另一方面讲,MongoDB的采用每天都在增长,越来越多的公司以越来越大的规模部署它。例如,eBay分享了我们如何构建eBay的第一个Node.js应用程序,而Craigslist跟在Craigslist的MongoDB进行了跟踪:一年之后。毫无疑问,未来我们将看到更多的采用

6. 结论

在这个简短的教程中,我们试图看一下两个非常流行的数据存储,以MySQL为代表的传统关系数据库和以MongoDB为代表的文档数据存储。我们简要地介绍了每个功能所具有的最重要的功能和数据保证,试图评估如何影响应用程序的可扩展性和可用性。我们省略了许多底层的内在细节,因为MySQL和MongoDB都单独拥有几本书。相反,我们进行了高层次的概述,选择了最有趣和最重要的领域。

 

 

> 喜欢这篇文章的可以点个赞,欢迎大家留言评论,记得关注我,每天持续更新技术干货、职场趣事、海量面试资料等等
 > 如果你对java技术很感兴趣也可以交流学习,共同学习进步。 
> 不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代

文章写道这里,欢迎完善交流。最后奉上近期整理出来的一套完整的java架构思维导图,分享给大家对照知识点参考学习。有更多JVM、Mysql、Tomcat、Spring Boot、Spring Cloud、Zookeeper、Kafka、RabbitMQ、RockerMQ、Redis、ELK、Git等Java干货

你可能感兴趣的:(精选MySQL与MongoDB:选择数据管理解决方案)