{"id":4508,"date":"2018-01-25T12:11:24","date_gmt":"2018-01-25T20:11:24","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=4508"},"modified":"2023-08-29T11:55:09","modified_gmt":"2023-08-29T18:55:09","slug":"json-data-modeling-rdbms-users","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/json-data-modeling-rdbms-users\/","title":{"rendered":"Modelado de datos JSON para usuarios de RDBMS"},"content":{"rendered":"<div class=\"paragraph\">\n<p>El modelado de datos JSON es una parte vital del uso de una base de datos de documentos como <a href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/\">Couchbase<\/a>. M\u00e1s all\u00e1 de la comprensi\u00f3n de los conceptos b\u00e1sicos de JSON, hay dos enfoques clave para modelar las relaciones entre los datos que ser\u00e1n cubiertos en esta entrada del blog.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Los ejemplos de este post se basar\u00e1n en el ejemplo de facturas que mostr\u00e9 en <a href=\"https:\/\/www.couchbase.com\/blog\/es\/csv-migrating-couchbase-relational\/\">Herramientas CSV para migrar a Couchbase desde una base relacional<\/a>.<\/p>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_imported_data_refresher\">Actualizaci\u00f3n de datos importados<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>En el ejemplo anterior, part\u00ed de dos tablas de una base de datos relacional: Facturas e InvoicesItems. Cada partida de factura pertenece a una factura, lo que se hace con una clave ajena en una base de datos relacional.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Hice una importaci\u00f3n muy directa (ingenua) de estos datos a Couchbase. Cada fila se convirti\u00f3 en un documento en un bucket \"staging\".<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/01\/09601-imported-data.png\" alt=\"Data imported from CSV\" \/><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>A continuaci\u00f3n, debemos decidir si ese dise\u00f1o de modelado de datos JSON es apropiado o no (no creo que lo sea, como si el hecho de que el cubo se llame \"staging\" no lo delatara ya).<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_two_approaches_to_json_data_modeling_of_relationships\">Dos enfoques para el modelado de datos JSON de relaciones<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Con una base de datos relacional, s\u00f3lo hay una soluci\u00f3n: normalizar los datos. Esto significa tablas separadas con claves externas que unan los datos.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Con una base de datos de documentos, hay dos enfoques. Puede mantener los datos normalizados o puede desnormalizar los datos anid\u00e1ndolos en su documento padre.<\/p>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_normalized_separate_documents\">Normalizado (documentos separados)<\/h3>\n<div class=\"paragraph\">\n<p>Un ejemplo del estado final del <strong>normalizado<\/strong> representa una \u00fanica factura repartida en varios documentos:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-JavaScript\">key - invoice::1\r\n{ \"BillTo\": \"Lynn Hess\", \"InvoiceDate\": \"2018-01-15 00:00:00.000\", \"InvoiceNum\": \"ABC123\", \"ShipTo\": \"Herman Trisler, 4189 Oak Drive\" }\r\n\r\nkey - invoiceitem::1811cfcc-05b6-4ace-a52a-be3aad24dc52\r\n{ \"InvoiceId\": \"1\", \"Price\": \"1000.00\", \"Product\": \"Brake Pad\", \"Quantity\": \"24\" }\r\n\r\nkey - invoiceitem::29109f4a-761f-49a6-9b0d-f448627d7148\r\n{ \"InvoiceId\": \"1\", \"Price\": \"10.00\", \"Product\": \"Steering Wheel\", \"Quantity\": \"5\" }\r\n\r\nkey - invoiceitem::bf9d3256-9c8a-4378-877d-2a563b163d45\r\n{ \"InvoiceId\": \"1\", \"Price\": \"20.00\", \"Product\": \"Tire\", \"Quantity\": \"2\" }<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Esto coincide con la importaci\u00f3n directa de CSV. En <code>InvoiceId<\/code> de cada documento de factura es <em>similar<\/em> a la idea de una clave for\u00e1nea, pero ten en cuenta que Couchbase (y las bases de datos de documentos distribuidas en general) no imponen esta relaci\u00f3n de la misma manera que las bases de datos relacionales. Este es un compromiso hecho para satisfacer las necesidades de flexibilidad, escalabilidad y rendimiento de un sistema distribuido.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><em>Tenga en cuenta que, en este ejemplo, los documentos \"hijos\" apuntan al padre a trav\u00e9s de <code>InvoiceId<\/code>. Pero tambi\u00e9n podr\u00eda ser al rev\u00e9s: el documento \"padre\" podr\u00eda contener una matriz con las claves de cada documento \"hijo\".<\/em><\/p>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_denormalized_nested\">Desnormalizado (anidado)<\/h3>\n<div class=\"paragraph\">\n<p>El estado final del <strong>anidado<\/strong> se utilizar\u00eda un \u00fanico documento para representar una factura.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-JavaScript\">key - invoice::1\r\n{\r\n  \"BillTo\": \"Lynn Hess\",\r\n  \"InvoiceDate\": \"2018-01-15 00:00:00.000\",\r\n  \"InvoiceNum\": \"ABC123\",\r\n  \"ShipTo\": \"Herman Trisler, 4189 Oak Drive\",\r\n  \"Items\": [\r\n    { \"Price\": \"1000.00\", \"Product\": \"Brake Pad\", \"Quantity\": \"24\" },\r\n    { \"Price\": \"10.00\", \"Product\": \"Steering Wheel\", \"Quantity\": \"5\" },\r\n    { \"Price\": \"20.00\", \"Product\": \"Tire\", \"Quantity\": \"2\" }\r\n  ]\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Tenga en cuenta que \"InvoiceId\" ya no est\u00e1 presente en los objetos de la carpeta <code>Art\u00edculos<\/code> array. Estos datos ya no son extranjeros, ahora son nacionales, por lo que ese campo ya no es necesario.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_json_data_modeling_rules_of_thumb\">Reglas b\u00e1sicas del modelado de datos JSON<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Puede que ya est\u00e9 pensando que el <em>segundo<\/em> es una opci\u00f3n natural en este caso. Una factura en este sistema es una <a href=\"https:\/\/www.martinfowler.com\/bliki\/DDD_Aggregate.html\"><em>ra\u00edz agregada<\/em><\/a>. Sin embargo, no siempre es sencillo y obvio cu\u00e1ndo y c\u00f3mo elegir entre estos dos enfoques en su aplicaci\u00f3n.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>He aqu\u00ed algunas reglas generales sobre cu\u00e1ndo elegir cada modelo:<\/p>\n<\/div>\n<table class=\"tableblock frame-all grid-all spread\">\n<caption class=\"title\">Tabla 1. Ficha de datos de modelizaci\u00f3n<\/caption>\n<colgroup>\n<col style=\"width: 50%\" \/>\n<col style=\"width: 50%\" \/> <\/colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Si...<\/th>\n<th class=\"tableblock halign-left valign-top\">Entonces considera...<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">La relaci\u00f3n es de 1 a 1 o de 1 a muchos<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Objetos anidados<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">La relaci\u00f3n es muchos-a-1 o muchos-a-muchos<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Documentos separados<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Los datos le\u00eddos son en su mayor\u00eda campos padre<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Documento aparte<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Los datos le\u00eddos son en su mayor\u00eda campos padre + hijo<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Objetos anidados<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Las lecturas de datos son en su mayor\u00eda parentales <em>o<\/em> ni\u00f1o (no ambos)<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Documentos separados<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Las escrituras de datos son en su mayor\u00eda de los padres <em>y<\/em> ni\u00f1o (ambos)<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Objetos anidados<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div class=\"sect2\">\n<h3 id=\"_modeling_example\">Ejemplo de modelizaci\u00f3n<\/h3>\n<div class=\"paragraph\">\n<p>Para profundizar en este tema, hagamos algunas suposiciones sobre el sistema de facturaci\u00f3n que estamos construyendo.<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li>Un usuario suele ver la factura completa (incluidas las partidas de la factura)<\/li>\n<li>Cuando un usuario crea una factura (o realiza cambios), est\u00e1 actualizando tanto los campos \"ra\u00edz\" como los \"art\u00edculos\" juntos<\/li>\n<li>Existen <em>algunos<\/em> consultas (pero no muchas) en el sistema que s\u00f3lo se interesan por los datos ra\u00edz de la factura e ignoran los campos \"art\u00edculos\".<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>Entonces, bas\u00e1ndonos en ese conocimiento, sabemos que:<\/p>\n<\/div>\n<div class=\"olist arabic\">\n<ol class=\"arabic\">\n<li>La relaci\u00f3n es de 1 a muchos (una sola factura tiene muchos art\u00edculos)<\/li>\n<li>Las lecturas de datos son <em>sobre todo<\/em> campos padre + hijo juntos<\/li>\n<\/ol>\n<\/div>\n<div class=\"paragraph\">\n<p>Por tanto, los \"objetos anidados\" parecen el dise\u00f1o adecuado.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Recuerde que no se trata de reglas r\u00edgidas que se apliquen siempre. Son simplemente directrices que le ayudar\u00e1n a empezar. La \u00fanica \"mejor pr\u00e1ctica\" es utilizar tus propios conocimientos y experiencia.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_transforming_staging_data_with_n1ql\">Transformaci\u00f3n de datos de puesta en escena con N1QL<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Ahora que hemos hecho algunos ejercicios de modelado de datos JSON, es el momento de transformar los datos en el cubo de preparaci\u00f3n de documentos separados que vinieron directamente de la base de datos relacional al dise\u00f1o de objetos anidados.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Hay muchos enfoques para esto, pero voy a mantenerlo muy simple y utilizar el potente Couchbase <a href=\"https:\/\/www.couchbase.com\/blog\/es\/products\/n1ql\/\">Lenguaje N1QL<\/a> para ejecutar consultas SQL en datos JSON.<\/p>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_preparing_the_data\">Preparaci\u00f3n de los datos<\/h3>\n<div class=\"paragraph\">\n<p>En primer lugar, cree un bucket de \"operaci\u00f3n\". Voy a transformar los datos y moverlos desde el cubo \"staging\" (que contiene los datos directos de la base de datos) al cubo \"operaci\u00f3n\". <a href=\"https:\/\/www.couchbase.com\/blog\/es\/csv-migrating-couchbase-relational\/\">Importaci\u00f3n CSV<\/a>) al cubo \"operaci\u00f3n\".<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>A continuaci\u00f3n, voy a marcar los documentos \"ra\u00edz\" con un campo \"tipo\". Esta es una forma de marcar los documentos como de un tipo determinado, y ser\u00e1 \u00fatil m\u00e1s adelante.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-SQL\">UPDATE staging\r\nSET type = 'invoice'\r\nWHERE InvoiceNum IS NOT MISSING;<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>S\u00e9 que los documentos ra\u00edz tienen un campo llamado \"InvoiceNum\" y que los art\u00edculos no tienen este campo. As\u00ed que esta es una forma segura de diferenciar.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>A continuaci\u00f3n, tengo que modificar los elementos. Anteriormente ten\u00edan una clave externa que era s\u00f3lo un n\u00famero. Ahora esos valores deben actualizarse para que apunten a la nueva clave de documento.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-SQL\">UPDATE staging s\r\nSET s.InvoiceId = 'invoice::' || s.InvoiceId;<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Se trata simplemente de a\u00f1adir \"invoice::\" al valor. Tenga en cuenta que los documentos ra\u00edz no tienen un campo InvoiceId, por lo que no se ver\u00e1n afectados por esta consulta.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Despu\u00e9s de esto, necesito crear un \u00edndice en ese campo.<\/p>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_preparing_an_index\">Preparar un \u00edndice<\/h3>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-SQL\">CREATE INDEX ix_invoiceid ON staging(InvoiceId);<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Este \u00edndice ser\u00e1 necesario para la pr\u00f3xima uni\u00f3n transformacional.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Ahora, antes de hacer operativos estos datos, vamos a ejecutar un <code>SELECCIONE<\/code> para obtener una vista previa y asegurarnos de que los datos se van a unir como esperamos. Utilice N1QL <code>NEST<\/code> operaci\u00f3n:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-SQL\">SELECT i.*, t AS Items\r\nFROM staging AS i\r\nNEST staging AS t ON KEY t.InvoiceId FOR i\r\nWHERE i.type = 'invoice';<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>El resultado de esta consulta deber\u00eda ser un total de tres documentos de factura ra\u00edz.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/01\/09603-result-of-select-transform.png\" alt=\"Results of transformation with N1QL\" \/><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Los elementos de la factura deber\u00edan estar ahora anidados en una matriz \"Elementos\" dentro de su factura principal (los he contra\u00eddo en la captura de pantalla anterior en aras de la brevedad).<\/p>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_moving_the_data_out_of_staging\">Mover los datos fuera de la puesta en escena<\/h3>\n<div class=\"paragraph\">\n<p>Una vez que haya verificado que todo parece correcto, puede mover los datos al cubo de \"operaciones\" mediante un comando <code>INSERTAR<\/code> que no ser\u00e1 m\u00e1s que una ligera variaci\u00f3n del comando anterior <code>SELECCIONE<\/code> mando.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-SQL\">INSERT INTO operation (KEY k, VALUE v)\r\nSELECT META(i).id AS k, { i.BillTo, i.InvoiceDate, i.InvoiceNum, \"Items\": t } AS v\r\nFROM staging i\r\nNEST staging t ON KEY t.InvoiceId FOR i\r\nwhere i.type = 'invoice';<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Si eres nuevo en N1QL, hay un par de cosas que se\u00f1alar aqu\u00ed:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><code>INSERTAR<\/code> utilizar\u00e1 siempre <code>CLAVE<\/code> y <code>VALOR<\/code>. En esta cl\u00e1usula no se enumeran todos los campos, como se har\u00eda en una base de datos relacional.<\/li>\n<li><code>META(i).id<\/code> es una forma de acceder a la clave de un documento<\/li>\n<li>La sintaxis literal JSON que se SELECCIONA COMO v es una forma de especificar los campos sobre los que se desea pasar. Aqu\u00ed se podr\u00edan utilizar comodines.<\/li>\n<li><code>NEST<\/code> es un tipo de uni\u00f3n que anidar\u00e1 los datos en una matriz en lugar de en el nivel ra\u00edz.<\/li>\n<li><code>PARA i<\/code> especifica el lado izquierdo del <code>EN LA LLAVE<\/code> join. Esta sintaxis es probablemente la parte menos est\u00e1ndar de N1QL, pero la pr\u00f3xima versi\u00f3n de Couchbase Server incluir\u00e1 la funcionalidad \"ANSI JOIN\" que ser\u00e1 mucho m\u00e1s natural de leer y escribir.<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>Despu\u00e9s de ejecutar esta consulta, deber\u00eda tener un total de 3 documentos en su bucket \"operaci\u00f3n\" que representan 3 facturas.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2018\/01\/09602-result-from-n1ql-modeling.png\" alt=\"Result from JSON data modeling transformation\" \/><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Puede eliminar o vaciar el cubo de almacenamiento, ya que ahora contiene datos obsoletos. O puedes conservarlo para seguir experimentando.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_summary\">Resumen<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Migrar datos directamente a Couchbase Server puede ser tan f\u00e1cil como importar v\u00eda CSV y transformar con unas pocas l\u00edneas de N1QL. Hacer el modelado real y tomar decisiones requiere m\u00e1s tiempo y reflexi\u00f3n. Una vez que decidas c\u00f3mo modelar, N1QL te da la flexibilidad para transformar datos relacionales planos y dispersos en un modelo de documentos orientado a la agregaci\u00f3n.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>M\u00e1s recursos:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/es\/sql-to-json-data-modeling-hackolade\/\">Uso de Hackolade<\/a> para colaborar en el modelado de datos JSON.<\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/es\/moving-from-sql-server-to-couchbase-part-1-data-modeling\/\">Parte de la serie SQL Server<\/a> aborda el mismo tipo de decisiones de modelado de datos JSON<\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/es\/comparing-couchbase-vs-oracle\/\">C\u00f3mo Couchbase supera a Oracle<\/a>si est\u00e1 pensando en trasladar algunos de sus datos fuera de Oracle<\/li>\n<li><a href=\"https:\/\/resources.couchbase.com\/c\/relational-no-sql-wp?x=Y7B0ca\">Pasar de Relational a NoSQL: C\u00f3mo empezar<\/a> libro blanco.<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>No dude en ponerse en contacto conmigo si tiene alguna pregunta o necesita ayuda. Soy<br \/>\n<a href=\"https:\/\/twitter.com\/mgroves\">@mgroves<\/a> en Twitter. Tambi\u00e9n puede hacer preguntas en <a href=\"https:\/\/www.couchbase.com\/blog\/es\/forums\/\">Foros de Couchbase<\/a>. Hay expertos en N1QL all\u00ed que son muy receptivos y pueden ayudarte a escribir el N1QL para acomodar tu modelado de datos JSON.<\/p>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>JSON data modeling is a vital part of using a document database like Couchbase. Beyond understanding the basics of JSON, there are two key approaches to modeling relationships between data that will be covered in this blog post. The examples [&hellip;]<\/p>","protected":false},"author":71,"featured_media":3251,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816,1819],"tags":[1261,1593,1592,1857,1556],"ppma_author":[8937],"class_list":["post-4508","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","category-data-modeling","tag-json","tag-modeling","tag-oracle","tag-relational","tag-sql-server"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.7.1 (Yoast SEO v25.7) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>JSON Data Modeling to RDBMS Users Using Document Database<\/title>\n<meta name=\"description\" content=\"JSON data modeling is a vital part of using a document database like Couchbase. This blog will cover 2 approaches to data modeling relationships.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/json-data-modeling-rdbms-users\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JSON Data Modeling for RDBMS Users\" \/>\n<meta property=\"og:description\" content=\"JSON data modeling is a vital part of using a document database like Couchbase. This blog will cover 2 approaches to data modeling relationships.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/json-data-modeling-rdbms-users\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2018-01-25T20:11:24+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-29T18:55:09+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/04\/064-hero-model.png\" \/>\n\t<meta property=\"og:image:width\" content=\"2048\" \/>\n\t<meta property=\"og:image:height\" content=\"1024\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Matthew Groves\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@mgroves\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Matthew Groves\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/\"},\"author\":{\"name\":\"Matthew Groves\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58\"},\"headline\":\"JSON Data Modeling for RDBMS Users\",\"datePublished\":\"2018-01-25T20:11:24+00:00\",\"dateModified\":\"2023-08-29T18:55:09+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/\"},\"wordCount\":1339,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/064-hero-model.png\",\"keywords\":[\"JSON\",\"modeling\",\"oracle\",\"relational\",\"SQL Server\"],\"articleSection\":[\"Couchbase Server\",\"Data Modeling\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/\",\"name\":\"JSON Data Modeling to RDBMS Users Using Document Database\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/064-hero-model.png\",\"datePublished\":\"2018-01-25T20:11:24+00:00\",\"dateModified\":\"2023-08-29T18:55:09+00:00\",\"description\":\"JSON data modeling is a vital part of using a document database like Couchbase. This blog will cover 2 approaches to data modeling relationships.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/064-hero-model.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/064-hero-model.png\",\"width\":2048,\"height\":1024,\"caption\":\"Glass ochem by Purpy Pupple, licensed through Creative Commons https:\/\/commons.wikimedia.org\/wiki\/File:Glass_ochem.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JSON Data Modeling for RDBMS Users\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58\",\"name\":\"Matthew Groves\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"caption\":\"Matthew Groves\"},\"description\":\"Matthew D. Groves is a guy who loves to code. It doesn't matter if it's C#, jQuery, or PHP: he'll submit pull requests for anything. He has been coding professionally ever since he wrote a QuickBASIC point-of-sale app for his parent's pizza shop back in the 90s. He currently works as a Senior Product Marketing Manager for Couchbase. His free time is spent with his family, watching the Reds, and getting involved in the developer community. He is the author of AOP in .NET, Pro Microservices in .NET, a Pluralsight author, and a Microsoft MVP.\",\"sameAs\":[\"https:\/\/crosscuttingconcerns.com\",\"https:\/\/x.com\/mgroves\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/matthew-groves\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"JSON Data Modeling to RDBMS Users Using Document Database","description":"JSON data modeling is a vital part of using a document database like Couchbase. This blog will cover 2 approaches to data modeling relationships.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/json-data-modeling-rdbms-users\/","og_locale":"es_MX","og_type":"article","og_title":"JSON Data Modeling for RDBMS Users","og_description":"JSON data modeling is a vital part of using a document database like Couchbase. This blog will cover 2 approaches to data modeling relationships.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/json-data-modeling-rdbms-users\/","og_site_name":"The Couchbase Blog","article_published_time":"2018-01-25T20:11:24+00:00","article_modified_time":"2023-08-29T18:55:09+00:00","og_image":[{"width":2048,"height":1024,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/04\/064-hero-model.png","type":"image\/png"}],"author":"Matthew Groves","twitter_card":"summary_large_image","twitter_creator":"@mgroves","twitter_misc":{"Written by":"Matthew Groves","Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/"},"author":{"name":"Matthew Groves","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58"},"headline":"JSON Data Modeling for RDBMS Users","datePublished":"2018-01-25T20:11:24+00:00","dateModified":"2023-08-29T18:55:09+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/"},"wordCount":1339,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/064-hero-model.png","keywords":["JSON","modeling","oracle","relational","SQL Server"],"articleSection":["Couchbase Server","Data Modeling"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/","url":"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/","name":"JSON Data Modeling to RDBMS Users Using Document Database","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/064-hero-model.png","datePublished":"2018-01-25T20:11:24+00:00","dateModified":"2023-08-29T18:55:09+00:00","description":"JSON data modeling is a vital part of using a document database like Couchbase. This blog will cover 2 approaches to data modeling relationships.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/064-hero-model.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/04\/064-hero-model.png","width":2048,"height":1024,"caption":"Glass ochem by Purpy Pupple, licensed through Creative Commons https:\/\/commons.wikimedia.org\/wiki\/File:Glass_ochem.png"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"JSON Data Modeling for RDBMS Users"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58","name":"Matthew Groves","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54","url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","caption":"Matthew Groves"},"description":"A Matthew D. Groves le encanta programar. No importa si se trata de C#, jQuery o PHP: enviar\u00e1 pull requests para cualquier cosa. Lleva codificando profesionalmente desde que escribi\u00f3 una aplicaci\u00f3n de punto de venta en QuickBASIC para la pizzer\u00eda de sus padres, all\u00e1 por los a\u00f1os noventa. Actualmente trabaja como Director de Marketing de Producto para Couchbase. Su tiempo libre lo pasa con su familia, viendo a los Reds y participando en la comunidad de desarrolladores. Es autor de AOP in .NET, Pro Microservices in .NET, autor de Pluralsight y MVP de Microsoft.","sameAs":["https:\/\/crosscuttingconcerns.com","https:\/\/x.com\/mgroves"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/matthew-groves\/"}]}},"authors":[{"term_id":8937,"user_id":71,"is_guest":0,"slug":"matthew-groves","display_name":"Matthew Groves","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","first_name":"Matthew","last_name":"Groves","user_url":"https:\/\/crosscuttingconcerns.com","author_category":"","description":"A Matthew D. Groves le encanta programar.  No importa si se trata de C#, jQuery o PHP: enviar\u00e1 pull requests para cualquier cosa.  Lleva codificando profesionalmente desde que escribi\u00f3 una aplicaci\u00f3n de punto de venta en QuickBASIC para la pizzer\u00eda de sus padres, all\u00e1 por los a\u00f1os noventa.  Actualmente trabaja como Director de Marketing de Producto para Couchbase. Su tiempo libre lo pasa con su familia, viendo a los Reds y participando en la comunidad de desarrolladores.  Es autor de AOP in .NET, Pro Microservices in .NET, autor de Pluralsight y MVP de Microsoft."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/4508","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/71"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=4508"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/4508\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/3251"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=4508"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=4508"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=4508"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=4508"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}