Linux中國

不像 MySQL 的 MySQL:MySQL 文檔存儲介紹

MySQL 可以提供 NoSQL JSON 文檔存儲 Document Store 了,這樣開發者保存數據前無需 規範化 normalize 數據、創建資料庫,也無需在開發之前就制定好數據樣式。從 MySQL 5.7 版本和 MySQL 8.0 版本開始,開發者可以在表的一列中存儲 JSON 文檔。由於引入 X DevAPI,你可以從你的代碼中移除令人不爽的結構化查詢字元串,改為使用支持現代編程設計的 API 調用。

系統學習過結構化查詢語言(SQL)、 關係理論 relational theory 集合 set 和其它關係資料庫底層理論的開發者並不多,但他們需要一個安全可靠的數據存儲。如果資料庫管理人員不足,事情很快就會變得一團糟,

MySQL 文檔存儲 允許開發者跳過底層數據結構創建、數據規範化和其它使用傳統資料庫時需要做的工作,直接存儲數據。只需創建一個 JSON 文檔集合 document collection ,接著就可以使用了。

JSON 數據類型

所有這一切都基於多年前 MySQL 5.7 引入的 JSON 數據類型。它允許在表的一行中提供大約 1GB 大小的列。數據必須是有效的 JSON,否則伺服器會報錯;但開發者可以自由使用這些空間。

X DevAPI

舊的 MySQL 協議已經歷經差不多四分之一個世紀,已經顯現出疲態,因此新的協議被開發出來,協議名為 X DevAPI。協議引入高級會話概念,允許代碼從單台伺服器擴展到多台,使用符合 通用主機編程語言樣式 common host-language programming patterns 的非阻塞非同步 I/O。需要關注的是如何遵循現代實踐和編碼風格,同時使用 CRUD (Create、 Read、 Update、 Delete)樣式。換句話說,你不再需要在你精美、純潔的代碼中嵌入醜陋的 SQL 語句字元串。

一個新的 shell 支持這種新協議,即所謂的 MySQL Shell。該 shell 可用於設置 高可用集群 high-availability cluster 、檢查伺服器 升級就緒狀態 upgrade readiness 以及與 MySQL 伺服器交互。支持的交互方式有以下三種:JavaScript,Python 和 SQL。

代碼示例

下面的代碼示例基於 JavaScript 方式使用 MySQL Shell,可以從 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("nnAll done"));

  session.close();
})

下面例子使用 PHP,搜索 _id 欄位匹配 USA 的記錄:

<?PHP
// Connection parameters
  $user = &apos;root&apos;;
  $passwd = &apos;S3cret#&apos;;
  $host = &apos;localhost&apos;;
  $port = &apos;33060&apos;;
  $connection_uri = &apos;mysqlx://&apos;.$user.&apos;:&apos;.$passwd.&apos;@&apos;.$host.&apos;:&apos;.$port;
  echo $connection_uri . "n";

// Connect as a Node Session
  $nodeSession = mysql_xdevapigetNodeSession($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(&apos;_id = "USA"&apos;)->execute();
// Fetch/Display data
  $data = $result->fetchAll();
  var_dump($data);
?>

可以看出,在上面兩個使用不同編程語言的例子中,find 操作符的用法基本一致。這種一致性對跨語言編程的開發者有很大幫助,對試圖降低新語言學習成本的開發者也不無裨益。

支持的語言還包括 C、Java、Python 和 JavaScript 等,未來還會有更多支持的語言。

從兩種方式受益

我會告訴你使用 NoSQL 方式錄入的數據也可以用 SQL 方式使用?換句話說,我會告訴你新引入的 NoSQL 方式可以訪問舊式關係型表中的數據?現在使用 MySQL 伺服器有多種方式,作為 SQL 伺服器,作為 NoSQL 伺服器或者同時作為兩者。

via: https://opensource.com/article/18/6/mysql-document-store

作者:Dave Stokes 選題:lujun9972 譯者:pinewall 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國