By now you’ve read Mike Frank’s excellent introduction to the MySQL 8.0 release and it’s Document Store. In that post Mike laid out the benefits of the new Document Store model and briefly outlined the different components involved. While it’s fair to consider the Document Store as the first pillar of the new MySQL 8 Document story, we must identify the X DevAPI to be the second. The post covers our motivation, goals, and overall design principles of this new API.
Motivation
Most of our connectors have not implemented their own API. Rather, most of them implement externally defined interfaces. Examples include our Connector/J that implements the JDBC standard, Connector/Net that implements the ADO.Net standard, and our Connector/ODBC. None of these standards work well for a document-oriented database. In fact, there really are no defined standard APIs for document databases. Therefore we knew we needed to develop a new API for our users.
Another reason why we needed a new API is because we are doing something that has not been done before. Document databases exist. Relational databases exist. We even see databases that support relational and document querying over the same data set. However we have yet to see a relational database include a document model so that a user can use document objects alongside their existing relational data.
We are only beginning to bring forth the unifying power of MySQL 8. In the coming releases you’ll see exciting developments like being able to link your existing relational data with your document data in a single query using simple API patterns.
Goals
We have some very clear goals we follow as we develop the X DevAPI. They are:
- Simplicity — No one likes a complicated API. We wanted the API to be easy to understand no matter what language you are using. It’s important to us that if you write X DevAPI code using Node.JS then a Python developer, for example, can read it and know what is going on.
- Bridge the gap between relational and document data — MySQL runs some of the world’s largest web properties and they have petabytes of relational data. Asking them to add tables or columns to their data stores can be very challenging. The new document store allows connecting these different types of data in the same queries. We want to provide a powerful API for this.
- Expressive — We wanted our API to be very expressive and follow a fluent interface style of development. We wanted this to enable writing and executing the same X DevAPI code in the shell as in your application.
- Seamless support for InnoDB Cluster farms — We want the API to seamlessly and transparently allow simple development of applications that span from one machine to hundreds.
Please note that these are goals. Some of them may not be fully realized in the initial release of the X DevAPI but these goals outline what we are thinking about during this development.
Design
No matter what connector you use the design of the X DevAPI core components remains the same. The API involves some central objects outlined below. You’ll hear more about these objects and more in the individual product announcements and in our documentation found at https://dev.mysql.com/doc/.
Session | Represents a logical connection to a server or farm |
Schema | Represents a MySQL database/schema |
Collection | Represents a collection of JSON documents |
Result | There’s a series of Result objects that handle different scenarios |
Our goal is that each connector will include a core API (set of objects, properties and methods) that are the same across all connectors. Outside of the core API, each connector can and will provide additional syntax or support additional methods.
Of course we also realize that each language and framework has it’s own style and it’s important to us to be respectful of that. An example might be a count property that might appear as .Count in one language but should be represented as .getCount() in another. Again, please recognize they are the same concept just different syntax.
Looking at the New X DevAPI Syntax
You’ll learn much more about the X DevAPI and our different languages when you read our announcement blogs and our documentation but I wanted to take just a minute to give quick examples of how you can use the X DevAPI in the shell to do quick ad-hoc prototyping. First let’s look at opening a session to server. In this example we open a session to localhost and get a reference to the test schema so we can work with it.
var mysqlx = require('mysqlx'); // Connect to server on localhost var mySession = mysqlx.getSession(“mysqlx://user:password@localhost:33060”) var myDb = mySession.getSchema('test');
Next we’ll create a collection and add a document to it.
// Use the collection 'my_collection' var myColl = myDb.createCollection('my_collection'); // Insert document myColl.add({name: 'My document name', length: 250}) .execute();
We can modify the document very easily. This example finds all documents that have a length of 250 and changes that length to 125.
myColl.modify("length = :length") .bind("length", 250) .set("length", 125) .execute();
We can find those documents if we want to work with them
// Find a document var doc = myColl.find('length = :length') .limit(1) .bind('length', 125) .execute(); // Print document print(doc.fetchOne());
And finally we can remove the documents and drop our collection
// Remove all documents with length = 125 myColl.remove("length = 125") .execute() // And drop the collection myDb.dropCollection("my_collection")
These have just been some quick examples but we hope that it has shown some of the basic ideas we have in the X DevAPI and you are interested in learning more and trying it out.
Availability
With the release of MySQL 8.0 we are also making available 8.0 GA versions of our connectors. Each of them, save ODBC, provide an initial implementation of X DevAPI. These connectors should be installed from their respective package stores. You can also find them at our website at https://www.mysql.com/downloads/.
You can read much more about each of the products on their announcement blogs:
- Java – /connectorj-8-0-11-the-face-for-your-brand-new-document-oriented-database
- .NET – /introducing-connectornet-with-full-support-for-mysql-8-0
- Node.JS – /introducing-connectornode-js-for-mysql-8-0
- C++ – /what-is-new-in-connectorc-8-0
- Python – /using-mysql-connectorpython-8-0-with-mysql-8-0
- PHP – /introducing-the-mysqlx-php-extension-for-mysql-8-0
- ODBC – /what-is-new-in-connectorodbc-8-0
We know that we have not covered every language available. If you are using MySQL 8 with a connector in a different language please let us know. We want to work with the community to bring X DevAPI to more and more languages.
Thank you!
I want to thank you for your time to read this and learn about our new products. I hope that you will take the time to get to know what we’ve created and let us know where we fell down. We have much more planned and we want to hear from you!