Frédéric Descamps
Community Manager
Oracle MySQL
Novembre 2022
Document Store avec MySQL
Document Store avec MySQL
HeatWave Database Service
HeatWave Database Service
MySQL Innovation & Cloud Day
MySQL Innovation & Cloud Day
Qui suis-je ?
Qui suis-je ?
about.me/lefred
about.me/lefred
Copyright @ 2022 Oracle and/or its affiliates.
2
Frédéric Descamps
@lefred
animateur de la Communauté MySQL
utilisateur de MySQL depuis la version
3.20
fervant adepte du vrai devops
habite dans la contrée de la bière, du
chocolat et des frites
h ps://lefred.be
Copyright @ 2022 Oracle and/or its affiliates.
3
MySQL 8.0 Document Store
MySQL 8.0 Document Store
à la découverte du nouveau monde !
à la découverte du nouveau monde !
Copyright @ 2022 Oracle and/or its affiliates.
4
NoSQL Document Store
Sans structure (schemaless)
Copyright @ 2022 Oracle and/or its affiliates.
5
NoSQL Document Store
Sans structure (schemaless)
pas de conception de schéma, pas de normalisation, pas de clés étrangères, pas de types de
données, ...
Copyright @ 2022 Oracle and/or its affiliates.
5
NoSQL Document Store
Sans structure (schemaless)
pas de conception de schéma, pas de normalisation, pas de clés étrangères, pas de types de
données, ...
un développement initial très rapide
Copyright @ 2022 Oracle and/or its affiliates.
5
NoSQL Document Store
Sans structure (schemaless)
pas de conception de schéma, pas de normalisation, pas de clés étrangères, pas de types de
données, ...
un développement initial très rapide
Structure de données exible
Copyright @ 2022 Oracle and/or its affiliates.
5
NoSQL Document Store
Sans structure (schemaless)
pas de conception de schéma, pas de normalisation, pas de clés étrangères, pas de types de
données, ...
un développement initial très rapide
Structure de données exible
tableaux ou objets intégrés
Copyright @ 2022 Oracle and/or its affiliates.
5
NoSQL Document Store
Sans structure (schemaless)
pas de conception de schéma, pas de normalisation, pas de clés étrangères, pas de types de
données, ...
un développement initial très rapide
Structure de données exible
tableaux ou objets intégrés
solution valable lorsque les certaines données ne peuvent pas être modélisées de manière
optimale dans un modèle relationnel
Copyright @ 2022 Oracle and/or its affiliates.
5
NoSQL Document Store
Sans structure (schemaless)
pas de conception de schéma, pas de normalisation, pas de clés étrangères, pas de types de
données, ...
un développement initial très rapide
Structure de données exible
tableaux ou objets intégrés
solution valable lorsque les certaines données ne peuvent pas être modélisées de manière
optimale dans un modèle relationnel
persistance des objets sans l'utilisation d'un ORM - mapping oobject-oriented
Copyright @ 2022 Oracle and/or its affiliates.
5
NoSQL Document Store
Sans structure (schemaless)
pas de conception de schéma, pas de normalisation, pas de clés étrangères, pas de types de
données, ...
un développement initial très rapide
Structure de données exible
tableaux ou objets intégrés
solution valable lorsque les certaines données ne peuvent pas être modélisées de manière
optimale dans un modèle relationnel
persistance des objets sans l'utilisation d'un ORM - mapping oobject-oriented
JSON
Copyright @ 2022 Oracle and/or its affiliates.
5
NoSQL Document Store
Sans structure (schemaless)
pas de conception de schéma, pas de normalisation, pas de clés étrangères, pas de types de
données, ...
un développement initial très rapide
Structure de données exible
tableaux ou objets intégrés
solution valable lorsque les certaines données ne peuvent pas être modélisées de manière
optimale dans un modèle relationnel
persistance des objets sans l'utilisation d'un ORM - mapping oobject-oriented
JSON
proche du frontend
Copyright @ 2022 Oracle and/or its affiliates.
5
NoSQL Document Store
Sans structure (schemaless)
pas de conception de schéma, pas de normalisation, pas de clés étrangères, pas de types de
données, ...
un développement initial très rapide
Structure de données exible
tableaux ou objets intégrés
solution valable lorsque les certaines données ne peuvent pas être modélisées de manière
optimale dans un modèle relationnel
persistance des objets sans l'utilisation d'un ORM - mapping oobject-oriented
JSON
proche du frontend
apprentissage aisé
Copyright @ 2022 Oracle and/or its affiliates.
5
par les DBAs
Percection des données
Copyright @ 2022 Oracle and/or its affiliates.
6
par les DBAs par les développeurs
{
{
"GNP"
"GNP" :
: 249704
249704,
,
"Name"
"Name" :
: "Belgium"
"Belgium",
,
"government"
"government" :
: {
{
"GovernmentForm"
"GovernmentForm" :
:
"Constitutional Monarchy, Federation"
"Constitutional Monarchy, Federation",
,
"HeadOfState"
"HeadOfState" :
: "Philippe I"
"Philippe I"
}
},
,
"_id"
"_id" :
: "BEL"
"BEL",
,
"IndepYear"
"IndepYear" :
: 1830
1830,
,
"demographics"
"demographics" :
: {
{
"Population"
"Population" :
: 10239000
10239000,
,
"LifeExpectancy"
"LifeExpectancy" :
: 77.8000030517578
77.8000030517578
}
},
,
}
}
Percection des données
Copyright @ 2022 Oracle and/or its affiliates.
6
Il faut quand-même toujours réaliser des analyses
SQL
SQL
SQL
Copyright @ 2022 Oracle and/or its affiliates.
7
... mais...comment ?
?
SQL
SQL
SQL
Copyright @ 2022 Oracle and/or its affiliates.
8
En migrant les données (ETL)
SQL
SQL
SQL
ETL: Extraction-Transformation-Chargement
Copyright @ 2022 Oracle and/or its affiliates.
9
Et s'il y avait un moyen de fournir à la fois SQL et NoSQL
sur une plateforme stable qui a prouvé sa stabilité sur
une technologie bien connue disposant d'une grande
communauté et un écosystème diversi é ?
Copyright @ 2022 Oracle and/or its affiliates.
10
RDBMS ou NoSQL ?
Copyright @ 2022 Oracle and/or its affiliates.
11
RDBMS ou NoSQL ?
Pourquoi pas les deux ?
Copyright @ 2022 Oracle and/or its affiliates.
11
MySQL Document Store !
Où le SQL est optionnel ?!
Copyright @ 2022 Oracle and/or its affiliates.
12
Le SQL est optionnel ?!
Copyright @ 2022 Oracle and/or its affiliates.
13
Utilisation de MySQL Document Store !
SQL
SQL
SQL
Copyright @ 2022 Oracle and/or its affiliates.
14
La Solution
La Solution
MySQL Document Store
MySQL Document Store
Copyright @ 2022 Oracle and/or its affiliates.
15
Bâti sur le
type de
données
JSON et la
solide
technologie
de MySQL
Server
Fournit un JSON Document Store exible en terme de schéma
Aucune connaissance de SQL requise
Pas besoin de dé nir tous les a ributs possibles, les tables, etc.
Utilise la nouvelle interface X DevAPI
Possibilité d'indexation des données
Un document peut avoir une taille de ~1GB !
Permet l'utilisation des nouveaux styles de programmation moderne
Possibilité de ne plus avoir de requêtes SQL intégrées dans le code
Code plus facile à lire
Fonctionne également aves les tables relationnelles
Compatible avec les solutions existantes pour MySQL
Copyright @ 2022 Oracle and/or its affiliates.
16
Connecteurs compatibles avec X Protocol
Copyright @ 2022 Oracle and/or its affiliates.
17
Installation
Installation
MySQL Document Store
MySQL Document Store
Copyright @ 2022 Oracle and/or its affiliates.
18
Installation de MySQL Document Store
installer MySQL 8.0
Copyright @ 2022 Oracle and/or its affiliates.
19
Installation de MySQL Document Store
installer MySQL 8.0
installer MySQL Shell
Copyright @ 2022 Oracle and/or its affiliates.
19
Installation de MySQL Document Store
installer MySQL 8.0
installer MySQL Shell
installer un connecteur pour votre langage de programmation
Copyright @ 2022 Oracle and/or its affiliates.
19
Installation de MySQL Document Store
installer MySQL 8.0
installer MySQL Shell
installer un connecteur pour votre langage de programmation
php-pecl-mysql-xdevapi pour PHP
mysql-connector-python pour Python
...
Copyright @ 2022 Oracle and/or its affiliates.
19
Installation de MySQL Document Store
installer MySQL 8.0
installer MySQL Shell
installer un connecteur pour votre langage de programmation
php-pecl-mysql-xdevapi pour PHP
mysql-connector-python pour Python
...
Et rien d'autre, pas besoin d'installer d'autre composant ou de charger un plugin. Assurez-
vous simplement que votre pare-feu vous perme e de vous connecter au port 33060 (X
Protocol).
Copyright @ 2022 Oracle and/or its affiliates.
19
MySQL HeatWave Database Service
MySQL HeatWave Database Service sur OCI est le seul service dans le Cloud perme ant
d'utiliser le X Protocol.
Copyright @ 2022 Oracle and/or its affiliates.
20
Migration de MongoDB vers MySQL DS
Pour cet example, j'utilise la collection restaurants de MongoDB:
$ mongoexport
$ mongoexport -c
-c restaurants
restaurants >
> restaurants.json
restaurants.json
connected to:
connected to: 127.0
127.0.0.1
.0.1
exported
exported 25359
25359 records
records
Copyright @ 2022 Oracle and/or its affiliates.
21
Migration de MongoDB vers MySQL DS
Pour cet example, j'utilise la collection restaurants de MongoDB:
$ mongoexport
$ mongoexport -c
-c restaurants
restaurants >
> restaurants.json
restaurants.json
connected to:
connected to: 127.0
127.0.0.1
.0.1
exported
exported 25359
25359 records
records
JS
JS>
> util
util.
.importJson
importJson(
('restaurants.json'
'restaurants.json',
,{
{convertBsonOid
convertBsonOid:
: true
true}
})
)
Importing from file
Importing from file "restaurants.json"
"restaurants.json" to collection
to collection `
`docstore
docstore`
`.
.`
`restaurants
restaurants`
`
in
in MySQL Server at localhost
MySQL Server at localhost:
:33060
33060
.
..
. 25359.
25359..
. 25359
25359
Processed
Processed 15.60
15.60 MB
MB in
in 25359
25359 documents
documents in
in 0.9976
0.9976 sec
sec (
(25
25.
.36K documents
36K documents/
/s
s)
)
Total successfully imported documents
Total successfully imported documents 25359
25359 (
(25
25.
.36K documents
36K documents/
/s
s)
)
Copyright @ 2022 Oracle and/or its affiliates.
21
Copyright @ 2022 Oracle and/or its affiliates.
22
Copyright @ 2022 Oracle and/or its affiliates.
23
Copyright @ 2022 Oracle and/or its affiliates.
24
Copyright @ 2022 Oracle and/or its affiliates.
25
Faisons une requête
JS > restaurants.find()
C'est beaucoup trop d'enrgistrements pour les a cher ici... limitons-les
Copyright @ 2022 Oracle and/or its affiliates.
26
Copyright @ 2022 Oracle and/or its affiliates.
27
Quelques autres examples
Copyright @ 2022 Oracle and/or its affiliates.
28
Ajoutons un critère de sélection
Copyright @ 2022 Oracle and/or its affiliates.
29
Syntaxe légèrment di érente de celle de MongoDB
Copyright @ 2022 Oracle and/or its affiliates.
30
Syntaxe légèrment di érente de celle de MongoDB
Copyright @ 2022 Oracle and/or its affiliates.
30
Et pour les développeurs ?
Copyright @ 2022 Oracle and/or its affiliates.
31
Et pour les développeurs ?
$session
$session =
= mysql_xdevapi
mysql_xdevapi
getSession
getSession(
("mysqlx://fred:MyP@ssw0rd%@localhost"
"mysqlx://fred:MyP@ssw0rd%@localhost")
);
;
$schema
$schema =
= $session
$session->
->getSchema
getSchema(
("docstore"
"docstore")
);
;
$collection
$collection =
= $schema
$schema->
->getCollection
getCollection(
("restaurants"
"restaurants")
);
;
$results
$results =
= $collection
$collection->
->find
find(
($search
$search)
)->
->execute
execute(
()
)->
->fetchAll
fetchAll(
()
);
;
...
...
foreach
foreach (
($results
$results as
as $doc
$doc)
) {
{
echo
echo "<tr><td><a href='?id=${doc[_id]}'>${doc[name]}</a></td>"
"<tr><td><a href='?id=${doc[_id]}'>${doc[name]}</a></td>";
;
echo
echo "<td>${doc[borough]}</td><td>${doc[cuisine]}</td></tr>"
"<td>${doc[borough]}</td><td>${doc[cuisine]}</td></tr>";
;
}
}
Copyright @ 2022 Oracle and/or its affiliates.
32
Et pour les développeurs ?
$session
$session =
= mysql_xdevapi
mysql_xdevapi
getSession
getSession(
("mysqlx://fred:MyP@ssw0rd%@localhost"
"mysqlx://fred:MyP@ssw0rd%@localhost")
);
;
$schema
$schema =
= $session
$session->
->getSchema
getSchema(
("docstore"
"docstore")
);
;
$collection
$collection =
= $schema
$schema->
->getCollection
getCollection(
("restaurants"
"restaurants")
);
;
$results
$results =
= $collection
$collection->
->find
find(
($search
$search)
)->
->execute
execute(
()
)->
->fetchAll
fetchAll(
()
);
;
...
...
foreach
foreach (
($results
$results as
as $doc
$doc)
) {
{
echo
echo "<tr><td><a href='?id=${doc[_id]}'>${doc[name]}</a></td>"
"<tr><td><a href='?id=${doc[_id]}'>${doc[name]}</a></td>";
;
echo
echo "<td>${doc[borough]}</td><td>${doc[cuisine]}</td></tr>"
"<td>${doc[borough]}</td><td>${doc[cuisine]}</td></tr>";
;
}
}
Facile, en utilisant uniquement des opérations CRUD !
Copyright @ 2022 Oracle and/or its affiliates.
32
Et pour les développeurs ?
$session
$session =
= mysql_xdevapi
mysql_xdevapi
getSession
getSession(
("mysqlx://fred:MyP@ssw0rd%@localhost"
"mysqlx://fred:MyP@ssw0rd%@localhost")
);
;
$schema
$schema =
= $session
$session->
->getSchema
getSchema(
("docstore"
"docstore")
);
;
$collection
$collection =
= $schema
$schema->
->getCollection
getCollection(
("restaurants"
"restaurants")
);
;
$results
$results =
= $collection
$collection->
->find
find(
($search
$search)
)->
->execute
execute(
()
)->
->fetchAll
fetchAll(
()
);
;
...
...
foreach
foreach (
($results
$results as
as $doc
$doc)
) {
{
echo
echo "<tr><td><a href='?id=${doc[_id]}'>${doc[name]}</a></td>"
"<tr><td><a href='?id=${doc[_id]}'>${doc[name]}</a></td>";
;
echo
echo "<td>${doc[borough]}</td><td>${doc[cuisine]}</td></tr>"
"<td>${doc[borough]}</td><td>${doc[cuisine]}</td></tr>";
;
}
}
Facile, en utilisant uniquement des opérations CRUD !
Pas une seule instruction SQL !
Copyright @ 2022 Oracle and/or its affiliates.
32
En
import
import *
*;
;
class
class Main
Main {
{
public
public static
static void
void main
main(
(String
String args
args[
[]
])
) {
{
Session
Session mySession
mySession =
= new
new SessionFactory
SessionFactory(
()
)
.
.getSession
getSession(
("mysqlx://localhost:33060/docstore?user=resto&password=Passw0rd!"
"mysqlx://localhost:33060/docstore?user=resto&password=Passw0rd!")
);
;
Schema
Schema myDb
myDb =
= mySession
mySession.
.getSchema
getSchema(
("docstore"
"docstore")
);
;
Collection
Collection myColl
myColl =
= myDb
myDb.
.getCollection
getCollection(
("restaurants"
"restaurants")
);
;
DocResult
DocResult myDocs
myDocs =
= myColl
myColl.
.find
find(
("name like :param"
"name like :param")
).
.limit
limit(
(1
1)
)
.
.bind
bind(
("param"
"param",
, "Green%"
"Green%")
).
.execute
execute(
()
);
;
System
System.
.out
out.
.println
println(
(myDocs
myDocs.
.fetchOne
fetchOne(
()
))
);
;
mySession
mySession.
.close
close(
()
);
;
}
}
}
}
Copyright @ 2022 Oracle and/or its affiliates.
com
com.
.mysql
mysql.
.cj
cj.
.xdevapi
xdevapi.
.
33
Opérations CRUD
L'acronyme informatique anglais CRUD (pour Create, Read, Update, Delete) désigne les quatre opérations de base pour la persistance des
données, en particulier le stockage d'informations en base de données.
Copyright @ 2022 Oracle and/or its affiliates.
34
Opérations CRUD relatives aux collections
Ajout d'un document
collection
collection.
.add
add(
({
{ name
name:
: 'fred'
'fred',
, age
age:
: 46
46 }
})
)
.
.add
add(
({
{ name
name:
: 'scott'
'scott',
, age
age:
: 47
47 }
})
)
.
.execute
execute(
()
)
collection
collection.
.add
add(
([
[
{
{ name
name:
: 'dimo'
'dimo',
, age
age:
: 50
50 }
},
,
{
{ name
name:
: 'kenny'
'kenny',
, age
age:
: 25
25 }
}
]
])
).
.execute
execute(
()
)
Copyright @ 2022 Oracle and/or its affiliates.
35
collection
collection.
.modify
modify(
('name = :name'
'name = :name')
)
.
.bind
bind(
('name'
'name',
, 'fred'
'fred')
)
.
.set
set(
('age'
'age',
, 43
43)
)
.
.sort
sort(
('name ASC'
'name ASC')
)
.
.limit
limit(
(1
1)
)
.
.execute
execute(
()
)
collection
collection.
.modify
modify(
('name = :name'
'name = :name')
)
.
.bind
bind(
('name'
'name',
, 'fred'
'fred')
)
.
.patch
patch(
({
{ age
age:
: 43
43,
, active
active:
: false
false }
})
)
.
.sort
sort(
('name DESC'
'name DESC')
)
.
.limit
limit(
(1
1)
)
.
.execute
execute(
()
)
Opérations CRUD relatives aux collections
Modi cation d'un document
Copyright @ 2022 Oracle and/or its affiliates.
36
Opérations CRUD relatives aux collections
Suppression d'un document
collection
collection.
.remove
remove(
('name = :name'
'name = :name')
)
.
.bind
bind(
('name'
'name',
, 'fred'
'fred')
)
.
.sort
sort(
('age ASC'
'age ASC')
)
.
.limit
limit(
(1
1)
)
.
.execute
execute(
()
)
Copyright @ 2022 Oracle and/or its affiliates.
37
MySQL Document Store Objects Summary
Copyright @ 2022 Oracle and/or its affiliates.
38
Tout ce dont vous avez besoin, se trouve ici:
h ps://dev.mysql.com/doc/x-devapi-userguide/en/crud-operations-overview.html
Copyright @ 2022 Oracle and/or its affiliates.
39
MySQL Document Store
MySQL Document Store
est entièrement conforme à la norme ACID
est entièrement conforme à la norme ACID
nous nous soucions de vos données
nous nous soucions de vos données
Copyright @ 2022 Oracle and/or its affiliates.
40
Document Store entièrement ACID !
Ce e solution s'appuie sur la force et la robustesse éprouvée de MySQL InnoDB
Copyright @ 2022 Oracle and/or its affiliates.
41
Document Store entièrement ACID !
Ce e solution s'appuie sur la force et la robustesse éprouvée de MySQL InnoDB
innodb_ ush_log_at_trx_commit = 1
Copyright @ 2022 Oracle and/or its affiliates.
41
Document Store entièrement ACID !
Ce e solution s'appuie sur la force et la robustesse éprouvée de MySQL InnoDB
innodb_ ush_log_at_trx_commit = 1
innodb_doublewrite = ON
Copyright @ 2022 Oracle and/or its affiliates.
41
Document Store entièrement ACID !
Ce e solution s'appuie sur la force et la robustesse éprouvée de MySQL InnoDB
innodb_ ush_log_at_trx_commit = 1
innodb_doublewrite = ON
sync_binlog = 1
Copyright @ 2022 Oracle and/or its affiliates.
41
Document Store entièrement ACID !
Ce e solution s'appuie sur la force et la robustesse éprouvée de MySQL InnoDB
innodb_ ush_log_at_trx_commit = 1
innodb_doublewrite = ON
sync_binlog = 1
transaction_isolation = REPEATABLE-READ|READ-COMMITTED|...
Copyright @ 2022 Oracle and/or its affiliates.
41
Document Store entièrement ACID !
Ce e solution s'appuie sur la force et la robustesse éprouvée de MySQL InnoDB
innodb_ ush_log_at_trx_commit = 1
innodb_doublewrite = ON
sync_binlog = 1
transaction_isolation = REPEATABLE-READ|READ-COMMITTED|...
Nous nous soucions de vos données !
Copyright @ 2022 Oracle and/or its affiliates.
41
ACID - Transactions
Copyright @ 2022 Oracle and/or its affiliates.
42
ACID - Transactions
Copyright @ 2022 Oracle and/or its affiliates.
43
OK nous avons le Document Store,
OK nous avons le Document Store,
les opérations CRUD et la norme ACID
les opérations CRUD et la norme ACID
mais qu'est-ce qui rend le MySQL Document Store unique
mais qu'est-ce qui rend le MySQL Document Store unique
?
?
Copyright @ 2022 Oracle and/or its affiliates.
44
Challenge: listez les meilleurs restaurants de chaque
type de nourriture et a chez le top 10, avec le meilleur
en premier !
n'oubliez pas que tous ces restaurants ne sont que des documents JSON
Copyright @ 2022 Oracle and/or its affiliates.
45
Traiter le NoSQL comme du SQL - agrégation
Copyright @ 2022 Oracle and/or its affiliates.
46
Traiter le NoSQL comme du SQL - agrégation
Copyright @ 2022 Oracle and/or its affiliates.
47
Traiter le NoSQL comme du SQL - agrégation
Copyright @ 2022 Oracle and/or its affiliates.
48
Traiter le NoSQL comme du SQL - agrégation
Copyright @ 2022 Oracle and/or its affiliates.
49
NoSQL ou SQL
Vous avez la possibilité d'écrire un code propre et soigné :
Copyright @ 2022 Oracle and/or its affiliates.
50
NoSQL ou SQL
Vous avez la possibilité d'écrire un code propre et soigné :
$results
$results =
= $collection
$collection->
->find
find(
('cuisine like "italian"'
'cuisine like "italian"')
)->
->execute
execute(
()
)->
->fetchAll
fetchAll(
()
);
;
Copyright @ 2022 Oracle and/or its affiliates.
50
NoSQL ou SQL
Vous avez la possibilité d'écrire un code propre et soigné :
$results
$results =
= $collection
$collection->
->find
find(
('cuisine like "italian"'
'cuisine like "italian"')
)->
->execute
execute(
()
)->
->fetchAll
fetchAll(
()
);
;
Et n'utilisez SQL que lorsque c'est vraiment nécessaire :
Copyright @ 2022 Oracle and/or its affiliates.
50
NoSQL ou SQL
Vous avez la possibilité d'écrire un code propre et soigné :
$results
$results =
= $collection
$collection->
->find
find(
('cuisine like "italian"'
'cuisine like "italian"')
)->
->execute
execute(
()
)->
->fetchAll
fetchAll(
()
);
;
Et n'utilisez SQL que lorsque c'est vraiment nécessaire :
$results
$results =
= $session
$session->
->sql
sql(
('WITH cte1 AS (SELECT doc->>"$.name" AS name,
'WITH cte1 AS (SELECT doc->>"$.name" AS name,
doc->>"$.cuisine" AS cuisine,
doc->>"$.cuisine" AS cuisine,
(SELECT AVG(score) FROM JSON_TABLE(doc, "$.grades[*]" COLUMNS (score INT
(SELECT AVG(score) FROM JSON_TABLE(doc, "$.grades[*]" COLUMNS (score INT
PATH "$.score")) AS r) AS avg_score FROM docstore.restaurants) SELECT *, RANK()
PATH "$.score")) AS r) AS avg_score FROM docstore.restaurants) SELECT *, RANK()
OVER ( PARTITION BY cuisine ORDER BY avg_score) AS `rank`
OVER ( PARTITION BY cuisine ORDER BY avg_score) AS `rank`
FROM cte1 ORDER BY `rank`, avg_score DESC LIMIT 10;'
FROM cte1 ORDER BY `rank`, avg_score DESC LIMIT 10;')
)->
->execute
execute(
()
);
;
Copyright @ 2022 Oracle and/or its affiliates.
50
Tout cela dans la même session MySQL X !
Copyright @ 2022 Oracle and/or its affiliates.
51
vous pouvez combiner NoSQL & SQL
Copyright @ 2022 Oracle and/or its affiliates.
52
Aller plus loin !
Le meilleur des deux mondes:
Copyright @ 2022 Oracle and/or its affiliates.
53
Aller plus loin !
Le meilleur des deux mondes:
Et le résultat en action:
Copyright @ 2022 Oracle and/or its affiliates.
53
Aller plus loin !
Le meilleur des deux mondes:
Et le résultat en action:
Copyright @ 2022 Oracle and/or its affiliates.
53
Copyright @ 2022 Oracle and/or its affiliates.
54
Conclusion
Conclusion
qu'est ce que j'y gagne ?
qu'est ce que j'y gagne ?
Copyright @ 2022 Oracle and/or its affiliates.
55
absence de schéma
structure de données exible
apprentissage facile (CRUD)
Conclusion
Le meilleur des deux mondes en un seul produit !
Intégrité des données
Conforme à la norme ACID
Transactions
SQL
Copyright @ 2022 Oracle and/or its affiliates.
56
MySQL 8.0 DBA Certi cation
Copyright @ 2022 Oracle and/or its affiliates.
57
MySQL 8.0 Developer Certi cation
Copyright @ 2022 Oracle and/or its affiliates.
58
Merci !
Merci !
Copyright @ 2022 Oracle and/or its affiliates.
59

