{"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\/pt\/json-data-modeling-rdbms-users\/","title":{"rendered":"Modelagem de dados JSON para usu\u00e1rios de RDBMS"},"content":{"rendered":"<div class=\"paragraph\">\n<p>A modelagem de dados JSON \u00e9 uma parte essencial do uso de um banco de dados de documentos como o <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/downloads\/\">Couchbase<\/a>. Al\u00e9m de entender os conceitos b\u00e1sicos de JSON, h\u00e1 duas abordagens principais para modelar relacionamentos entre dados que ser\u00e3o abordados nesta postagem do blog.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Os exemplos nesta postagem ser\u00e3o baseados no exemplo de faturas que mostrei em <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/csv-migrating-couchbase-relational\/\">Ferramenta CSV para migrar do Relacional para o Couchbase<\/a>.<\/p>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_imported_data_refresher\">Atualiza\u00e7\u00e3o de dados importados<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>No exemplo anterior, comecei com duas tabelas de um banco de dados relacional: Invoices (faturas) e InvoicesItems (itens de faturas). Cada item de fatura pertence a uma fatura, o que \u00e9 feito com uma chave estrangeira em um banco de dados relacional.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Fiz uma importa\u00e7\u00e3o muito simples (ing\u00eanua) desses dados para o Couchbase. Cada linha se tornou um documento em um bucket de \"prepara\u00e7\u00e3o\".<\/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>Em seguida, precisamos decidir se esse design de modelagem de dados JSON \u00e9 adequado ou n\u00e3o (acho que n\u00e3o \u00e9, como se o balde chamado \"staging\" j\u00e1 n\u00e3o tivesse revelado isso).<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_two_approaches_to_json_data_modeling_of_relationships\">Duas abordagens para a modelagem de dados JSON de relacionamentos<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Com um banco de dados relacional, h\u00e1 apenas uma abordagem: normalizar seus dados. Isso significa tabelas separadas com chaves estrangeiras que vinculam os dados entre si.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Com um banco de dados de documentos, h\u00e1 duas abordagens. Voc\u00ea pode manter os dados normalizados ou pode desnormaliz\u00e1-los aninhando-os em seu documento pai.<\/p>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_normalized_separate_documents\">Normalizado (documentos separados)<\/h3>\n<div class=\"paragraph\">\n<p>Um exemplo do estado final do <strong>normalizado<\/strong> representa uma \u00fanica fatura distribu\u00edda em v\u00e1rios 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>Isso est\u00e1 alinhado com a importa\u00e7\u00e3o direta de CSV. O <code>InvoiceId<\/code> em cada documento de item de fatura \u00e9 <em>semelhante<\/em> O Couchbase \u00e9 um banco de dados de documentos distribu\u00eddo, mas observe que o Couchbase (e os bancos de dados de documentos distribu\u00eddos em geral) n\u00e3o imp\u00f5e esse relacionamento da mesma forma que os bancos de dados relacionais. Essa \u00e9 uma troca feita para satisfazer as necessidades de flexibilidade, escalabilidade e desempenho de um sistema distribu\u00eddo.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><em>Observe que, neste exemplo, os documentos \"filhos\" apontam para o pai por meio de <code>InvoiceId<\/code>. Mas tamb\u00e9m poderia ser o contr\u00e1rio: o documento \"pai\" poderia conter uma matriz das chaves de cada documento \"filho\".<\/em><\/p>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_denormalized_nested\">Desnormalizado (aninhado)<\/h3>\n<div class=\"paragraph\">\n<p>O estado final do <strong>aninhado<\/strong> A abordagem de um documento \u00fanico para representar uma fatura.<\/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>Observe que o \"InvoiceId\" n\u00e3o est\u00e1 mais presente nos objetos da tabela <code>Itens<\/code> array. Esses dados n\u00e3o s\u00e3o mais estrangeiros - agora s\u00e3o nacionais -, portanto, esse campo n\u00e3o \u00e9 mais necess\u00e1rio.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_json_data_modeling_rules_of_thumb\">Regras b\u00e1sicas de modelagem de dados JSON<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Voc\u00ea j\u00e1 deve estar pensando que o <em>segundo<\/em> \u00e9 uma op\u00e7\u00e3o natural nesse caso. Uma fatura nesse sistema \u00e9 uma op\u00e7\u00e3o natural <a href=\"https:\/\/www.martinfowler.com\/bliki\/DDD_Aggregate.html\"><em>raiz agregada<\/em><\/a>. No entanto, nem sempre \u00e9 simples e \u00f3bvio quando e como escolher entre essas duas abordagens em seu aplicativo.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Aqui est\u00e3o algumas regras de ouro para saber quando escolher cada modelo:<\/p>\n<\/div>\n<table class=\"tableblock frame-all grid-all spread\">\n<caption class=\"title\">Tabela 1. Folha de consulta de dados de modelagem<\/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\">Se ...<\/th>\n<th class=\"tableblock halign-left valign-top\">Ent\u00e3o, considere...<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">O relacionamento \u00e9 de 1 para 1 ou de 1 para muitos<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Objetos aninhados<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">O relacionamento \u00e9 de muitos para 1 ou de muitos para muitos<\/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\">As leituras de dados s\u00e3o, em sua maioria, campos pai<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Documento separado<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">As leituras de dados s\u00e3o, em sua maioria, campos pai + filho<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Objetos aninhados<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">As leituras de dados s\u00e3o, em sua maioria, parentais <em>ou<\/em> filho (n\u00e3o 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\">As grava\u00e7\u00f5es de dados s\u00e3o, em sua maioria, pai <em>e<\/em> crian\u00e7a (ambos)<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Objetos aninhados<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div class=\"sect2\">\n<h3 id=\"_modeling_example\">Exemplo de modelagem<\/h3>\n<div class=\"paragraph\">\n<p>Para explorar isso mais a fundo, vamos fazer algumas suposi\u00e7\u00f5es sobre o sistema de faturas que estamos criando.<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li>Um usu\u00e1rio geralmente visualiza a fatura inteira (incluindo os itens da fatura)<\/li>\n<li>Quando um usu\u00e1rio cria uma fatura (ou faz altera\u00e7\u00f5es), ele atualiza os campos \"raiz\" e os \"itens\" juntos<\/li>\n<li>Existem <em>alguns<\/em> consultas (mas n\u00e3o muitas) no sistema que se preocupam apenas com os dados raiz da fatura e ignoram os campos \"itens\"<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>Ent\u00e3o, com base nesse conhecimento, sabemos que:<\/p>\n<\/div>\n<div class=\"olist arabic\">\n<ol class=\"arabic\">\n<li>A rela\u00e7\u00e3o \u00e9 de 1 para muitos (uma \u00fanica fatura tem muitos itens)<\/li>\n<li>As leituras de dados s\u00e3o <em>principalmente<\/em> campos pai + filho juntos<\/li>\n<\/ol>\n<\/div>\n<div class=\"paragraph\">\n<p>Portanto, \"objetos aninhados\" parece ser o design correto.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Lembre-se de que essas n\u00e3o s\u00e3o regras r\u00edgidas e r\u00e1pidas que sempre ser\u00e3o aplicadas. Elas s\u00e3o apenas diretrizes para ajud\u00e1-lo a come\u00e7ar. A \u00fanica \"pr\u00e1tica recomendada\" \u00e9 usar seu pr\u00f3prio conhecimento e experi\u00eancia.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_transforming_staging_data_with_n1ql\">Transforma\u00e7\u00e3o de dados de prepara\u00e7\u00e3o com N1QL<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Agora que fizemos alguns exerc\u00edcios de modelagem de dados JSON, \u00e9 hora de transformar os dados no bucket de teste de documentos separados que vieram diretamente do banco de dados relacional para o design de objetos aninhados.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>H\u00e1 muitas abordagens para isso, mas vou mant\u00ea-las bem simples e usar o poderoso recurso do Couchbase <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/products\/n1ql\/\">Linguagem N1QL<\/a> para executar consultas SQL em dados JSON.<\/p>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_preparing_the_data\">Preparando os dados<\/h3>\n<div class=\"paragraph\">\n<p>Primeiro, crie um bucket de \"opera\u00e7\u00e3o\". Vou transformar os dados e mov\u00ea-los para o bucket \"staging\" (que cont\u00e9m os dados diretos da opera\u00e7\u00e3o). <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/csv-migrating-couchbase-relational\/\">Importa\u00e7\u00e3o de CSV<\/a>) para o compartimento \"opera\u00e7\u00e3o\".<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Em seguida, vou marcar os documentos \"raiz\" com um campo \"tipo\". Essa \u00e9 uma maneira de marcar os documentos como sendo de um determinado tipo e ser\u00e1 \u00fatil mais tarde.<\/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>Sei que os documentos raiz t\u00eam um campo chamado \"InvoiceNum\" e que os itens n\u00e3o t\u00eam esse campo. Portanto, essa \u00e9 uma maneira segura de diferenciar.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Em seguida, preciso modificar os itens. Anteriormente, eles tinham uma chave estrangeira que era apenas um n\u00famero. Agora, esses valores devem ser atualizados para apontar para a nova chave do 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>Isso \u00e9 apenas acrescentar \"invoice::\" ao valor. Observe que os documentos raiz n\u00e3o t\u00eam um campo InvoiceId, portanto, eles n\u00e3o ser\u00e3o afetados por essa consulta.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Depois disso, preciso criar um \u00edndice nesse campo.<\/p>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_preparing_an_index\">Prepara\u00e7\u00e3o de um \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>Esse \u00edndice ser\u00e1 necess\u00e1rio para a uni\u00e3o transformacional que vir\u00e1 a seguir.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Agora, antes de tornar esses dados operacionais, vamos executar um <code>SELECIONAR<\/code> para obter uma visualiza\u00e7\u00e3o e garantir que os dados ser\u00e3o unidos da forma esperada. Use a fun\u00e7\u00e3o <code>NEST<\/code> opera\u00e7\u00e3o:<\/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>O resultado dessa consulta deve ser um total de tr\u00eas documentos de fatura raiz.<\/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>Os itens da fatura agora devem ser aninhados em uma matriz \"Items\" dentro da fatura principal (eu os coloquei em colapso na captura de tela acima por uma quest\u00e3o de brevidade).<\/p>\n<\/div>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_moving_the_data_out_of_staging\">Mover os dados para fora da prepara\u00e7\u00e3o<\/h3>\n<div class=\"paragraph\">\n<p>Depois de verificar se isso est\u00e1 correto, os dados podem ser movidos para o bucket de \"opera\u00e7\u00e3o\" usando um <code>INSERIR<\/code> que ser\u00e1 apenas uma pequena varia\u00e7\u00e3o do comando acima <code>SELECIONAR<\/code> comando.<\/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>Se voc\u00ea \u00e9 novo no N1QL, h\u00e1 algumas coisas que devem ser destacadas aqui:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><code>INSERIR<\/code> sempre usar\u00e1 <code>CHAVE<\/code> e <code>VALOR<\/code>. Voc\u00ea n\u00e3o lista todos os campos nessa cl\u00e1usula, como faria em um banco de dados relacional.<\/li>\n<li><code>META(i).id<\/code> \u00e9 uma forma de acessar a chave de um documento<\/li>\n<li>A sintaxe literal do JSON sendo SELECIONADO COMO v \u00e9 uma forma de especificar quais campos voc\u00ea deseja mover. Os curingas podem ser usados aqui.<\/li>\n<li><code>NEST<\/code> \u00e9 um tipo de uni\u00e3o que aninhar\u00e1 os dados em uma matriz em vez de no n\u00edvel da raiz.<\/li>\n<li><code>PARA i<\/code> especifica o lado esquerdo do <code>NA CHAVE<\/code> join. Essa sintaxe \u00e9 provavelmente a parte mais fora do padr\u00e3o do N1QL, mas a pr\u00f3xima vers\u00e3o principal do Couchbase Server incluir\u00e1 a funcionalidade \"ANSI JOIN\", que ser\u00e1 muito mais natural para leitura e grava\u00e7\u00e3o.<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>Depois de executar essa consulta, voc\u00ea dever\u00e1 ter um total de 3 documentos no seu bucket de \"opera\u00e7\u00e3o\", representando 3 faturas.<\/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>Voc\u00ea pode excluir\/descarregar o bucket de teste, pois ele agora cont\u00e9m dados obsoletos. Ou voc\u00ea pode mant\u00ea-lo por perto para fazer mais experimentos.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_summary\">Resumo<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Migrar dados diretamente para o Couchbase Server pode ser t\u00e3o f\u00e1cil quanto importar via CSV e transformar com algumas linhas de N1QL. A modelagem real e a tomada de decis\u00f5es exigem mais tempo e reflex\u00e3o. Depois de decidir como modelar, o N1QL oferece a flexibilidade de transformar dados relacionais planos e dispersos em um modelo de documento orientado a agregados.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Mais recursos:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/sql-to-json-data-modeling-hackolade\/\">Usando a Hackolade<\/a> para colaborar na modelagem de dados JSON.<\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/moving-from-sql-server-to-couchbase-part-1-data-modeling\/\">Parte da s\u00e9rie SQL Server<\/a> discute o mesmo tipo de decis\u00f5es de modelagem de dados JSON<\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/comparing-couchbase-vs-oracle\/\">Como o Couchbase supera a Oracle<\/a>Se estiver pensando em transferir alguns de seus dados para fora da Oracle<\/li>\n<li><a href=\"https:\/\/resources.couchbase.com\/c\/relational-no-sql-wp?x=Y7B0ca\">Mudan\u00e7a do sistema relacional para o NoSQL: Como come\u00e7ar<\/a> white paper.<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>Sinta-se \u00e0 vontade para entrar em contato comigo se tiver alguma d\u00favida ou precisar de ajuda. Eu sou<br \/>\n<a href=\"https:\/\/twitter.com\/mgroves\">@mgroves<\/a> no Twitter. Voc\u00ea tamb\u00e9m pode fazer perguntas no <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/forums\/\">F\u00f3runs do Couchbase<\/a>. H\u00e1 especialistas em N1QL l\u00e1 que s\u00e3o muito receptivos e podem ajud\u00e1-lo a escrever o N1QL para acomodar sua modelagem de dados 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\/pt\/json-data-modeling-rdbms-users\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\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\/pt\/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\":\"pt-BR\",\"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\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"pt-BR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@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\":\"pt-BR\",\"@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\/pt\/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\/pt\/json-data-modeling-rdbms-users\/","og_locale":"pt_BR","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\/pt\/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":"pt-BR","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":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/json-data-modeling-rdbms-users\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@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":"Blog do Couchbase","description":"Couchbase, o banco de dados 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":"pt-BR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"Blog do Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"pt-BR","@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":"pt-BR","@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 \u00e9 um cara que adora programar. N\u00e3o importa se \u00e9 C#, jQuery ou PHP: ele enviar\u00e1 solicita\u00e7\u00f5es de pull para qualquer coisa. Ele tem programado profissionalmente desde que escreveu um aplicativo de ponto de venda QuickBASIC para a pizzaria de seus pais nos anos 90. Atualmente, ele trabalha como gerente s\u00eanior de marketing de produtos da Couchbase. Seu tempo livre \u00e9 passado com a fam\u00edlia, assistindo aos Reds e participando da comunidade de desenvolvedores. Ele \u00e9 autor de AOP in .NET, Pro Microservices in .NET, autor da Pluralsight e Microsoft MVP.","sameAs":["https:\/\/crosscuttingconcerns.com","https:\/\/x.com\/mgroves"],"url":"https:\/\/www.couchbase.com\/blog\/pt\/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":"Matthew D. Groves \u00e9 um cara que adora programar.  N\u00e3o importa se \u00e9 C#, jQuery ou PHP: ele enviar\u00e1 solicita\u00e7\u00f5es de pull para qualquer coisa.  Ele tem programado profissionalmente desde que escreveu um aplicativo de ponto de venda QuickBASIC para a pizzaria de seus pais nos anos 90.  Atualmente, ele trabalha como gerente s\u00eanior de marketing de produtos da Couchbase. Seu tempo livre \u00e9 passado com a fam\u00edlia, assistindo aos Reds e participando da comunidade de desenvolvedores.  Ele \u00e9 autor de AOP in .NET, Pro Microservices in .NET, autor da Pluralsight e Microsoft MVP."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/4508","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/users\/71"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=4508"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/4508\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/3251"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=4508"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=4508"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=4508"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=4508"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}