MySQL 无需 MySQL:MySQL 文档存储简介

MySQL 文档存储允许存储数据,而无需创建底层模式、规范化数据或执行通常使用数据库所需的其他任务。
231 位读者喜欢这个。
Best of Opensource.com: Business

Ron on Flickr。CC BY-NC-SA 2.0

MySQL 可以充当 NoSQL JSON 文档存储,因此程序员可以保存数据,而无需规范化数据、设置模式,甚至在开始编码之前了解他们的数据是什么样的。自 MySQL 5.7 版本和 MySQL 8.0 起,开发人员可以将 JSON 文档存储在表的一列中。通过添加新的 X DevAPI,您可以停止在代码中嵌入令人讨厌的结构化查询语言字符串,并用支持现代编程设计的 API 调用来替换它们。

很少有开发人员接受过结构化查询语言 (SQL)、关系理论、集合或关系数据库的其他基础知识的正式培训。但他们需要一个安全可靠的数据存储。再加上数据库管理员的匮乏,事情很快就会变得非常混乱。

MySQL 文档存储允许程序员存储数据,而无需创建底层模式、规范化数据或通常使用数据库所需的任何其他任务。JSON 文档集合被创建后即可使用。

JSON 数据类型

这一切都基于几年前在 MySQL 5.7 中引入的 JSON 数据类型。这在表的一行中提供了一个大约 1GB 的列。数据必须是有效的 JSON,否则服务器将返回错误,但开发人员可以随意使用该空间。

X DevAPI

旧的 MySQL 协议在经历了近四分之一个世纪后,已经显得过时了,因此开发了一种名为 X DevAPI 的新协议。它包括一个新的高级会话概念,允许代码从一台服务器扩展到多台服务器,具有非阻塞、异步 I/O,遵循常见的主机语言编程模式。重点放在使用 CRUD(创建、替换、更新、删除)模式,同时遵循现代实践和编码风格。或者,换句话说,您不再需要在您漂亮、原始的代码中嵌入丑陋的 SQL 语句字符串。

一个新的 shell,创造性地称为 MySQL Shell,支持这个新协议。它可以用于设置高可用性集群、检查服务器的升级准备情况以及与 MySQL 服务器交互。这种交互可以在三种模式下完成:JavaScript、Python 和 SQL。

编码示例

以下编码示例采用 MySQL Shell 的 JavaScript 模式;它有一个 JS> 提示符。

在这里,我们将以 dstokes 用户名和密码 password 登录到本地系统,并连接到名为 demo 的模式。有一个指向名为 db 的模式 demo 的指针。

$ mysqlsh dstokes:password@localhost/demo
JS> db.createCollection("example")
JS> db.example.add(
      {
        Name: "Dave",
        State:  "Texas",
        foo : "bar"
      }
     )
JS>

上面我们登录到服务器,连接到 demo 模式,创建了一个名为 example 的集合,并添加了一条记录,所有这些都没有创建表定义或使用 SQL。我们可以随意使用或滥用这些数据。这不是对象关系映射器,因为代码与 SQL 之间没有映射,因为新协议在服务器层“说话”。

支持 Node.js

新的 shell 非常棒;您可以用它做很多事情,但您可能希望使用您选择的编程语言。以下示例使用 world_x 演示数据库来搜索 _id 字段与 "CAN" 匹配的记录。我们指向模式中所需的集合,并发出带有所需参数的 find 命令。同样,没有涉及 SQL。

var mysqlx = require('@mysql/xdevapi');
mysqlx.getSession({             //Auth to server
        host: 'localhost',
        port: '33060',
        dbUser: 'root',
        dbPassword: 'password'
}).then(function (session) {    // use world_x.country.info
     var schema = session.getSchema('world_x');
     var collection = schema.getCollection('countryinfo');

collection                      // Get row for 'CAN'
  .find("$._id == 'CAN'")
  .limit(1)
  .execute(doc => console.log(doc))
  .then(() => console.log("\n\nAll done"));

  session.close();
})

这是另一个 PHP 示例,它查找 "USA"

#!/usr/bin/php
<?PHP
// Connection parameters
  $user = 'root';
  $passwd = 'S3cret#';
  $host = 'localhost';
  $port = '33060';
  $connection_uri = 'mysqlx://'.$user.':'.$passwd.'@'.$host.':'.$port;
  echo $connection_uri . "\n";

// Connect as a Node Session
  $nodeSession = mysql_xdevapi\getNodeSession($connection_uri);
// "USE world_x" schema
  $schema = $nodeSession->getSchema("world_x");
// Specify collection to use
  $collection = $schema->getCollection("countryinfo");
// SELECT * FROM world_x WHERE _id = "USA"
  $result = $collection->find('_id = "USA"')->execute();
// Fetch/Display data
  $data = $result->fetchAll();
  var_dump($data);
?>

请注意,两个示例中使用的 find 运算符在两种不同的语言之间看起来几乎相同。这种一致性应该有助于在编程语言之间跳转的开发人员或那些希望减少新语言学习曲线的人。

其他支持的语言包括 C、Java、Python 和 JavaScript,并且计划支持更多语言。

两全其美

我有没有提到以这种 NoSQL 方式输入的数据也可以从 MySQL 的 SQL 端获得?或者新的 NoSQL 方法可以访问老式关系表中的关系数据?您现在可以选择将您的 MySQL 服务器用作 SQL 服务器、NoSQL 服务器或两者兼而有之。


Dave Stokes 将在 6 月 8 日至 10 日在北卡罗来纳州夏洛特的 东南 LinuxFest 上展示“MySQL Without the SQL—Oh My!”。

标签
Dave Stokes
Dave Stokes 是 Percona 的技术传播工程师,也是《MySQL & JSON - 实用编程指南》的作者。Dave 对数据库和教学充满热情。他曾在从美国心脏协会到施乐等公司工作,工作范围从反潜战到 Web 开发人员。

2 条评论

我只是希望 MySQL 能够坚持 RDBMS,并继续通过插件提供 NoSQL。似乎在重新设计其他地方已存在的东西上花费了很多精力。

© . All rights reserved.