Thierry  Perret

Thierry Perret

1659549600

Utiliser Les Champs De Données JSON Dans Les Bases De Données MySQL

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.

Juste parce que vous pouvez stocker du JSON…

… 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.

Créer une table avec un champ JSON

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 :

  1. une table de balises qui stocke chaque nom de balise avec un identifiant unique, et
  2. une table tagmap avec des enregistrements plusieurs-à-plusieurs mappant les ID de livre aux ID de balise

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.

Ajout de données JSON

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.

Recherche de données JSON

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;

Chemins JSON

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 :

  • un point suivi d'un nom, tel que$.website
  • [N]où N est la position dans un tableau indexé à zéro
  • le .[*]joker évalue tous les membres d'un objet
  • le [*]joker évalue tous les membres d'un tableau
  • le prefix**suffixcaractè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 :

  • $.aRetour1
  • $.cRetour[3, 4]
  • $.c[1]Retour4
  • $.d.eRetour5
  • $**.eRetour[5]

Extraction des chemins JSON dans les requêtes

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:

identifiantNomprofil
1Craig{ « e-mail » : [« craig@email1.com », « craig@email2.com »], « twitter » : « @craigbuckler » }
2SitePoint{ "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;

Modification d'une partie d'un document JSON

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 document
  • JSON_INSERT(doc, path, val[, path, val]...): insère des données dans le document
  • JSON_REPLACE(doc, path, val[, path, val]...): remplace les données dans le document
  • JSON_MERGE(doc, doc[, doc]...): fusionne deux ou plusieurs documents
  • JSON_ARRAY_APPEND(doc, path, val[, path, val]...): ajoute des valeurs à la fin d'un tableau
  • JSON_ARRAY_INSERT(doc, path, val[, path, val]...): insère un tableau dans le document
  • JSON_REMOVE(doc, path[, path]...): supprime les données du document

Vous 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;

Informations complémentaires

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/

#mysql #database #json 

What is GEEK

Buddha Community

Utiliser Les Champs De Données JSON Dans Les Bases De Données MySQL
Thierry  Perret

Thierry Perret

1659549600

Utiliser Les Champs De Données JSON Dans Les Bases De Données MySQL

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.

Juste parce que vous pouvez stocker du JSON…

… 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.

Créer une table avec un champ JSON

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 :

  1. une table de balises qui stocke chaque nom de balise avec un identifiant unique, et
  2. une table tagmap avec des enregistrements plusieurs-à-plusieurs mappant les ID de livre aux ID de balise

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.

Ajout de données JSON

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.

Recherche de données JSON

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;

Chemins JSON

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 :

  • un point suivi d'un nom, tel que$.website
  • [N]où N est la position dans un tableau indexé à zéro
  • le .[*]joker évalue tous les membres d'un objet
  • le [*]joker évalue tous les membres d'un tableau
  • le prefix**suffixcaractè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 :

  • $.aRetour1
  • $.cRetour[3, 4]
  • $.c[1]Retour4
  • $.d.eRetour5
  • $**.eRetour[5]

Extraction des chemins JSON dans les requêtes

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:

identifiantNomprofil
1Craig{ « e-mail » : [« craig@email1.com », « craig@email2.com »], « twitter » : « @craigbuckler » }
2SitePoint{ "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;

Modification d'une partie d'un document JSON

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 document
  • JSON_INSERT(doc, path, val[, path, val]...): insère des données dans le document
  • JSON_REPLACE(doc, path, val[, path, val]...): remplace les données dans le document
  • JSON_MERGE(doc, doc[, doc]...): fusionne deux ou plusieurs documents
  • JSON_ARRAY_APPEND(doc, path, val[, path, val]...): ajoute des valeurs à la fin d'un tableau
  • JSON_ARRAY_INSERT(doc, path, val[, path, val]...): insère un tableau dans le document
  • JSON_REMOVE(doc, path[, path]...): supprime les données du document

Vous 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;

Informations complémentaires

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/

#mysql #database #json 

Joe  Hoppe

Joe Hoppe

1595905879

Best MySQL DigitalOcean Performance – ScaleGrid vs. DigitalOcean Managed Databases

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

Brandon  Adams

Brandon Adams

1625637060

What is JSON? | JSON Objects and JSON Arrays | Working with JSONs Tutorial

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

Cómo Usar Campos De Datos JSON En Bases De Datos MySQL

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.

Solo porque puedes almacenar JSON...

… 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.

Crear una tabla con un campo JSON

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:

  1. una tabla de etiquetas que almacenó cada nombre de etiqueta con una identificación única, y
  2. una tabla de mapa de etiquetas con registros de muchos a muchos que asignan ID de libros a ID de etiquetas

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.

Adición de datos JSON

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.

Búsqueda de datos JSON

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;

Rutas JSON

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:

  • un punto seguido de un nombre, como$.website
  • [N]donde N es la posición en una matriz indexada a cero
  • el .[*]comodín evalúa todos los miembros de un objeto
  • el [*]comodín evalúa todos los miembros de una matriz
  • el prefix**suffixcomodín evalúa todas las rutas que comienzan con el prefijo con nombre y terminan con el sufijo con nombre

Los siguientes ejemplos hacen referencia al siguiente documento JSON:

{
  "a": 1,
  "b": 2,
  "c": [3, 4],
  "d": {
    "e": 5,
    "f": 6
  }
}

Rutas de ejemplo:

  • $.adevoluciones1
  • $.cdevoluciones[3, 4]
  • $.c[1]devoluciones4
  • $.d.edevoluciones5
  • $**.edevoluciones[5]

Extracción de rutas JSON en consultas

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ónnombreperfil
1craig{ “correo electrónico”: [“craig@email1.com”, “craig@email2.com”], “twitter”: “@craigbuckler” }
2SitePoint{ “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;

Modificación de parte de un documento JSON

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 documento
  • JSON_INSERT(doc, path, val[, path, val]...): inserta datos en el documento
  • JSON_REPLACE(doc, path, val[, path, val]...): reemplaza datos en el documento
  • JSON_MERGE(doc, doc[, doc]...): combina dos o más documentos
  • JSON_ARRAY_APPEND(doc, path, val[, path, val]...): agrega valores al final de una matriz
  • JSON_ARRAY_INSERT(doc, path, val[, path, val]...): inserta una matriz dentro del documento
  • JSON_REMOVE(doc, path[, path]...): elimina datos del documento

Por 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;

Más información

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/

#mysql #database #json 

Loma  Baumbach

Loma Baumbach

1595781840

Exploring MySQL Binlog Server - Ripple

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.

MySQL Binlog Server Deployment Diagram - ScaleGrid Blog

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.

1. Support for GTID based replication

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.

2. Connecting to the master using replication user and password

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

3. Connection endpoint for the Ripple server

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.

4. Setting up slaves to the Ripple server

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

CLICK TO TWEET

5. Ripple server management

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