1659549600
Mon article « SQL vs NoSQL : les différences » a noté que la frontière entre les bases de données SQL et NoSQL est devenue de plus en plus floue, chaque camp adoptant les fonctionnalités de l'autre. Les bases de données MySQL 5.7+ InnoDB et PostgreSQL 9.2+ prennent directement en charge les types de documents JSON dans un seul champ. Dans cet article, nous examinerons plus en détail l'implémentation de MySQL 8.0 JSON.
Notez que toute base de données acceptera les documents JSON en tant que blob à chaîne unique. Cependant, MySQL et PostgreSQL prennent en charge les données JSON validées dans de vraies paires clé/valeur plutôt qu'une chaîne de base.
… il ne s'ensuit pas que vous devriez.
La normalisation est une technique utilisée pour optimiser la structure de la base de données. La règle de la première forme normale (1NF) stipule que chaque colonne doit contenir une seule valeur, ce qui est clairement rompu par le stockage de documents JSON à valeurs multiples.
Si vous avez des exigences claires en matière de données relationnelles, utilisez des champs à valeur unique appropriés. JSON doit être utilisé avec parcimonie en dernier recours. Les champs de valeur JSON ne peuvent pas être indexés, évitez donc de l'utiliser sur des colonnes qui sont mises à jour ou recherchées régulièrement. De plus, moins d'applications clientes prennent en charge JSON et la technologie est plus récente, elle pourrait donc être moins stable que d'autres types.
Cela dit, il existe de bons cas d'utilisation JSON pour les données peu peuplées ou les attributs personnalisés.
Considérez un magasin vendant des livres. Tous les livres ont un identifiant, un ISBN, un titre, un éditeur, un nombre de pages et d'autres données relationnelles claires. Supposons que vous souhaitiez ajouter un nombre quelconque de balises de catégorie à chaque livre. Vous pouvez y parvenir en SQL en utilisant :
Cela fonctionnera, mais c'est un effort lourd et considérable pour une fonctionnalité mineure. Par conséquent, vous pouvez définir un champ JSON de balises dans la table des livres de votre base de données MySQL :
CREATE TABLE `book` (
`id` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
`title` VARCHAR(200) NOT NULL,
`tags` JSON DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB;
Notez que les colonnes JSON ne peuvent pas avoir de valeur par défaut, être utilisées comme clé primaire, être utilisées comme clé étrangère ou avoir un index. Vous pouvez créer des index secondaires sur des colonnes virtuelles générées , mais il est plus facile et plus pratique de conserver une valeur dans un champ séparé si des index sont nécessaires.
Des documents JSON entiers peuvent être transmis dans des instructions INSERT ou UPDATE . Par exemple, nos balises de livre peuvent être passées sous forme de tableau (à l'intérieur d'une chaîne) :
INSERT INTO `book` (`title`, `tags`)
VALUES (
'ECMAScript 2015: A SitePoint Anthology',
'["JavaScript", "ES2015", "JSON"]'
);
JSON peut également être créé avec ceux-ci :
Fonction JSON_ARRAY() , qui crée des tableaux. Par exemple:
Fonction JSON_OBJECT() , qui crée des objets. Par exemple:
Fonction JSON_QUOTE() , qui cite une chaîne en tant que valeur JSON. Par exemple:
ou vous pouvez (CAST anyValue AS JSON)
.
La fonction JSON_TYPE() vous permet de vérifier les types de valeur JSON. Il doit renvoyer OBJECT, ARRAY, un type scalaire (INTEGER, BOOLEAN, etc.), NULL ou une erreur. Par exemple:
-- returns ARRAY:
SELECT JSON_TYPE('[1, 2, "abc"]');
-- returns OBJECT:
SELECT JSON_TYPE('{"a": 1, "b": 2}');
-- returns an error:
SELECT JSON_TYPE('{"a": 1, "b": 2');
La fonction JSON_VALID() renvoie 1 si le JSON est valide ou 0 sinon :
-- returns 1:
SELECT JSON_TYPE('[1, 2, "abc"]');
-- returns 1:
SELECT JSON_TYPE('{"a": 1, "b": 2}');
-- returns 0:
SELECT JSON_TYPE('{"a": 1, "b": 2');
Tenter d'insérer un document JSON invalide générera une erreur et l'intégralité de l'enregistrement ne sera pas inséré/mis à jour.
La fonction JSON_CONTAINS() accepte le document JSON recherché et un autre à comparer. Il renvoie 1 lorsqu'une correspondance est trouvée. Par exemple:
-- all books with the 'JavaScript' tag:
SELECT * FROM `book` WHERE JSON_CONTAINS(tags, '["JavaScript"]');
La fonction similaire JSON_SEARCH() renvoie le chemin vers la correspondance donnée ou NULL lorsqu'il n'y a pas de correspondance. Il est passé au document JSON recherché, 'one'
pour trouver la première correspondance ou 'all'
pour trouver toutes les correspondances, et une chaîne de recherche (où %
correspond à n'importe quel nombre de caractères et _
correspond à un caractère de la même manière que LIKE
). Par exemple:
-- all books with tags starting 'Java':
SELECT * FROM `book` WHERE JSON_SEARCH(tags, 'one', 'Java%') IS NOT NULL;
Un chemin JSON cible des valeurs et peut être utilisé pour extraire ou modifier des parties d'un document JSON. La fonction JSON_EXTRACT() le démontre en extrayant une ou plusieurs valeurs :
-- returns "SitePoint":
SELECT JSON_EXTRACT('{"id": 1, "website": "SitePoint"}', '$.website');
Toutes les définitions de chemin commencent par un $
suivi d'autres sélecteurs :
$.website
[N]
où N est la position dans un tableau indexé à zéro.[*]
joker évalue tous les membres d'un objet[*]
joker évalue tous les membres d'un tableauprefix**suffix
caractère générique évalue tous les chemins qui commencent par le préfixe nommé et se terminent par le suffixe nomméLes exemples suivants font référence au document JSON suivant :
{
"a": 1,
"b": 2,
"c": [3, 4],
"d": {
"e": 5,
"f": 6
}
}
Exemples de chemins :
$.a
Retour1
$.c
Retour[3, 4]
$.c[1]
Retour4
$.d.e
Retour5
$**.e
Retour[5]
Vous pouvez extraire le nom et la première balise de votre table de livres à l'aide de la requête :
SELECT
title, tags->"$[0]" AS `tag1`
FROM `book`;
Pour un exemple plus complexe, supposons que vous ayez une table utilisateur avec des données de profil JSON. Par exemple:
identifiant | Nom | profil |
---|---|---|
1 | Craig | { « e-mail » : [« craig@email1.com », « craig@email2.com »], « twitter » : « @craigbuckler » } |
2 | SitePoint | { "courriel": [], "twitter": "@sitepointdotcom" } |
Vous pouvez extraire le nom Twitter à l'aide d'un chemin JSON. Par exemple:
SELECT
name, profile->"$.twitter" AS `twitter`
FROM `user`;
Vous pouvez utiliser un chemin JSON dans la clause WHERE pour renvoyer uniquement les utilisateurs avec un compte Twitter :
SELECT
name, profile->"$.twitter" AS `twitter`
FROM `user`
WHERE
profile->"$.twitter" IS NOT NULL;
Il existe plusieurs fonctions MySQL pour modifier des parties d'un document JSON en utilisant la notation de chemin. Ceux-ci inclus:
JSON_SET(doc, path, val[, path, val]...)
: insère ou met à jour des données dans le documentJSON_INSERT(doc, path, val[, path, val]...)
: insère des données dans le documentJSON_REPLACE(doc, path, val[, path, val]...)
: remplace les données dans le documentJSON_MERGE(doc, doc[, doc]...)
: fusionne deux ou plusieurs documentsJSON_ARRAY_APPEND(doc, path, val[, path, val]...)
: ajoute des valeurs à la fin d'un tableauJSON_ARRAY_INSERT(doc, path, val[, path, val]...)
: insère un tableau dans le documentJSON_REMOVE(doc, path[, path]...)
: supprime les données du documentVous pouvez donc ajouter une balise « technique » à tout livre qui possède déjà une balise « JavaScript » :
UPDATE `book`
SET tags = JSON_MERGE(tags, '["technical"]')
WHERE
JSON_SEARCH(tags, 'one', 'JavaScript') IS NOT NULL;
Le manuel MySQL fournit de plus amples informations sur le type de données JSON et les fonctions JSON associées .
Encore une fois, je vous exhorte à ne pas utiliser JSON à moins que ce ne soit absolument nécessaire. Vous pourriez émuler toute une base de données NoSQL orientée document dans MySQL, mais cela annulerait de nombreux avantages de SQL , et vous pourriez aussi bien passer à un vrai système NoSQL ! Cela dit, les types de données JSON peuvent économiser des efforts pour des exigences de données plus obscures dans une application SQL.
Source : https://www.sitepoint.com/use-json-data-fields-mysql-databases/
1659549600
Mon article « SQL vs NoSQL : les différences » a noté que la frontière entre les bases de données SQL et NoSQL est devenue de plus en plus floue, chaque camp adoptant les fonctionnalités de l'autre. Les bases de données MySQL 5.7+ InnoDB et PostgreSQL 9.2+ prennent directement en charge les types de documents JSON dans un seul champ. Dans cet article, nous examinerons plus en détail l'implémentation de MySQL 8.0 JSON.
Notez que toute base de données acceptera les documents JSON en tant que blob à chaîne unique. Cependant, MySQL et PostgreSQL prennent en charge les données JSON validées dans de vraies paires clé/valeur plutôt qu'une chaîne de base.
… il ne s'ensuit pas que vous devriez.
La normalisation est une technique utilisée pour optimiser la structure de la base de données. La règle de la première forme normale (1NF) stipule que chaque colonne doit contenir une seule valeur, ce qui est clairement rompu par le stockage de documents JSON à valeurs multiples.
Si vous avez des exigences claires en matière de données relationnelles, utilisez des champs à valeur unique appropriés. JSON doit être utilisé avec parcimonie en dernier recours. Les champs de valeur JSON ne peuvent pas être indexés, évitez donc de l'utiliser sur des colonnes qui sont mises à jour ou recherchées régulièrement. De plus, moins d'applications clientes prennent en charge JSON et la technologie est plus récente, elle pourrait donc être moins stable que d'autres types.
Cela dit, il existe de bons cas d'utilisation JSON pour les données peu peuplées ou les attributs personnalisés.
Considérez un magasin vendant des livres. Tous les livres ont un identifiant, un ISBN, un titre, un éditeur, un nombre de pages et d'autres données relationnelles claires. Supposons que vous souhaitiez ajouter un nombre quelconque de balises de catégorie à chaque livre. Vous pouvez y parvenir en SQL en utilisant :
Cela fonctionnera, mais c'est un effort lourd et considérable pour une fonctionnalité mineure. Par conséquent, vous pouvez définir un champ JSON de balises dans la table des livres de votre base de données MySQL :
CREATE TABLE `book` (
`id` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
`title` VARCHAR(200) NOT NULL,
`tags` JSON DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB;
Notez que les colonnes JSON ne peuvent pas avoir de valeur par défaut, être utilisées comme clé primaire, être utilisées comme clé étrangère ou avoir un index. Vous pouvez créer des index secondaires sur des colonnes virtuelles générées , mais il est plus facile et plus pratique de conserver une valeur dans un champ séparé si des index sont nécessaires.
Des documents JSON entiers peuvent être transmis dans des instructions INSERT ou UPDATE . Par exemple, nos balises de livre peuvent être passées sous forme de tableau (à l'intérieur d'une chaîne) :
INSERT INTO `book` (`title`, `tags`)
VALUES (
'ECMAScript 2015: A SitePoint Anthology',
'["JavaScript", "ES2015", "JSON"]'
);
JSON peut également être créé avec ceux-ci :
Fonction JSON_ARRAY() , qui crée des tableaux. Par exemple:
Fonction JSON_OBJECT() , qui crée des objets. Par exemple:
Fonction JSON_QUOTE() , qui cite une chaîne en tant que valeur JSON. Par exemple:
ou vous pouvez (CAST anyValue AS JSON)
.
La fonction JSON_TYPE() vous permet de vérifier les types de valeur JSON. Il doit renvoyer OBJECT, ARRAY, un type scalaire (INTEGER, BOOLEAN, etc.), NULL ou une erreur. Par exemple:
-- returns ARRAY:
SELECT JSON_TYPE('[1, 2, "abc"]');
-- returns OBJECT:
SELECT JSON_TYPE('{"a": 1, "b": 2}');
-- returns an error:
SELECT JSON_TYPE('{"a": 1, "b": 2');
La fonction JSON_VALID() renvoie 1 si le JSON est valide ou 0 sinon :
-- returns 1:
SELECT JSON_TYPE('[1, 2, "abc"]');
-- returns 1:
SELECT JSON_TYPE('{"a": 1, "b": 2}');
-- returns 0:
SELECT JSON_TYPE('{"a": 1, "b": 2');
Tenter d'insérer un document JSON invalide générera une erreur et l'intégralité de l'enregistrement ne sera pas inséré/mis à jour.
La fonction JSON_CONTAINS() accepte le document JSON recherché et un autre à comparer. Il renvoie 1 lorsqu'une correspondance est trouvée. Par exemple:
-- all books with the 'JavaScript' tag:
SELECT * FROM `book` WHERE JSON_CONTAINS(tags, '["JavaScript"]');
La fonction similaire JSON_SEARCH() renvoie le chemin vers la correspondance donnée ou NULL lorsqu'il n'y a pas de correspondance. Il est passé au document JSON recherché, 'one'
pour trouver la première correspondance ou 'all'
pour trouver toutes les correspondances, et une chaîne de recherche (où %
correspond à n'importe quel nombre de caractères et _
correspond à un caractère de la même manière que LIKE
). Par exemple:
-- all books with tags starting 'Java':
SELECT * FROM `book` WHERE JSON_SEARCH(tags, 'one', 'Java%') IS NOT NULL;
Un chemin JSON cible des valeurs et peut être utilisé pour extraire ou modifier des parties d'un document JSON. La fonction JSON_EXTRACT() le démontre en extrayant une ou plusieurs valeurs :
-- returns "SitePoint":
SELECT JSON_EXTRACT('{"id": 1, "website": "SitePoint"}', '$.website');
Toutes les définitions de chemin commencent par un $
suivi d'autres sélecteurs :
$.website
[N]
où N est la position dans un tableau indexé à zéro.[*]
joker évalue tous les membres d'un objet[*]
joker évalue tous les membres d'un tableauprefix**suffix
caractère générique évalue tous les chemins qui commencent par le préfixe nommé et se terminent par le suffixe nomméLes exemples suivants font référence au document JSON suivant :
{
"a": 1,
"b": 2,
"c": [3, 4],
"d": {
"e": 5,
"f": 6
}
}
Exemples de chemins :
$.a
Retour1
$.c
Retour[3, 4]
$.c[1]
Retour4
$.d.e
Retour5
$**.e
Retour[5]
Vous pouvez extraire le nom et la première balise de votre table de livres à l'aide de la requête :
SELECT
title, tags->"$[0]" AS `tag1`
FROM `book`;
Pour un exemple plus complexe, supposons que vous ayez une table utilisateur avec des données de profil JSON. Par exemple:
identifiant | Nom | profil |
---|---|---|
1 | Craig | { « e-mail » : [« craig@email1.com », « craig@email2.com »], « twitter » : « @craigbuckler » } |
2 | SitePoint | { "courriel": [], "twitter": "@sitepointdotcom" } |
Vous pouvez extraire le nom Twitter à l'aide d'un chemin JSON. Par exemple:
SELECT
name, profile->"$.twitter" AS `twitter`
FROM `user`;
Vous pouvez utiliser un chemin JSON dans la clause WHERE pour renvoyer uniquement les utilisateurs avec un compte Twitter :
SELECT
name, profile->"$.twitter" AS `twitter`
FROM `user`
WHERE
profile->"$.twitter" IS NOT NULL;
Il existe plusieurs fonctions MySQL pour modifier des parties d'un document JSON en utilisant la notation de chemin. Ceux-ci inclus:
JSON_SET(doc, path, val[, path, val]...)
: insère ou met à jour des données dans le documentJSON_INSERT(doc, path, val[, path, val]...)
: insère des données dans le documentJSON_REPLACE(doc, path, val[, path, val]...)
: remplace les données dans le documentJSON_MERGE(doc, doc[, doc]...)
: fusionne deux ou plusieurs documentsJSON_ARRAY_APPEND(doc, path, val[, path, val]...)
: ajoute des valeurs à la fin d'un tableauJSON_ARRAY_INSERT(doc, path, val[, path, val]...)
: insère un tableau dans le documentJSON_REMOVE(doc, path[, path]...)
: supprime les données du documentVous pouvez donc ajouter une balise « technique » à tout livre qui possède déjà une balise « JavaScript » :
UPDATE `book`
SET tags = JSON_MERGE(tags, '["technical"]')
WHERE
JSON_SEARCH(tags, 'one', 'JavaScript') IS NOT NULL;
Le manuel MySQL fournit de plus amples informations sur le type de données JSON et les fonctions JSON associées .
Encore une fois, je vous exhorte à ne pas utiliser JSON à moins que ce ne soit absolument nécessaire. Vous pourriez émuler toute une base de données NoSQL orientée document dans MySQL, mais cela annulerait de nombreux avantages de SQL , et vous pourriez aussi bien passer à un vrai système NoSQL ! Cela dit, les types de données JSON peuvent économiser des efforts pour des exigences de données plus obscures dans une application SQL.
Source : https://www.sitepoint.com/use-json-data-fields-mysql-databases/
1595905879
HTML to Markdown
MySQL is the all-time number one open source database in the world, and a staple in RDBMS space. DigitalOcean is quickly building its reputation as the developers cloud by providing an affordable, flexible and easy to use cloud platform for developers to work with. MySQL on DigitalOcean is a natural fit, but what’s the best way to deploy your cloud database? In this post, we are going to compare the top two providers, DigitalOcean Managed Databases for MySQL vs. ScaleGrid MySQL hosting on DigitalOcean.
At a glance – TLDR
ScaleGrid Blog - At a glance overview - 1st pointCompare Throughput
ScaleGrid averages almost 40% higher throughput over DigitalOcean for MySQL, with up to 46% higher throughput in write-intensive workloads. Read now
ScaleGrid Blog - At a glance overview - 2nd pointCompare Latency
On average, ScaleGrid achieves almost 30% lower latency over DigitalOcean for the same deployment configurations. Read now
ScaleGrid Blog - At a glance overview - 3rd pointCompare Pricing
ScaleGrid provides 30% more storage on average vs. DigitalOcean for MySQL at the same affordable price. Read now
MySQL DigitalOcean Performance Benchmark
In this benchmark, we compare equivalent plan sizes between ScaleGrid MySQL on DigitalOcean and DigitalOcean Managed Databases for MySQL. We are going to use a common, popular plan size using the below configurations for this performance benchmark:
Comparison Overview
ScaleGridDigitalOceanInstance TypeMedium: 4 vCPUsMedium: 4 vCPUsMySQL Version8.0.208.0.20RAM8GB8GBSSD140GB115GBDeployment TypeStandaloneStandaloneRegionSF03SF03SupportIncludedBusiness-level support included with account sizes over $500/monthMonthly Price$120$120
As you can see above, ScaleGrid and DigitalOcean offer the same plan configurations across this plan size, apart from SSD where ScaleGrid provides over 20% more storage for the same price.
To ensure the most accurate results in our performance tests, we run the benchmark four times for each comparison to find the average performance across throughput and latency over read-intensive workloads, balanced workloads, and write-intensive workloads.
Throughput
In this benchmark, we measure MySQL throughput in terms of queries per second (QPS) to measure our query efficiency. To quickly summarize the results, we display read-intensive, write-intensive and balanced workload averages below for 150 threads for ScaleGrid vs. DigitalOcean MySQL:
ScaleGrid MySQL vs DigitalOcean Managed Databases - Throughput Performance Graph
For the common 150 thread comparison, ScaleGrid averages almost 40% higher throughput over DigitalOcean for MySQL, with up to 46% higher throughput in write-intensive workloads.
#cloud #database #developer #digital ocean #mysql #performance #scalegrid #95th percentile latency #balanced workloads #developers cloud #digitalocean droplet #digitalocean managed databases #digitalocean performance #digitalocean pricing #higher throughput #latency benchmark #lower latency #mysql benchmark setup #mysql client threads #mysql configuration #mysql digitalocean #mysql latency #mysql on digitalocean #mysql throughput #performance benchmark #queries per second #read-intensive #scalegrid mysql #scalegrid vs. digitalocean #throughput benchmark #write-intensive
1625637060
In this video, we work with JSONs, which are a common data format for most web services (i.e. APIs). Thank you for watching and happy coding!
Need some new tech gadgets or a new charger? Buy from my Amazon Storefront https://www.amazon.com/shop/blondiebytes
What is an API?
https://youtu.be/T74OdSCBJfw
JSON Google Extension
https://chrome.google.com/webstore/detail/json-formatter/bcjindcccaagfpapjjmafapmmgkkhgoa?hl=en
Endpoint Example
http://maps.googleapis.com/maps/api/geocode/json?address=13+East+60th+Street+New+York,+NY
Check out my courses on LinkedIn Learning!
REFERRAL CODE: https://linkedin-learning.pxf.io/blondiebytes
https://www.linkedin.com/learning/instructors/kathryn-hodge
Support me on Patreon!
https://www.patreon.com/blondiebytes
Check out my Python Basics course on Highbrow!
https://gohighbrow.com/portfolio/python-basics/
Check out behind-the-scenes and more tech tips on my Instagram!
https://instagram.com/blondiebytes/
Free HACKATHON MODE playlist:
https://open.spotify.com/user/12124758083/playlist/6cuse5033woPHT2wf9NdDa?si=VFe9mYuGSP6SUoj8JBYuwg
MY FAVORITE THINGS:
Stitch Fix Invite Code: https://www.stitchfix.com/referral/10013108?sod=w&som=c
FabFitFun Invite Code: http://xo.fff.me/h9-GH
Uber Invite Code: kathrynh1277ue
Postmates Invite Code: 7373F
SoulCycle Invite Code: https://www.soul-cycle.com/r/WY3DlxF0/
Rent The Runway: https://rtr.app.link/e/rfHlXRUZuO
Want to BINGE?? Check out these playlists…
Quick Code Tutorials: https://www.youtube.com/watch?v=4K4QhIAfGKY&index=1&list=PLcLMSci1ZoPu9ryGJvDDuunVMjwKhDpkB
Command Line: https://www.youtube.com/watch?v=Jm8-UFf8IMg&index=1&list=PLcLMSci1ZoPvbvAIn_tuSzMgF1c7VVJ6e
30 Days of Code: https://www.youtube.com/watch?v=K5WxmFfIWbo&index=2&list=PLcLMSci1ZoPs6jV0O3LBJwChjRon3lE1F
Intermediate Web Dev Tutorials: https://www.youtube.com/watch?v=LFa9fnQGb3g&index=1&list=PLcLMSci1ZoPubx8doMzttR2ROIl4uzQbK
GitHub | https://github.com/blondiebytes
Twitter | https://twitter.com/blondiebytes
LinkedIn | https://www.linkedin.com/in/blondiebytes
#jsons #json arrays #json objects #what is json #jsons tutorial #blondiebytes
1659553500
Mi artículo " SQL vs NoSQL: The Differences " señaló que la línea entre las bases de datos SQL y NoSQL se ha vuelto cada vez más borrosa, y cada campo adopta características del otro. Las bases de datos MySQL 5.7+ InnoDB y PostgreSQL 9.2+ admiten directamente tipos de documentos JSON en un solo campo. En este artículo, examinaremos la implementación JSON de MySQL 8.0 con más detalle.
Tenga en cuenta que cualquier base de datos aceptará documentos JSON como un blob de una sola cadena. Sin embargo, MySQL y PostgreSQL admiten datos JSON validados en pares clave/valor reales en lugar de una cadena básica.
… no sigue usted debe.
La normalización es una técnica utilizada para optimizar la estructura de la base de datos. La regla First Normal Form (1NF) rige que cada columna debe contener un solo valor, lo que claramente se rompe al almacenar documentos JSON de varios valores.
Si tiene requisitos de datos relacionales claros, utilice campos de valor único apropiados. JSON debe usarse con moderación como último recurso. Los campos de valor JSON no se pueden indexar, así que evite usarlo en columnas que se actualizan o buscan regularmente. Además, menos aplicaciones cliente admiten JSON y la tecnología es más nueva, por lo que podría ser menos estable que otros tipos.
Dicho esto, existen buenos casos de uso de JSON para datos escasamente poblados o atributos personalizados.
Considere una tienda que vende libros. Todos los libros tienen ID, ISBN, título, editorial, número de páginas y otros datos relacionales claros. Suponga que desea agregar cualquier número de etiquetas de categoría a cada libro. Podría lograr esto en SQL usando:
Funcionará, pero es un esfuerzo engorroso y considerable para una característica menor. Por lo tanto, puede definir un campo JSON de etiquetas en la tabla de libros de su base de datos MySQL :
CREATE TABLE `book` (
`id` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
`title` VARCHAR(200) NOT NULL,
`tags` JSON DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=INNODB;
Tenga en cuenta que las columnas JSON no pueden tener un valor predeterminado, usarse como clave principal, como clave externa o tener un índice. Puede crear índices secundarios en columnas virtuales generadas , pero es más fácil y práctico conservar un valor en un campo separado si se requieren índices.
Los documentos JSON completos se pueden pasar en declaraciones INSERT o UPDATE . Por ejemplo, nuestras etiquetas de libros se pueden pasar como una matriz (dentro de una cadena):
INSERT INTO `book` (`title`, `tags`)
VALUES (
'ECMAScript 2015: A SitePoint Anthology',
'["JavaScript", "ES2015", "JSON"]'
);
JSON también se puede crear con estos:
Función JSON_ARRAY() , que crea matrices. Por ejemplo:
Función JSON_OBJECT() , que crea objetos. Por ejemplo:
Función JSON_QUOTE() , que cita una cadena como un valor JSON. Por ejemplo:
(CAST anyValue AS JSON)
o puedes
La función JSON_TYPE() le permite verificar los tipos de valores JSON. Debe devolver OBJECT, ARRAY, un tipo escalar (INTEGER, BOOLEAN, etc.), NULL o un error. Por ejemplo:
-- returns ARRAY:
SELECT JSON_TYPE('[1, 2, "abc"]');
-- returns OBJECT:
SELECT JSON_TYPE('{"a": 1, "b": 2}');
-- returns an error:
SELECT JSON_TYPE('{"a": 1, "b": 2');
La función JSON_VALID() devuelve 1 si el JSON es válido o 0 en caso contrario:
-- returns 1:
SELECT JSON_TYPE('[1, 2, "abc"]');
-- returns 1:
SELECT JSON_TYPE('{"a": 1, "b": 2}');
-- returns 0:
SELECT JSON_TYPE('{"a": 1, "b": 2');
Intentar insertar un documento JSON no válido generará un error y no se insertará/actualizará todo el registro.
La función JSON_CONTAINS() acepta el documento JSON que se busca y otro con el que comparar. Devuelve 1 cuando se encuentra una coincidencia. Por ejemplo:
-- all books with the 'JavaScript' tag:
SELECT * FROM `book` WHERE JSON_CONTAINS(tags, '["JavaScript"]');
La función similar JSON_SEARCH() devuelve la ruta a la coincidencia dada o NULL cuando no hay ninguna coincidencia. Se pasa el documento JSON que se está buscando, 'one'
para encontrar la primera coincidencia, o 'all'
para encontrar todas las coincidencias, y una cadena de búsqueda (donde %
coincide con cualquier número de caracteres y _
coincide con un carácter de forma idéntica a LIKE
). Por ejemplo:
-- all books with tags starting 'Java':
SELECT * FROM `book` WHERE JSON_SEARCH(tags, 'one', 'Java%') IS NOT NULL;
Una ruta JSON apunta a valores y se puede usar para extraer o modificar partes de un documento JSON. La función JSON_EXTRACT() demuestra esto al extraer uno o más valores:
-- returns "SitePoint":
SELECT JSON_EXTRACT('{"id": 1, "website": "SitePoint"}', '$.website');
Todas las definiciones de ruta comienzan con un $
seguido de otros selectores:
$.website
[N]
donde N es la posición en una matriz indexada a cero.[*]
comodín evalúa todos los miembros de un objeto[*]
comodín evalúa todos los miembros de una matrizprefix**suffix
comodín evalúa todas las rutas que comienzan con el prefijo con nombre y terminan con el sufijo con nombreLos siguientes ejemplos hacen referencia al siguiente documento JSON:
{
"a": 1,
"b": 2,
"c": [3, 4],
"d": {
"e": 5,
"f": 6
}
}
Rutas de ejemplo:
$.a
devoluciones1
$.c
devoluciones[3, 4]
$.c[1]
devoluciones4
$.d.e
devoluciones5
$**.e
devoluciones[5]
Puede extraer el nombre y la primera etiqueta de su tabla de libros usando la consulta:
SELECT
title, tags->"$[0]" AS `tag1`
FROM `book`;
Para un ejemplo más complejo, suponga que tiene una tabla de usuario con datos de perfil JSON. Por ejemplo:
identificación | nombre | perfil |
---|---|---|
1 | craig | { “correo electrónico”: [“craig@email1.com”, “craig@email2.com”], “twitter”: “@craigbuckler” } |
2 | SitePoint | { “correo electrónico”: [], “twitter”: “@sitepointdotcom” } |
Puede extraer el nombre de Twitter mediante una ruta JSON. Por ejemplo:
SELECT
name, profile->"$.twitter" AS `twitter`
FROM `user`;
Podría usar una ruta JSON en la cláusula WHERE para devolver solo a los usuarios con una cuenta de Twitter:
SELECT
name, profile->"$.twitter" AS `twitter`
FROM `user`
WHERE
profile->"$.twitter" IS NOT NULL;
Hay varias funciones de MySQL para modificar partes de un documento JSON utilizando la notación de ruta. Éstos incluyen:
JSON_SET(doc, path, val[, path, val]...)
: inserta o actualiza datos en el documentoJSON_INSERT(doc, path, val[, path, val]...)
: inserta datos en el documentoJSON_REPLACE(doc, path, val[, path, val]...)
: reemplaza datos en el documentoJSON_MERGE(doc, doc[, doc]...)
: combina dos o más documentosJSON_ARRAY_APPEND(doc, path, val[, path, val]...)
: agrega valores al final de una matrizJSON_ARRAY_INSERT(doc, path, val[, path, val]...)
: inserta una matriz dentro del documentoJSON_REMOVE(doc, path[, path]...)
: elimina datos del documentoPor lo tanto, puede agregar una etiqueta "técnica" a cualquier libro que ya tenga una etiqueta "JavaScript":
UPDATE `book`
SET tags = JSON_MERGE(tags, '["technical"]')
WHERE
JSON_SEARCH(tags, 'one', 'JavaScript') IS NOT NULL;
El manual de MySQL proporciona más información sobre el tipo de datos JSON y las funciones JSON asociadas .
Nuevamente, le recomiendo que no use JSON a menos que sea absolutamente necesario. Podría emular una base de datos NoSQL completa orientada a documentos en MySQL, pero anularía muchos beneficios de SQL , ¡y también puede cambiar a un sistema NoSQL real! Dicho esto, los tipos de datos JSON pueden ahorrar esfuerzo para requisitos de datos más oscuros dentro de una aplicación SQL.
Fuente: https://www.sitepoint.com/use-json-data-fields-mysql-databases/
1595781840
MySQL does not limit the number of slaves that you can connect to the master server in a replication topology. However, as the number of slaves increases, they will have a toll on the master resources because the binary logs will need to be served to different slaves working at different speeds. If the data churn on the master is high, the serving of binary logs alone could saturate the network interface of the master.
A classic solution for this problem is to deploy a binlog server – an intermediate proxy server that sits between the master and its slaves. The binlog server is set up as a slave to the master, and in turn, acts as a master to the original set of slaves. It receives binary log events from the master, does not apply these events, but serves them to all the other slaves. This way, the load on the master is tremendously reduced, and at the same time, the binlog server serves the binlogs more efficiently to slaves since it does not have to do any other database server processing.
Ripple is an open source binlog server developed by Pavel Ivanov. A blog post from Percona, titled MySQL Ripple: The First Impression of a MySQL Binlog Server, gives a very good introduction to deploying and using Ripple. I had an opportunity to explore Ripple in some more detail and wanted to share my observations through this post.
Ripple supports only GTID mode, and not file and position-based replication. If your master is running in non-GTID mode, you will get this error from Ripple:
Failed to read packet: Got error reading packet from server: The replication sender thread cannot start in AUTO_POSITION mode: this server has GTID_MODE = OFF instead of ON.
You can specify Server_id and UUID for the ripple server using the cmd line options: -ripple_server_id and -ripple_server_uuid
Both are optional parameters, and if not specified, Ripple will use the default server_id=112211 and uuid will be auto generated.
While connecting to the master, you can specify the replication user and password using the command line options:
-ripple_master_user and -ripple_master_password
You can use the command line options -ripple_server_ports and -ripple_server_address to specify the connection end points for the Ripple server. Ensure to specify the network accessible hostname or IP address of your Ripple server as the -rippple_server_address. Otherwise, by default, Ripple will bind to localhost and hence you will not be able to connect to it remotely.
You can use the CHANGE MASTER TO command to connect your slaves to replicate from the Ripple server.
To ensure that Ripple can authenticate the password that you use to connect to it, you need to start Ripple by specifying the option -ripple_server_password_hash
For example, if you start the ripple server with the command:
rippled -ripple_datadir=./binlog_server -ripple_master_address= <master ip> -ripple_master_port=3306 -ripple_master_user=repl -ripple_master_password='password' -ripple_server_ports=15000 -ripple_server_address='172.31.23.201' -ripple_server_password_hash='EF8C75CB6E99A0732D2DE207DAEF65D555BDFB8E'
you can use the following CHANGE MASTER TO command to connect from the slave:
CHANGE MASTER TO master_host='172.31.23.201', master_port=15000, master_password=’XpKWeZRNH5#satCI’, master_user=’rep’
Note that the password hash specified for the Ripple server corresponds to the text password used in the CHANGE MASTER TO command. Currently, Ripple does not authenticate based on the usernames and accepts any non-empty username as long as the password matches.
Exploring MySQL Binlog Server - Ripple
It’s possible to monitor and manage the Ripple server using the MySQL protocol from any standard MySQL client. There are a limited set of commands that are supported which you can see directly in the source code on the mysql-ripple GitHub page.
Some of the useful commands are:
SELECT @@global.gtid_executed;
– To see the GTID SET of the Ripple server based on its downloaded binary logs.STOP SLAVE;
– To disconnect the Ripple server from the master.START SLAVE;
– To connect the Ripple server to the master.#cloud #database #developer #high availability #mysql #performance #binary logs #gtid replication #mysql binlog #mysql protocol #mysql ripple #mysql server #parallel threads #proxy server #replication topology #ripple server