Copyright © 2014 Oracle and/or its affiliates. All rights reserved. | Introducing the MySQL Document Store Mark Swarbrick Principle Presales Consultant UK&I [email protected] Oracle ConfidenOal – Internal/Restricted/Highly Restricted
Copyright©2014Oracleand/oritsaffiliates.Allrightsreserved.|
IntroducingtheMySQLDocumentStore
MarkSwarbrickPrinciplePresalesConsultantUK&[email protected]
OracleConfidenOal–Internal/Restricted/HighlyRestricted
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
SafeHarborStatementThefollowingisintendedtooutlineourgeneralproductdirecOon.ItisintendedforinformaOonpurposesonly,andmaynotbeincorporatedintoanycontract.Itisnotacommitmenttodeliveranymaterial,code,orfuncOonality,andshouldnotberelieduponinmakingpurchasingdecisions.Thedevelopment,release,andOmingofanyfeaturesorfuncOonalitydescribedforOracle’sproductsremainsatthesolediscreOonofOracle.
2
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
Today’sAgenda
RelaOonalDatabases,DocumentDatabasesandMySQL
MySQLJSONSupport
DocumentUseCases
TheXDevAPI
Ge\ngitallworkingtogether
1
2
3
4
3
5
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
RelaOonalDatabases• DataIntegrity– NormalizaOon– Constraints(foreignkeysetc)
• Atomicity,Consistency,IsolaOon,Durability-ACID– TransacOons
• SQL– Powerful,OpOmizableQueryLanguage– DeclarewhatyouwantandtheDBwillfindoutthemostefficientwaytogetittoyou
OracleConfidenOal–Restricted 4
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
Plus…• MySQLhasbeenaroundsince1995• Ubiquitous• Pregymuchastandard• Scalable• Whenthereareissues,theyareknownandunderstood• Largebodyofknowledge,fromsmalltoBIGdeployments
OracleConfidenOal–Restricted 5
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
DocumentDatabases
OracleConfidenOal–Restricted 6
• Schemaless– noschemadesign,normalizaOon,foreignkeys,constraints,datatypesetc– fasteriniOaldevelopment
• Flexibledatastructures– nestedarraysandobjects– somedataissimplynaturallyunstructuredorcannotbemodeledefficientlyintherelaOonalmodel(hierarchies,productDBetc)– persistobjectswithoutORMs
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
DocumentDatabases(Cont.)
OracleConfidenOal–Restricted 7
• JSON– Closertothefrontend– "naOve"inJavaScript– Node.jsandfullstackJavaScript
• Easytolearn,easytouse
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
RelaOonalvsDocumentDatabases
Whynotboth?
OracleConfidenOal–Restricted 8
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
RelaOonalDatabases,DocumentDatabasesandMySQL
MySQLJSONSupport
DocumentUseCases
TheXDevAPI
Ge\ngitallworkingtogether
9
1
2
3
4
5
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
MySQL5.7:JSONSupport• NaOveJSONdatatype• StoreJSONvalues(objects,arraysandsimplevalues)inMySQLtables• BinaryJSONstorageformat• Conversionfrom"naOve"SQLtypestoandfromJSONvalues• JSONManipulaOonfuncOons– Extractcontents(JSON_EXTRACT,JSON_KEYSetc)– Inspectcontents(JSON_CONTAINSetc)– Modifycontents(JSON_SET,JSON_INSERT,JSON_REMOVEetc)– Createarraysandobjects(JSON_ARRAY,JSON_OBJECT)– Searchobjects(JSON_SEARCH)
OracleConfidenOal–Restricted 10
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
MySQL5.7:JSONSupport(cont.)• InlineSQLJSONpathexpressionsSELECT doc->'$.object.array[0].item' FROM some_table
• Booleanoperators(compareJSONvaluesetc)– foo=doc->'$.field'
OracleConfidenOal–Restricted 11
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
MySQL5.7:JSONSupport(cont.)• Plus…• Generated/VirtualColumns– IndexJSONdata– ForeignkeystoJSONdata– SQLviewsforJSONdata
OracleConfidenOal–Restricted 12
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
RelaOonalDatabases,DocumentDatabasesandMySQL
MySQLJSONSupport
DocumentUseCases
TheXDevAPI
Ge\ngitallworkingtogether
13
1
2
3
4
5
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
ExtracOngJSONfromaRelaOonalDBRela+onalIn,Rela+onal+DocumentOut
• DatastoredinrelaOonaltables,butfrontendusesJSON• JSONdirectlymapstonaOvedatastructuresinmanylanguages– OxeneasierforapplicaOoncodetouse– JavaScript,Python,Rubyetc– InbrowserJavaScript
OracleConfidenOal–Restricted 14
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
ExtracOngJSONfromaRelaOonalDBRela+onalIn,Rela+onal+DocumentOut
• SQLFuncOonstoconstructJSON– JSON_OBJECT(),JSON_ARRAY()
• Ex.:SELECT JSON_OBJECT('cust_id', id, 'name', name, 'email', email) FROM customer;
CREATE VIEW customer_json AS
SELECT JSON_OBJECT('cust_id', id, 'name', name, 'email', email) as doc FROM customer;
SELECT * FROM customer_json;
• UpdatesandinsertssOllhappenthroughthetablecolumns
OracleConfidenOal–Restricted 15
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
UsingMySQLasaJSONDocumentContainerDocumentIn,Rela+onal+DocumentOut
• VirtuallySchemaless– Unstructureddata– Noclear,fixedstructureforthedata…recordscanhavedifferentfields– Oxendatathatisnotinvolvedinbusinessrules– Examples:"product_info","properOes","opOons"etc
• DatadoesnotmapcleanlyintoarelaOonalmodel(arrays,hierarchicaldataetc)• Prototyping
OracleConfidenOal–Restricted 16
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
MySQLasaJSONDocumentContainer
OracleConfidenOal–Restricted 17
Example:"product_info"tableproduct_id a<ribute value
9 size M
9 color red
9 fabric cogon
11 flavour strawberry
12 capacity 128GB
12 speedclass class10
13 connecOvity Wi-Fi
13 storage 64GB
13 screensize 8.9"
13 resoluOon 2560x1600(339ppi)
13 bagerylife 12hours
{"product_id":9,"size":"M","color":"red","fabric":"cogon"},{"product_id":11,"flavour":"strawberry"},{"product_id":12,"capacity":"128GB","speedclass":"class10"},{
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
MySQLasaJSONDocumentContainerDocumentIn,Rela+onal+DocumentOut
• AnordinaryMySQLtablewithasingleJSONdatacolumn• GeneratedcolumnsallowSQLenginetolookinsidetheJSONdata– Virtualcolumns– PrimaryKeys– Indexes– ForeignKeys
• WritesontheJSONcolumn• ReadsprimarilyfromtheJSONcolumns
OracleConfidenOal–Restricted 18
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
HybridRelaOonalandJSONRela+onal+DocumentIn,Rela+onal+DocumentOut
• DatabaseismostlyrelaOonal• SomepartsofthedatabaseareunstructuredordoesnotmodelcleanlyasrelaOonal• JSONcolumnsinrelaOonaltables• QueriescanmixandmatchJSONandcolumndata• EvoluOonpathforDocumentbasedapplicaOons
OracleConfidenOal–Restricted 19
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
RelaOonalDatabases,DocumentDatabasesandMySQL
MySQLJSONSupport
DocumentUseCases
TheXDevAPI
Ge\ngitallworkingtogether
1
2
3
4
20
5
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
DocumentOperaOonsviaSQL• Powerful• Allowscomplexqueries• But…sOlldifficulttouse
OracleConfidenOal–Restricted 21
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
DocumentOperaOonsviaSQL
CREATE TABLE product (
id VARCHAR(32) GENERATED ALWAYS AS (JSON_EXTRACT(doc, '$.id')) STORED,
doc JSON
);
INSERT INTO product VALUES (1, '{…}');
SELECT * FROM product WHERE JSON_EXTRACT(doc, '$.field') = value;
etc.
OracleConfidenOal–Restricted 22
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
TheXDevAPI• AbstracOonoverSQL• Focusedon4basicCRUDoperaOons(Create,Read,Update,Delete)• Fluent,NaOveLanguageAPI• NoknowledgeofSQLneeded• XProtocol– CRUDrequestsencodedatprotocollevel– Requestdetails"visible"(vs"opaque"SQLstrings)
OracleConfidenOal–Restricted 23
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
CollecOonandSchemaOperaOons• GetahandletoaSchemamydb = session.getSchema("mydb");
• CreateaCollecOonmydb.createCollection("products");
• Geta(local)referencetoaCollecOonproducts = mydb.getCollection("products");
OracleConfidenOal–Restricted 24
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
AddDocument
products.add({"name":"bananas", "color":"yellow"}).execute();
OracleConfidenOal–Restricted 25
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
FindDocuments
OracleConfidenOal–Restricted 26
products.find("color = 'yellow'").sort(["name"]).execute();
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
ModifyDocuments
OracleConfidenOal–Restricted 27
products.modify("product_id = 123").set("color", "red").execute();
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
RemoveDocuments
OracleConfidenOal–Restricted 28
products.remove("product_id = 123").execute();
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
XDevAPISessions• XSession– Stateless– CRUDonly,noSQL– AbstractstheconnecOon
• NodeSession– DirectconnecOontoadatabasenode– AllowsCRUDandSQL
OracleConfidenOal–Restricted 29
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
OtherOperaOonsonCollecOons• CreateanIndexdb.post.createIndex("email").field("author.email","text(30)",false)
OracleConfidenOal–Restricted 30
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
CRUDOperaOons–NoSQL/DocumentandSQL/RelaOonal
Opera+on Document Rela+onalCreate CollecOon.add() Table.insert()Read CollecOon.find() Table.select()Update CollecOon.modify() Table.update()Delete CollecOon.remove() Table.delete()
31
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
RelaOonalDatabases,DocumentDatabasesandMySQL
MySQLJSONSupport
DocumentUseCases
TheXDevAPI
Ge\ngitallworkingtogether
1
2
3
4
32
5
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
5.7.12DevelopmentPreviewRelease• MySQL5.7.12withDocumentStoreplugin• MySQLShell1.0.3• Connector/J7.0• Connector/Net7.0• Connector/Node.js1.0
OracleConfidenOal–Restricted 33
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
MySQL5.7,Connectors,Drivers,andProtocols
34
MySQL
Plugins
XProtocolPlugin MemcachedPluginCore
MySQLConnectorsandDrivers
XProtocolStdProtocol
Memcacheddriver
XProtocol33060
StdProtocol3306
SQLAPI CRUDandSQLAPIs
MemcacheProtocol
XandStdProtocols
MySQLShell
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
MySQLShell
OracleConfidenOal–Restricted 35
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
MySQLPluginforVisualStudio
OracleConfidenOal–Restricted 36
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
ResourcesTopic Link(s)
MySQLasaDocumentDatabase hgp://dev.mysql.com/doc/refman/5.7/en/document-database.html
MySQLShell hgp://dev.mysql.com/doc/refman/5.7/en/mysql-shell.htmlhgp://dev.mysql.com/doc/refman/5.7/en/mysqlx-shell-tutorial-javascript.htmlhgp://dev.mysql.com/doc/refman/5.7/en/mysqlx-shell-tutorial-python.html
XDevAPI hgp://dev.mysql.com/doc/x-devapi-userguide/en/
XPlugin hgp://dev.mysql.com/doc/refman/5.7/en/x-plugin.html
MySQLJSON hgp://mysqlserverteam.com/tag/json/hgps://dev.mysql.com/doc/refman/5.7/en/json.htmlhgps://dev.mysql.com/doc/refman/5.7/en/json-funcOons.html
Blogs hgp://mysqlserverteam.com/category/docstore/
37
Copyright©2016Oracleand/oritsaffiliates.Allrightsreserved.|
ThankYou!