{"id":1976,"date":"2015-10-09T12:35:05","date_gmt":"2015-10-09T12:35:04","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1976"},"modified":"2015-10-09T12:35:05","modified_gmt":"2015-10-09T12:35:04","slug":"touchbase-part-0-creating-a-data-model","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/touchbase-part-0-creating-a-data-model\/","title":{"rendered":"Explorando o Couchbase e o N1QL por meio do Touchbase usando Node.js e Angular.js - Parte 0: Criando um modelo de dados"},"content":{"rendered":"<h2>Parte 0: Criando um modelo de dados<\/h2>\n<p>Antes de criar o Touchbase, \u00e9 importante definir a estrutura de como os dados ser\u00e3o armazenados. Na forma mais b\u00e1sica, h\u00e1 realmente tr\u00eas coisas diferentes que precisaremos armazenar.<\/p>\n<ol>\n<li><strong>Documento do usu\u00e1rio: <\/strong> Armazena todas as informa\u00e7\u00f5es sobre um determinado usu\u00e1rio.<\/li>\n<li><strong>Postagens: <\/strong> Todas as postagens criadas pelos usu\u00e1rios devem ser armazenadas com as informa\u00e7\u00f5es necess\u00e1rias para exibi\u00e7\u00e3o.<\/li>\n<li><strong>Imagens: <\/strong> Todas as imagens de perfil de usu\u00e1rio devem ser armazenadas como dados bin\u00e1rios (neste caso, base64).<\/li>\n<\/ol>\n<p>\u00a0<\/p>\n<h4>DOCUMENTO DO USU\u00c1RIO<\/h4>\n<p>Primeiro, come\u00e7aremos com o documento do usu\u00e1rio. Esse documento \u00e9 simplesmente armazenado em um UUID (Universally Unique Identifier, identificador \u00fanico universal). A raz\u00e3o para isso \u00e9 que o ID do documento n\u00e3o deve nos dizer nada sobre o usu\u00e1rio; tudo isso deve vir do conte\u00fado do documento. Por exemplo, digamos que armazenamos cada um dos documentos do usu\u00e1rio usando o endere\u00e7o de e-mail do usu\u00e1rio como ID do documento. Se um usu\u00e1rio quisesse alterar seu e-mail, isso seria um grande problema, pois seria necess\u00e1rio armazenar o documento atual, armazen\u00e1-lo novamente com um novo ID de documento e excluir o documento antigo. Ao implementar um UUID, podemos localizar o usu\u00e1rio e alterar o atributo &apos;email&apos; em seu documento usando uma instru\u00e7\u00e3o N1QL UPDATE. Isso explica por que algo independente do conte\u00fado do documento deve ser usado. Tamb\u00e9m queremos ter certeza de que nenhum dos IDs de documento ser\u00e1 o mesmo, de modo que isso garantir\u00e1 algoritmicamente que IDs de documento duplicados sejam praticamente imposs\u00edveis. Abaixo, voc\u00ea ver\u00e1 o atributo &apos;uuid&apos;, que \u00e9 usado como ID do documento.<\/p>\n<h4>Exemplo de documento do usu\u00e1rio<\/h4>\n<p>(observe que alguns campos foram ocultados!)<\/p>\n<p><!-- HTML generated using hilite.me --><\/p>\n<pre>\n{\n  \"Name\": \"Pranav Mayuram\",\n  \"arrayAttributes\": {\n    \"Expertise\": [\n      \"Touchbase\"\n    ],\n    \"Hobbies\": []\n  },\n  \"dropdownAttributes\": {\n    \"Base Office\": \"Mountain View\",\n    \"Division\": \"Engineering\"\n  },\n  \"login\": {\n    \"administrator\": false,\n    \"email\": \"????????@couchbase.com\",\n    \"emailVerified\": true,\n    \"hasPicture\": true,\n    \"type\": \"user\"\n  },\n  \"password\": \"????????????????????????????????????\",\n  \"picSRC\": \"\",\n  \"stringAttributes\": {\n    \"Job Title\": \"N1QL Intern\",\n    \"Skype\": \"????????????\"\n  },\n  \"timeTracker\": {\n    \"loginTimes\": [\n      \"2015-08-24T20:44:38.133Z\",\n      \"2015-08-22T21:37:13.294Z\"\n    ],\n    \"registerTime\": \"2015-08-22T21:37:13.294Z\",\n    \"updateTimes\": []\n  },\n  \"uuid\": \"b48e2033-4c7b-48d9-b45a-3854500e8e61\"\n}\n<\/pre>\n<p>Esse documento do usu\u00e1rio \u00e9 vinculado ao restante dos documentos de diferentes maneiras, mas o mais importante \u00e9 manter todas as informa\u00e7\u00f5es que o usu\u00e1rio insere no registro. Elas podem ser divididas em tr\u00eas tipos diferentes de informa\u00e7\u00f5es, que seriam: <strong>&apos;array attributes&apos;<\/strong>, <strong>&apos;string attributes&apos;<\/strong>e <strong>&apos;atributos suspensos&apos;<\/strong>. Normalmente, essas s\u00e3o as tr\u00eas maneiras pelas quais um usu\u00e1rio insere informa\u00e7\u00f5es, e o aplicativo altera a forma como elas s\u00e3o tratadas de acordo. Os atributos podem ser alterados de acordo com o <strong>config.json<\/strong> de modo que o usu\u00e1rio seja solicitado a fornecer informa\u00e7\u00f5es diferentes. Essa pode n\u00e3o ser considerada a abordagem mais intuitiva para um modelo de dados, mas agiliza significativamente o desenvolvimento do aplicativo. O <strong> config.json <\/strong> pode ser visto abaixo, mostrando como os dados poderiam ser personalizados por um desenvolvedor (o usu\u00e1rio ser\u00e1 solicitado a fornecer informa\u00e7\u00f5es diferentes), mas ainda assim seriam tratados da mesma forma pelo aplicativo. A personaliza\u00e7\u00e3o desses atributos ocorreria no objeto &apos;dataModel&apos;.<\/p>\n<h4>config.json<\/h4>\n<p><!-- HTML generated using hilite.me --><\/p>\n<pre>\n{\n    \"couchbase\": {\n        \"server\": \"127.0.0.1:8091\",\n        \"userBucket\": \"users\",\n        \"pictureBucket\": \"users_pictures\",\n        \"publishBucket\": \"users_publishments\",\n        \"TouchbasePort\": 3000\n    },\n    \"SendGrid\": {\n      \"username\" : \"\",\n      \"password\" : \"\"\n    },\n    \"dataModel\": {\n      \"projectName\": \"Touchbase\",\n      \"colorHex\": \"#4DD0E1\",\n      \"primaryAttribute\": \"Name\",\n    \"arrayAttributes\" : [\"Expertise\",\"Hobbies\"],\n    \"stringAttributes\": [\"Job Title\", \"Skype\"],\n    \"dropdownAttributes\": [\n      {\n        \"varname\": \"Base Office\",\n        \"options\": [\"Mountain View\",\"San Francisco\",\"Bangalore\",\"Manchester\",\"Other - Remote\"]\n      },\n      {\n        \"varname\": \"Division\",\n        \"options\": [\"Engineering\",\"Sales\",\"Marketing\",\"Support\",\"Other Staff\"]\n      }\n    ],\n    \"pubTypes\": [\n      {\n        \"type\": \"Github Projects\",\n        \"imagePath\": \"GitHub-Mark-120px-plus.png\",\n        \"icon\": \"github\"\n      },\n      {\n        \"type\": \"Couchbase in the News\",\n        \"imagePath\": \"couchbase-logo.png\",\n        \"icon\": \"newspaper\"\n      }\n    ]\n    }\n  }\n  <\/pre>\n<p>\u00a0<\/p>\n<h4>POST DOCUMENT<\/h4>\n<p>Em seguida, teremos que armazenar as postagens. Esses tamb\u00e9m s\u00e3o documentos JSON simples e manter\u00e3o as informa\u00e7\u00f5es de que precisamos sobre cada post. Eles tamb\u00e9m s\u00e3o armazenados como UUIDs, com <strong>&apos;_pub_<pubtype>&apos;<\/strong> anexado.<\/p>\n<h4>Exemplo de documento de postagem<\/h4>\n<p><!-- HTML generated using hilite.me --><\/p>\n<pre>\n{\n  \"authorID\": \"b48e2033-4c7b-48d9-b45a-3854500e8e61\",\n  \"blurb\": \"Social networking project built with a flexible back-end that allows full customization. Designed using Couchbase, Node.js, Express on back-end. Front-end designed using Angular.js,  Angular Material Design, as well as parts of Bootstrap, Semantic UI, and Materialize CSS. Created by Pranav Mayuram.\",\n  \"hyperlink\": \"https:\/\/github.com\/couchbaselabs\/touchbase\",\n  \"imagePath\": \"GitHub-Mark-120px-plus.png\",\n  \"pubType\": \"Github Projects\",\n  \"publishID\": \"06990d4f-d743-43c2-95f5-2d8e27dfcbc5_pub_Github Projects\",\n  \"time\": \"2015-08-25T03:55:19.468Z\",\n  \"title\": \"Touchbase\",\n  \"type\": \"post\"\n}\n<\/pre>\n<p>Cada postagem tem tr\u00eas partes principais: t\u00edtulo, link e sinopse. Isso cont\u00e9m quase tudo o que \u00e9 necess\u00e1rio em uma postagem, mas h\u00e1 outras coisas simples que armazenaremos no back-end, que o usu\u00e1rio n\u00e3o inserir\u00e1 diretamente.<\/p>\n<p>Primeiramente, usaremos o ID do usu\u00e1rio e o armazenaremos com a publica\u00e7\u00e3o. Tamb\u00e9m armazenaremos a hora em que a postagem foi feita. H\u00e1 tamb\u00e9m um <strong>&apos;pubType&apos;<\/strong> que \u00e9 o tipo de publica\u00e7\u00e3o que foi feita, e isso \u00e9 obtido de onde a postagem foi feita no front-end.<\/p>\n<p>Por exemplo, se fizermos a postagem na se\u00e7\u00e3o <strong>&apos;Projetos do Github&apos;<\/strong> se\u00e7\u00e3o, o <strong>&apos;pubType&apos;<\/strong> que foi armazenado seria <strong>&apos;Projetos do Github&apos;<\/strong>. Haveria tamb\u00e9m um <strong>&apos;imagePath&apos;<\/strong> associado a esse <strong>&apos;pubType&apos;<\/strong> no <strong>config.json<\/strong> que obteria a imagem correspondente para esse documento <strong>&apos;pubType&apos;<\/strong> do <strong>\u00edcones<\/strong> pasta.<\/p>\n<p>Por fim, quando estivermos extraindo os documentos de postagem, usaremos uma fun\u00e7\u00e3o para manipular esses documentos e envi\u00e1-los para o front-end conforme acharmos adequado. Na implementa\u00e7\u00e3o atual, uma consulta N1QL \u00e9 executada para encontrar cada documento que seja do &apos;pubType&apos; em que a tela do usu\u00e1rio esteja (por exemplo, se o usu\u00e1rio estiver em &apos;Github Projects&apos;, somente os documentos com um &apos;pubType&apos; de &apos;Github Project&apos; ser\u00e3o extra\u00eddos). Em seguida, os documentos ser\u00e3o ordenados pelo hor\u00e1rio em que foram postados, de modo que os mais recentes sejam os primeiros. Voc\u00ea tamb\u00e9m deve ter notado que armazenamos apenas o &apos;authorID&apos;, e n\u00e3o o nome do autor&apos;. A fun\u00e7\u00e3o que extrai as postagens tamb\u00e9m far\u00e1 uma pesquisa do nome de cada autor de acordo com o &apos;authorID&apos;, caso o autor mude de nome na rede. Mais adiante, nesta s\u00e9rie do blog, ser\u00e1 feita uma an\u00e1lise detalhada do armazenamento e da recupera\u00e7\u00e3o de posts.<\/p>\n<p>\u00a0<\/p>\n<h4>DOCUMENTO COM IMAGEM<\/h4>\n<p>Por fim, teremos que armazenar imagens. Atualmente, isso \u00e9 feito usando <strong><a href=\"https:\/\/github.com\/expressjs\/multer\">Multer<\/a><\/strong>uma parte do middleware do Node.js. Isso tamb\u00e9m ser\u00e1 explicado em mais detalhes posteriormente nesta s\u00e9rie do blog. Um recurso importante do armazenamento de imagens \u00e9 que precisaremos associar essa imagem ao documento do usu\u00e1rio para o mesmo usu\u00e1rio. Atualmente, isso \u00e9 feito por meio do ID do documento da imagem, em que o ID do documento \u00e9 armazenado com o mesmo ID do documento do usu\u00e1rio com <strong>&apos;_picMulterNode&apos;<\/strong> anexado \u00e0 ID.<\/p>\n<h4>Identifica\u00e7\u00e3o do documento com foto<\/h4>\n<p><!-- HTML generated using hilite.me --><\/p>\n<pre>\n&apos;b48e2033-4c7b-48d9-b45a-3854500e8e61_picMulterNode&apos;\n  <\/pre>\n<p>\u00a0<\/p>\n<h4>CONCLUS\u00c3O<\/h4>\n<p><strong>Blogs futuros :<\/strong> Esta s\u00e9rie de blogs se concentrar\u00e1 no aspecto de back-end desse aplicativo, especialmente porque ele segue os princ\u00edpios REST. As explica\u00e7\u00f5es se concentrar\u00e3o no c\u00f3digo Node.js usando a estrutura Express; no entanto, alguns c\u00f3digos HTML e Angular.js ser\u00e3o mostrados quando necess\u00e1rio para a implementa\u00e7\u00e3o da API REST. Para ver o c\u00f3digo completo, com o front-end inclu\u00eddo, acesse https:\/\/github.com\/couchbaselabs\/touchbase. Para o front-end, isso faz uso de Angular.js, HTML5, Angular UI Router, Angular Material Design e muito mais. Todo o c\u00f3digo do Angular.js pode ser visto em <strong>TouchbaseModular\/public\/js<\/strong>. HTML pode ser visto em <strong>TouchbaseModular\/p\u00fablico<\/strong> dentro de <strong>index.html<\/strong> (usa <strong>signUp.js<\/strong>) e <strong>nav.html<\/strong> (usa <strong>touchbase.js<\/strong>). Todas as parti\u00e7\u00f5es HTML do Angular UI Router podem ser vistas em <strong>TouchbaseModular\/public\/html<\/strong>. Uma documenta\u00e7\u00e3o de projeto mais detalhada tamb\u00e9m pode ser vista no <strong>Documenta\u00e7\u00e3o<\/strong> pasta.<\/p>\n<p>Com isso, conclu\u00edmos nosso blog sobre modelos de dados e espero que ele tenha sido \u00fatil para todos voc\u00eas. Se voc\u00ea tiver alguma d\u00favida, preocupa\u00e7\u00e3o ou feedback, deixe um coment\u00e1rio abaixo.<\/p>","protected":false},"excerpt":{"rendered":"<p>Part 0: Creating a Data Model Before building Touchbase, it is important to lay out the structure for how data will be stored. In the most basic form, there are really three different things we will need to store. User [&hellip;]<\/p>","protected":false},"author":60,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1],"tags":[],"ppma_author":[9034],"class_list":["post-1976","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v26.4 (Yoast SEO v26.4) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Exploring Couchbase and N1QL through Touchbase using Node.js and Angular.js \u2013 Part 0: Creating a Data Model - The Couchbase Blog<\/title>\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\/touchbase-part-0-creating-a-data-model\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Exploring Couchbase and N1QL through Touchbase using Node.js and Angular.js \u2013 Part 0: Creating a Data Model\" \/>\n<meta property=\"og:description\" content=\"Part 0: Creating a Data Model Before building Touchbase, it is important to lay out the structure for how data will be stored. In the most basic form, there are really three different things we will need to store. User [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/touchbase-part-0-creating-a-data-model\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2015-10-09T12:35:04+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1800\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Pranav Mayuram\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Pranav Mayuram\" \/>\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\/touchbase-part-0-creating-a-data-model\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/\"},\"author\":{\"name\":\"Pranav Mayuram\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/454261061bad5159ad2696e0bf162eaa\"},\"headline\":\"Exploring Couchbase and N1QL through Touchbase using Node.js and Angular.js \u2013 Part 0: Creating a Data Model\",\"datePublished\":\"2015-10-09T12:35:04+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/\"},\"wordCount\":1108,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"articleSection\":[\"Uncategorized\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/\",\"name\":\"Exploring Couchbase and N1QL through Touchbase using Node.js and Angular.js \u2013 Part 0: Creating a Data Model - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2015-10-09T12:35:04+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"width\":1800,\"height\":630},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Exploring Couchbase and N1QL through Touchbase using Node.js and Angular.js \u2013 Part 0: Creating a Data Model\"}]},{\"@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\/454261061bad5159ad2696e0bf162eaa\",\"name\":\"Pranav Mayuram\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/61baa4ff0f18aa9a8ce672f0f97f1ac0\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/de8b1b457fdc2f5f8b407ef8bf0bfcacb1e2be0ab9de2cee8e8aa4ee7f985709?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/de8b1b457fdc2f5f8b407ef8bf0bfcacb1e2be0ab9de2cee8e8aa4ee7f985709?s=96&d=mm&r=g\",\"caption\":\"Pranav Mayuram\"},\"description\":\"Pranav Mayuram is a N1QL Query language intern, Couchbase. Built a social network platform, Touchbase, using Couchbase Server, Node.js, Express &amp; Angular.js.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/pranav-mayuram\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Exploring Couchbase and N1QL through Touchbase using Node.js and Angular.js \u2013 Part 0: Creating a Data Model - The Couchbase Blog","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\/touchbase-part-0-creating-a-data-model\/","og_locale":"pt_BR","og_type":"article","og_title":"Exploring Couchbase and N1QL through Touchbase using Node.js and Angular.js \u2013 Part 0: Creating a Data Model","og_description":"Part 0: Creating a Data Model Before building Touchbase, it is important to lay out the structure for how data will be stored. In the most basic form, there are really three different things we will need to store. User [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/touchbase-part-0-creating-a-data-model\/","og_site_name":"The Couchbase Blog","article_published_time":"2015-10-09T12:35:04+00:00","og_image":[{"width":1800,"height":630,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2022\/11\/couchbase-nosql-dbaas.png","type":"image\/png"}],"author":"Pranav Mayuram","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Pranav Mayuram","Est. reading time":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/"},"author":{"name":"Pranav Mayuram","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/454261061bad5159ad2696e0bf162eaa"},"headline":"Exploring Couchbase and N1QL through Touchbase using Node.js and Angular.js \u2013 Part 0: Creating a Data Model","datePublished":"2015-10-09T12:35:04+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/"},"wordCount":1108,"commentCount":0,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","articleSection":["Uncategorized"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/","url":"https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/","name":"Exploring Couchbase and N1QL through Touchbase using Node.js and Angular.js \u2013 Part 0: Creating a Data Model - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2015-10-09T12:35:04+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","width":1800,"height":630},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/touchbase-part-0-creating-a-data-model\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Exploring Couchbase and N1QL through Touchbase using Node.js and Angular.js \u2013 Part 0: Creating a Data Model"}]},{"@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\/454261061bad5159ad2696e0bf162eaa","name":"Pranav Mayuram","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/61baa4ff0f18aa9a8ce672f0f97f1ac0","url":"https:\/\/secure.gravatar.com\/avatar\/de8b1b457fdc2f5f8b407ef8bf0bfcacb1e2be0ab9de2cee8e8aa4ee7f985709?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/de8b1b457fdc2f5f8b407ef8bf0bfcacb1e2be0ab9de2cee8e8aa4ee7f985709?s=96&d=mm&r=g","caption":"Pranav Mayuram"},"description":"Pranav Mayuram \u00e9 estagi\u00e1rio da linguagem de consulta N1QL, Couchbase. Criou uma plataforma de rede social, Touchbase, usando o Couchbase Server, Node.js, Express e Angular.js.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/pranav-mayuram\/"}]}},"authors":[{"term_id":9034,"user_id":60,"is_guest":0,"slug":"pranav-mayuram","display_name":"Pranav Mayuram","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/de8b1b457fdc2f5f8b407ef8bf0bfcacb1e2be0ab9de2cee8e8aa4ee7f985709?s=96&d=mm&r=g","author_category":"","last_name":"Mayuram","first_name":"Pranav","job_title":"","user_url":"","description":"Pranav Mayuram \u00e9 estagi\u00e1rio da linguagem de consulta N1QL, Couchbase. Criou uma plataforma de rede social, Touchbase, usando o Couchbase Server, Node.js, Express e Angular.js."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1976","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\/60"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=1976"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1976\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=1976"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=1976"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=1976"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=1976"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}