MySQL Innovation & Cloud Day - Document Store avec MySQL HeatWave Database Service

  • 1.
    Frédéric Descamps Community Manager OracleMySQL Novembre 2022 Document Store avec MySQL Document Store avec MySQL HeatWave Database Service HeatWave Database Service MySQL Innovation & Cloud Day MySQL Innovation & Cloud Day
  • 2.
    Qui suis-je ? Quisuis-je ? about.me/lefred about.me/lefred Copyright @ 2022 Oracle and/or its affiliates. 2
  • 3.
    Frédéric Descamps @lefred animateur dela Communauté MySQL utilisateur de MySQL depuis la version 3.20 fervant adepte du vrai devops habite dans la contrée de la bière, du chocolat et des frites h ps://lefred.be Copyright @ 2022 Oracle and/or its affiliates. 3
  • 4.
    MySQL 8.0 DocumentStore MySQL 8.0 Document Store à la découverte du nouveau monde ! à la découverte du nouveau monde ! Copyright @ 2022 Oracle and/or its affiliates. 4
  • 5.
    NoSQL Document Store Sansstructure (schemaless) Copyright @ 2022 Oracle and/or its affiliates. 5
  • 6.
    NoSQL Document Store Sansstructure (schemaless) pas de conception de schéma, pas de normalisation, pas de clés étrangères, pas de types de données, ... Copyright @ 2022 Oracle and/or its affiliates. 5
  • 7.
    NoSQL Document Store Sansstructure (schemaless) pas de conception de schéma, pas de normalisation, pas de clés étrangères, pas de types de données, ... un développement initial très rapide Copyright @ 2022 Oracle and/or its affiliates. 5
  • 8.
    NoSQL Document Store Sansstructure (schemaless) pas de conception de schéma, pas de normalisation, pas de clés étrangères, pas de types de données, ... un développement initial très rapide Structure de données exible Copyright @ 2022 Oracle and/or its affiliates. 5
  • 9.
    NoSQL Document Store Sansstructure (schemaless) pas de conception de schéma, pas de normalisation, pas de clés étrangères, pas de types de données, ... un développement initial très rapide Structure de données exible tableaux ou objets intégrés Copyright @ 2022 Oracle and/or its affiliates. 5
  • 10.
    NoSQL Document Store Sansstructure (schemaless) pas de conception de schéma, pas de normalisation, pas de clés étrangères, pas de types de données, ... un développement initial très rapide Structure de données exible tableaux ou objets intégrés solution valable lorsque les certaines données ne peuvent pas être modélisées de manière optimale dans un modèle relationnel Copyright @ 2022 Oracle and/or its affiliates. 5
  • 11.
    NoSQL Document Store Sansstructure (schemaless) pas de conception de schéma, pas de normalisation, pas de clés étrangères, pas de types de données, ... un développement initial très rapide Structure de données exible tableaux ou objets intégrés solution valable lorsque les certaines données ne peuvent pas être modélisées de manière optimale dans un modèle relationnel persistance des objets sans l'utilisation d'un ORM - mapping oobject-oriented Copyright @ 2022 Oracle and/or its affiliates. 5
  • 12.
    NoSQL Document Store Sansstructure (schemaless) pas de conception de schéma, pas de normalisation, pas de clés étrangères, pas de types de données, ... un développement initial très rapide Structure de données exible tableaux ou objets intégrés solution valable lorsque les certaines données ne peuvent pas être modélisées de manière optimale dans un modèle relationnel persistance des objets sans l'utilisation d'un ORM - mapping oobject-oriented JSON Copyright @ 2022 Oracle and/or its affiliates. 5
  • 13.
    NoSQL Document Store Sansstructure (schemaless) pas de conception de schéma, pas de normalisation, pas de clés étrangères, pas de types de données, ... un développement initial très rapide Structure de données exible tableaux ou objets intégrés solution valable lorsque les certaines données ne peuvent pas être modélisées de manière optimale dans un modèle relationnel persistance des objets sans l'utilisation d'un ORM - mapping oobject-oriented JSON proche du frontend Copyright @ 2022 Oracle and/or its affiliates. 5
  • 14.
    NoSQL Document Store Sansstructure (schemaless) pas de conception de schéma, pas de normalisation, pas de clés étrangères, pas de types de données, ... un développement initial très rapide Structure de données exible tableaux ou objets intégrés solution valable lorsque les certaines données ne peuvent pas être modélisées de manière optimale dans un modèle relationnel persistance des objets sans l'utilisation d'un ORM - mapping oobject-oriented JSON proche du frontend apprentissage aisé Copyright @ 2022 Oracle and/or its affiliates. 5
  • 15.
    par les DBAs Percectiondes données Copyright @ 2022 Oracle and/or its affiliates. 6
  • 16.
    par les DBAspar les développeurs { { "GNP" "GNP" : : 249704 249704, , "Name" "Name" : : "Belgium" "Belgium", , "government" "government" : : { { "GovernmentForm" "GovernmentForm" : : "Constitutional Monarchy, Federation" "Constitutional Monarchy, Federation", , "HeadOfState" "HeadOfState" : : "Philippe I" "Philippe I" } }, , "_id" "_id" : : "BEL" "BEL", , "IndepYear" "IndepYear" : : 1830 1830, , "demographics" "demographics" : : { { "Population" "Population" : : 10239000 10239000, , "LifeExpectancy" "LifeExpectancy" : : 77.8000030517578 77.8000030517578 } }, , } } Percection des données Copyright @ 2022 Oracle and/or its affiliates. 6
  • 17.
    Il faut quand-mêmetoujours réaliser des analyses SQL SQL SQL Copyright @ 2022 Oracle and/or its affiliates. 7
  • 18.
    ... mais...comment ? ? SQL SQL SQL Copyright@ 2022 Oracle and/or its affiliates. 8
  • 19.
    En migrant lesdonnées (ETL) SQL SQL SQL ETL: Extraction-Transformation-Chargement Copyright @ 2022 Oracle and/or its affiliates. 9
  • 20.
    Et s'il yavait un moyen de fournir à la fois SQL et NoSQL sur une plateforme stable qui a prouvé sa stabilité sur une technologie bien connue disposant d'une grande communauté et un écosystème diversi é ? Copyright @ 2022 Oracle and/or its affiliates. 10
  • 21.
    RDBMS ou NoSQL? Copyright @ 2022 Oracle and/or its affiliates. 11
  • 22.
    RDBMS ou NoSQL? Pourquoi pas les deux ? Copyright @ 2022 Oracle and/or its affiliates. 11
  • 23.
    MySQL Document Store! Où le SQL est optionnel ?! Copyright @ 2022 Oracle and/or its affiliates. 12
  • 24.
    Le SQL estoptionnel ?! Copyright @ 2022 Oracle and/or its affiliates. 13
  • 25.
    Utilisation de MySQLDocument Store ! SQL SQL SQL Copyright @ 2022 Oracle and/or its affiliates. 14
  • 26.
    La Solution La Solution MySQLDocument Store MySQL Document Store Copyright @ 2022 Oracle and/or its affiliates. 15
  • 27.
    Bâti sur le typede données JSON et la solide technologie de MySQL Server Fournit un JSON Document Store exible en terme de schéma Aucune connaissance de SQL requise Pas besoin de dé nir tous les a ributs possibles, les tables, etc. Utilise la nouvelle interface X DevAPI Possibilité d'indexation des données Un document peut avoir une taille de ~1GB ! Permet l'utilisation des nouveaux styles de programmation moderne Possibilité de ne plus avoir de requêtes SQL intégrées dans le code Code plus facile à lire Fonctionne également aves les tables relationnelles Compatible avec les solutions existantes pour MySQL Copyright @ 2022 Oracle and/or its affiliates. 16
  • 28.
    Connecteurs compatibles avecX Protocol Copyright @ 2022 Oracle and/or its affiliates. 17
  • 29.
    Installation Installation MySQL Document Store MySQLDocument Store Copyright @ 2022 Oracle and/or its affiliates. 18
  • 30.
    Installation de MySQLDocument Store installer MySQL 8.0 Copyright @ 2022 Oracle and/or its affiliates. 19
  • 31.
    Installation de MySQLDocument Store installer MySQL 8.0 installer MySQL Shell Copyright @ 2022 Oracle and/or its affiliates. 19
  • 32.
    Installation de MySQLDocument Store installer MySQL 8.0 installer MySQL Shell installer un connecteur pour votre langage de programmation Copyright @ 2022 Oracle and/or its affiliates. 19
  • 33.
    Installation de MySQLDocument Store installer MySQL 8.0 installer MySQL Shell installer un connecteur pour votre langage de programmation php-pecl-mysql-xdevapi pour PHP mysql-connector-python pour Python ... Copyright @ 2022 Oracle and/or its affiliates. 19
  • 34.
    Installation de MySQLDocument Store installer MySQL 8.0 installer MySQL Shell installer un connecteur pour votre langage de programmation php-pecl-mysql-xdevapi pour PHP mysql-connector-python pour Python ... Et rien d'autre, pas besoin d'installer d'autre composant ou de charger un plugin. Assurez- vous simplement que votre pare-feu vous perme e de vous connecter au port 33060 (X Protocol). Copyright @ 2022 Oracle and/or its affiliates. 19
  • 35.
    MySQL HeatWave DatabaseService MySQL HeatWave Database Service sur OCI est le seul service dans le Cloud perme ant d'utiliser le X Protocol. Copyright @ 2022 Oracle and/or its affiliates. 20
  • 36.
    Migration de MongoDBvers MySQL DS Pour cet example, j'utilise la collection restaurants de MongoDB: $ mongoexport $ mongoexport -c -c restaurants restaurants > > restaurants.json restaurants.json connected to: connected to: 127.0 127.0.0.1 .0.1 exported exported 25359 25359 records records Copyright @ 2022 Oracle and/or its affiliates. 21
  • 37.
    Migration de MongoDBvers MySQL DS Pour cet example, j'utilise la collection restaurants de MongoDB: $ mongoexport $ mongoexport -c -c restaurants restaurants > > restaurants.json restaurants.json connected to: connected to: 127.0 127.0.0.1 .0.1 exported exported 25359 25359 records records JS JS> > util util. .importJson importJson( ('restaurants.json' 'restaurants.json', ,{ {convertBsonOid convertBsonOid: : true true} }) ) Importing from file Importing from file "restaurants.json" "restaurants.json" to collection to collection ` `docstore docstore` `. .` `restaurants restaurants` ` in in MySQL Server at localhost MySQL Server at localhost: :33060 33060 . .. . 25359. 25359.. . 25359 25359 Processed Processed 15.60 15.60 MB MB in in 25359 25359 documents documents in in 0.9976 0.9976 sec sec ( (25 25. .36K documents 36K documents/ /s s) ) Total successfully imported documents Total successfully imported documents 25359 25359 ( (25 25. .36K documents 36K documents/ /s s) ) Copyright @ 2022 Oracle and/or its affiliates. 21
  • 38.
    Copyright @ 2022Oracle and/or its affiliates. 22
  • 39.
    Copyright @ 2022Oracle and/or its affiliates. 23
  • 40.
    Copyright @ 2022Oracle and/or its affiliates. 24
  • 41.
    Copyright @ 2022Oracle and/or its affiliates. 25
  • 42.
    Faisons une requête JS> restaurants.find() C'est beaucoup trop d'enrgistrements pour les a cher ici... limitons-les Copyright @ 2022 Oracle and/or its affiliates. 26
  • 43.
    Copyright @ 2022Oracle and/or its affiliates. 27
  • 44.
    Quelques autres examples Copyright@ 2022 Oracle and/or its affiliates. 28
  • 45.
    Ajoutons un critèrede sélection Copyright @ 2022 Oracle and/or its affiliates. 29
  • 46.
    Syntaxe légèrment diérente de celle de MongoDB Copyright @ 2022 Oracle and/or its affiliates. 30
  • 47.
    Syntaxe légèrment diérente de celle de MongoDB Copyright @ 2022 Oracle and/or its affiliates. 30
  • 48.
    Et pour lesdéveloppeurs ? Copyright @ 2022 Oracle and/or its affiliates. 31
  • 49.
    Et pour lesdéveloppeurs ? $session $session = = mysql_xdevapi mysql_xdevapi getSession getSession( ("mysqlx://fred:MyP@ssw0rd%@localhost" "mysqlx://fred:MyP@ssw0rd%@localhost") ); ; $schema $schema = = $session $session-> ->getSchema getSchema( ("docstore" "docstore") ); ; $collection $collection = = $schema $schema-> ->getCollection getCollection( ("restaurants" "restaurants") ); ; $results $results = = $collection $collection-> ->find find( ($search $search) )-> ->execute execute( () )-> ->fetchAll fetchAll( () ); ; ... ... foreach foreach ( ($results $results as as $doc $doc) ) { { echo echo "<tr><td><a href='?id=${doc[_id]}'>${doc[name]}</a></td>" "<tr><td><a href='?id=${doc[_id]}'>${doc[name]}</a></td>"; ; echo echo "<td>${doc[borough]}</td><td>${doc[cuisine]}</td></tr>" "<td>${doc[borough]}</td><td>${doc[cuisine]}</td></tr>"; ; } } Copyright @ 2022 Oracle and/or its affiliates. 32
  • 50.
    Et pour lesdéveloppeurs ? $session $session = = mysql_xdevapi mysql_xdevapi getSession getSession( ("mysqlx://fred:MyP@ssw0rd%@localhost" "mysqlx://fred:MyP@ssw0rd%@localhost") ); ; $schema $schema = = $session $session-> ->getSchema getSchema( ("docstore" "docstore") ); ; $collection $collection = = $schema $schema-> ->getCollection getCollection( ("restaurants" "restaurants") ); ; $results $results = = $collection $collection-> ->find find( ($search $search) )-> ->execute execute( () )-> ->fetchAll fetchAll( () ); ; ... ... foreach foreach ( ($results $results as as $doc $doc) ) { { echo echo "<tr><td><a href='?id=${doc[_id]}'>${doc[name]}</a></td>" "<tr><td><a href='?id=${doc[_id]}'>${doc[name]}</a></td>"; ; echo echo "<td>${doc[borough]}</td><td>${doc[cuisine]}</td></tr>" "<td>${doc[borough]}</td><td>${doc[cuisine]}</td></tr>"; ; } } Facile, en utilisant uniquement des opérations CRUD ! Copyright @ 2022 Oracle and/or its affiliates. 32
  • 51.
    Et pour lesdéveloppeurs ? $session $session = = mysql_xdevapi mysql_xdevapi getSession getSession( ("mysqlx://fred:MyP@ssw0rd%@localhost" "mysqlx://fred:MyP@ssw0rd%@localhost") ); ; $schema $schema = = $session $session-> ->getSchema getSchema( ("docstore" "docstore") ); ; $collection $collection = = $schema $schema-> ->getCollection getCollection( ("restaurants" "restaurants") ); ; $results $results = = $collection $collection-> ->find find( ($search $search) )-> ->execute execute( () )-> ->fetchAll fetchAll( () ); ; ... ... foreach foreach ( ($results $results as as $doc $doc) ) { { echo echo "<tr><td><a href='?id=${doc[_id]}'>${doc[name]}</a></td>" "<tr><td><a href='?id=${doc[_id]}'>${doc[name]}</a></td>"; ; echo echo "<td>${doc[borough]}</td><td>${doc[cuisine]}</td></tr>" "<td>${doc[borough]}</td><td>${doc[cuisine]}</td></tr>"; ; } } Facile, en utilisant uniquement des opérations CRUD ! Pas une seule instruction SQL ! Copyright @ 2022 Oracle and/or its affiliates. 32
  • 52.
    En import import * *; ; class class Main Main{ { public public static static void void main main( (String String args args[ [] ]) ) { { Session Session mySession mySession = = new new SessionFactory SessionFactory( () ) . .getSession getSession( ("mysqlx://localhost:33060/docstore?user=resto&password=Passw0rd!" "mysqlx://localhost:33060/docstore?user=resto&password=Passw0rd!") ); ; Schema Schema myDb myDb = = mySession mySession. .getSchema getSchema( ("docstore" "docstore") ); ; Collection Collection myColl myColl = = myDb myDb. .getCollection getCollection( ("restaurants" "restaurants") ); ; DocResult DocResult myDocs myDocs = = myColl myColl. .find find( ("name like :param" "name like :param") ). .limit limit( (1 1) ) . .bind bind( ("param" "param", , "Green%" "Green%") ). .execute execute( () ); ; System System. .out out. .println println( (myDocs myDocs. .fetchOne fetchOne( () )) ); ; mySession mySession. .close close( () ); ; } } } } Copyright @ 2022 Oracle and/or its affiliates. com com. .mysql mysql. .cj cj. .xdevapi xdevapi. . 33
  • 53.
    Opérations CRUD L'acronyme informatiqueanglais CRUD (pour Create, Read, Update, Delete) désigne les quatre opérations de base pour la persistance des données, en particulier le stockage d'informations en base de données. Copyright @ 2022 Oracle and/or its affiliates. 34
  • 54.
    Opérations CRUD relativesaux collections Ajout d'un document collection collection. .add add( ({ { name name: : 'fred' 'fred', , age age: : 46 46 } }) ) . .add add( ({ { name name: : 'scott' 'scott', , age age: : 47 47 } }) ) . .execute execute( () ) collection collection. .add add( ([ [ { { name name: : 'dimo' 'dimo', , age age: : 50 50 } }, , { { name name: : 'kenny' 'kenny', , age age: : 25 25 } } ] ]) ). .execute execute( () ) Copyright @ 2022 Oracle and/or its affiliates. 35
  • 55.
    collection collection. .modify modify( ('name = :name' 'name= :name') ) . .bind bind( ('name' 'name', , 'fred' 'fred') ) . .set set( ('age' 'age', , 43 43) ) . .sort sort( ('name ASC' 'name ASC') ) . .limit limit( (1 1) ) . .execute execute( () ) collection collection. .modify modify( ('name = :name' 'name = :name') ) . .bind bind( ('name' 'name', , 'fred' 'fred') ) . .patch patch( ({ { age age: : 43 43, , active active: : false false } }) ) . .sort sort( ('name DESC' 'name DESC') ) . .limit limit( (1 1) ) . .execute execute( () ) Opérations CRUD relatives aux collections Modi cation d'un document Copyright @ 2022 Oracle and/or its affiliates. 36
  • 56.
    Opérations CRUD relativesaux collections Suppression d'un document collection collection. .remove remove( ('name = :name' 'name = :name') ) . .bind bind( ('name' 'name', , 'fred' 'fred') ) . .sort sort( ('age ASC' 'age ASC') ) . .limit limit( (1 1) ) . .execute execute( () ) Copyright @ 2022 Oracle and/or its affiliates. 37
  • 57.
    MySQL Document StoreObjects Summary Copyright @ 2022 Oracle and/or its affiliates. 38
  • 58.
    Tout ce dontvous avez besoin, se trouve ici: h ps://dev.mysql.com/doc/x-devapi-userguide/en/crud-operations-overview.html Copyright @ 2022 Oracle and/or its affiliates. 39
  • 59.
    MySQL Document Store MySQLDocument Store est entièrement conforme à la norme ACID est entièrement conforme à la norme ACID nous nous soucions de vos données nous nous soucions de vos données Copyright @ 2022 Oracle and/or its affiliates. 40
  • 60.
    Document Store entièrementACID ! Ce e solution s'appuie sur la force et la robustesse éprouvée de MySQL InnoDB Copyright @ 2022 Oracle and/or its affiliates. 41
  • 61.
    Document Store entièrementACID ! Ce e solution s'appuie sur la force et la robustesse éprouvée de MySQL InnoDB innodb_ ush_log_at_trx_commit = 1 Copyright @ 2022 Oracle and/or its affiliates. 41
  • 62.
    Document Store entièrementACID ! Ce e solution s'appuie sur la force et la robustesse éprouvée de MySQL InnoDB innodb_ ush_log_at_trx_commit = 1 innodb_doublewrite = ON Copyright @ 2022 Oracle and/or its affiliates. 41
  • 63.
    Document Store entièrementACID ! Ce e solution s'appuie sur la force et la robustesse éprouvée de MySQL InnoDB innodb_ ush_log_at_trx_commit = 1 innodb_doublewrite = ON sync_binlog = 1 Copyright @ 2022 Oracle and/or its affiliates. 41
  • 64.
    Document Store entièrementACID ! Ce e solution s'appuie sur la force et la robustesse éprouvée de MySQL InnoDB innodb_ ush_log_at_trx_commit = 1 innodb_doublewrite = ON sync_binlog = 1 transaction_isolation = REPEATABLE-READ|READ-COMMITTED|... Copyright @ 2022 Oracle and/or its affiliates. 41
  • 65.
    Document Store entièrementACID ! Ce e solution s'appuie sur la force et la robustesse éprouvée de MySQL InnoDB innodb_ ush_log_at_trx_commit = 1 innodb_doublewrite = ON sync_binlog = 1 transaction_isolation = REPEATABLE-READ|READ-COMMITTED|... Nous nous soucions de vos données ! Copyright @ 2022 Oracle and/or its affiliates. 41
  • 66.
    ACID - Transactions Copyright@ 2022 Oracle and/or its affiliates. 42
  • 67.
    ACID - Transactions Copyright@ 2022 Oracle and/or its affiliates. 43
  • 68.
    OK nous avonsle Document Store, OK nous avons le Document Store, les opérations CRUD et la norme ACID les opérations CRUD et la norme ACID mais qu'est-ce qui rend le MySQL Document Store unique mais qu'est-ce qui rend le MySQL Document Store unique ? ? Copyright @ 2022 Oracle and/or its affiliates. 44
  • 69.
    Challenge: listez lesmeilleurs restaurants de chaque type de nourriture et a chez le top 10, avec le meilleur en premier ! n'oubliez pas que tous ces restaurants ne sont que des documents JSON Copyright @ 2022 Oracle and/or its affiliates. 45
  • 70.
    Traiter le NoSQLcomme du SQL - agrégation Copyright @ 2022 Oracle and/or its affiliates. 46
  • 71.
    Traiter le NoSQLcomme du SQL - agrégation Copyright @ 2022 Oracle and/or its affiliates. 47
  • 72.
    Traiter le NoSQLcomme du SQL - agrégation Copyright @ 2022 Oracle and/or its affiliates. 48
  • 73.
    Traiter le NoSQLcomme du SQL - agrégation Copyright @ 2022 Oracle and/or its affiliates. 49
  • 74.
    NoSQL ou SQL Vousavez la possibilité d'écrire un code propre et soigné : Copyright @ 2022 Oracle and/or its affiliates. 50
  • 75.
    NoSQL ou SQL Vousavez la possibilité d'écrire un code propre et soigné : $results $results = = $collection $collection-> ->find find( ('cuisine like "italian"' 'cuisine like "italian"') )-> ->execute execute( () )-> ->fetchAll fetchAll( () ); ; Copyright @ 2022 Oracle and/or its affiliates. 50
  • 76.
    NoSQL ou SQL Vousavez la possibilité d'écrire un code propre et soigné : $results $results = = $collection $collection-> ->find find( ('cuisine like "italian"' 'cuisine like "italian"') )-> ->execute execute( () )-> ->fetchAll fetchAll( () ); ; Et n'utilisez SQL que lorsque c'est vraiment nécessaire : Copyright @ 2022 Oracle and/or its affiliates. 50
  • 77.
    NoSQL ou SQL Vousavez la possibilité d'écrire un code propre et soigné : $results $results = = $collection $collection-> ->find find( ('cuisine like "italian"' 'cuisine like "italian"') )-> ->execute execute( () )-> ->fetchAll fetchAll( () ); ; Et n'utilisez SQL que lorsque c'est vraiment nécessaire : $results $results = = $session $session-> ->sql sql( ('WITH cte1 AS (SELECT doc->>"$.name" AS name, 'WITH cte1 AS (SELECT doc->>"$.name" AS name, doc->>"$.cuisine" AS cuisine, doc->>"$.cuisine" AS cuisine, (SELECT AVG(score) FROM JSON_TABLE(doc, "$.grades[*]" COLUMNS (score INT (SELECT AVG(score) FROM JSON_TABLE(doc, "$.grades[*]" COLUMNS (score INT PATH "$.score")) AS r) AS avg_score FROM docstore.restaurants) SELECT *, RANK() PATH "$.score")) AS r) AS avg_score FROM docstore.restaurants) SELECT *, RANK() OVER ( PARTITION BY cuisine ORDER BY avg_score) AS `rank` OVER ( PARTITION BY cuisine ORDER BY avg_score) AS `rank` FROM cte1 ORDER BY `rank`, avg_score DESC LIMIT 10;' FROM cte1 ORDER BY `rank`, avg_score DESC LIMIT 10;') )-> ->execute execute( () ); ; Copyright @ 2022 Oracle and/or its affiliates. 50
  • 78.
    Tout cela dansla même session MySQL X ! Copyright @ 2022 Oracle and/or its affiliates. 51
  • 79.
    vous pouvez combinerNoSQL & SQL Copyright @ 2022 Oracle and/or its affiliates. 52
  • 80.
    Aller plus loin! Le meilleur des deux mondes: Copyright @ 2022 Oracle and/or its affiliates. 53
  • 81.
    Aller plus loin! Le meilleur des deux mondes: Et le résultat en action: Copyright @ 2022 Oracle and/or its affiliates. 53
  • 82.
    Aller plus loin! Le meilleur des deux mondes: Et le résultat en action: Copyright @ 2022 Oracle and/or its affiliates. 53
  • 83.
    Copyright @ 2022Oracle and/or its affiliates. 54
  • 84.
    Conclusion Conclusion qu'est ce quej'y gagne ? qu'est ce que j'y gagne ? Copyright @ 2022 Oracle and/or its affiliates. 55
  • 85.
    absence de schéma structurede données exible apprentissage facile (CRUD) Conclusion Le meilleur des deux mondes en un seul produit ! Intégrité des données Conforme à la norme ACID Transactions SQL Copyright @ 2022 Oracle and/or its affiliates. 56
  • 86.
    MySQL 8.0 DBACerti cation Copyright @ 2022 Oracle and/or its affiliates. 57
  • 87.
    MySQL 8.0 DeveloperCerti cation Copyright @ 2022 Oracle and/or its affiliates. 58
  • 88.
    Merci ! Merci ! Copyright@ 2022 Oracle and/or its affiliates. 59