{"id":2572,"date":"2017-02-14T07:50:41","date_gmt":"2017-02-14T15:50:41","guid":{"rendered":"http:\/\/www.couchbase.com\/blog\/?p=2572"},"modified":"2023-09-09T02:55:28","modified_gmt":"2023-09-09T09:55:28","slug":"sql-server-couchbase-data-migration","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/sql-server-couchbase-data-migration\/","title":{"rendered":"Mudan\u00e7a do SQL Server para o Couchbase Parte 2: Migra\u00e7\u00e3o de dados"},"content":{"rendered":"<div id=\"preamble\">\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Nesta s\u00e9rie de postagens do blog, apresentarei as considera\u00e7\u00f5es sobre a mudan\u00e7a para um banco de dados de documentos quando voc\u00ea tem um hist\u00f3rico relacional. Especificamente, o Microsoft SQL Server em compara\u00e7\u00e3o com o <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/developers\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">Servidor Couchbase<\/a>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Em tr\u00eas partes, abordarei o assunto:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/moving-from-sql-server-to-couchbase-part-1-data-modeling\/\">Modelagem de dados<\/a><\/li>\n<li>Os dados em si (esta postagem do blog)<\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/moving-sql-server-couchbase-app-migration\/\">Aplicativos que usam os dados<\/a><\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>O objetivo \u00e9 estabelecer algumas diretrizes gerais que podem ser aplicadas ao planejamento e ao design do seu aplicativo.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Se voc\u00ea quiser acompanhar, criei um aplicativo que demonstra o Couchbase e o SQL Server lado a lado. <a href=\"https:\/\/github.com\/couchbaselabs\/blog-source-code\/tree\/master\/Groves\/045MigrateFromSQLServer\/src\/SQLServerToCouchbase\">Obtenha o c\u00f3digo-fonte no GitHub<\/a>e certifique-se de <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/downloads\/\">Fa\u00e7a o download de uma pr\u00e9via para desenvolvedores do Couchbase Server<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_data_types_in_json_vs_sql\">Tipos de dados em JSON vs. SQL<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>O Couchbase (e muitos outros bancos de dados de documentos) usa objetos JSON para os dados. O JSON \u00e9 um formato poderoso e leg\u00edvel por humanos para armazenar dados. Ao comparar com os tipos de dados em tabelas relacionais, h\u00e1 algumas semelhan\u00e7as e algumas diferen\u00e7as importantes.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Todos os dados JSON s\u00e3o compostos de 6 tipos: string, n\u00famero, booleano, matriz, objeto e nulo. H\u00e1 muitos tipos de <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/ms187752(v=sql.110).aspx\">tipos de dados dispon\u00edveis no SQL Server<\/a>. Vamos come\u00e7ar com uma tabela que \u00e9 um tipo de tradu\u00e7\u00e3o \"literal\" e trabalhar a partir da\u00ed.<\/p>\n<\/div>\n<table class=\"tableblock frame-all grid-all spread\">\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\">SQL Server<\/th>\n<th class=\"tableblock halign-left valign-top\">JSON<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">nvarchar, varchar, text<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">string<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">int, float, decimal, double<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">n\u00famero<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">bit<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">booleano<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">nulo<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">nulo<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Campos XML\/hierarchyid<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">matriz \/ objeto<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div class=\"paragraph\">\n<p>\u00c9 importante entender como o JSON funciona. Listei algumas diferen\u00e7as de alto n\u00edvel entre os tipos de dados JSON e os tipos de dados do SQL Server. Supondo que voc\u00ea j\u00e1 entenda os tipos de dados SQL, talvez queira <a href=\"https:\/\/json.org\/\">passar algum tempo aprendendo mais sobre JSON e tipos de dados JSON<\/a>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>A <strong>string<\/strong> no SQL Server \u00e9 geralmente definido por um comprimento. <em>nvarchar(50)<\/em> ou <em>nvarchar(MAX)<\/em> por exemplo. No JSON, voc\u00ea n\u00e3o precisa definir um comprimento. Basta usar uma string.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>A <strong>n\u00famero<\/strong> no SQL Server varia muito de acordo com a finalidade para a qual voc\u00ea o est\u00e1 usando. Os <strong>n\u00famero<\/strong> em JSON \u00e9 flex\u00edvel, pois pode armazenar n\u00fameros inteiros, decimais ou ponto flutuante. Em circunst\u00e2ncias espec\u00edficas, como quando voc\u00ea precisa de uma precis\u00e3o espec\u00edfica ou precisa armazenar n\u00fameros muito grandes, talvez seja melhor armazenar um n\u00famero como uma cadeia de caracteres.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>A <strong>booleano<\/strong> em JSON \u00e9 verdadeiro\/falso. No SQL Server, \u00e9 mais ou menos equivalente: um bit que representa verdadeiro\/falso.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>No JSON, qualquer valor pode ser <strong>nulo<\/strong>. No SQL Server, voc\u00ea define isso em uma base de campo por campo. Se um campo no SQL Server n\u00e3o estiver definido como \"nullable\", ele ser\u00e1 aplicado. Em um documento JSON, n\u00e3o h\u00e1 essa aplica\u00e7\u00e3o.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>O JSON n\u00e3o tem <strong>data<\/strong> tipo de dados. Geralmente, as datas s\u00e3o armazenadas como carimbos de data\/hora do UNIX, mas voc\u00ea tamb\u00e9m pode usar representa\u00e7\u00f5es de cadeia de caracteres ou outros formatos para datas. <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/n1ql\/n1ql-language-reference\/datefun.html\">A linguagem de consulta N1QL tem uma variedade de fun\u00e7\u00f5es de data dispon\u00edveis<\/a>Portanto, se voc\u00ea quiser usar o N1QL em datas, poder\u00e1 usar essas fun\u00e7\u00f5es para planejar o armazenamento de datas adequadamente.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>No SQL Server, h\u00e1 um <strong>geografia<\/strong> tipo de dados. No Couchbase, <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/4.1\/views\/sv-example1.html\">o formato GeoJSON \u00e9 compat\u00edvel<\/a>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Existem alguns outros tipos de dados especializados no SQL Server, incluindo hierarchyid e xml. Normalmente, eles seriam desenrolados em objetos JSON e\/ou referenciados por chave (conforme explorado em <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/moving-from-sql-server-to-couchbase-part-1-data-modeling\/\">Parte 1 desta s\u00e9rie do blog sobre modelagem de dados<\/a>). Voc\u00ea ainda pode armazenar XML\/JSON em uma string, se quiser, mas, se fizer isso, n\u00e3o poder\u00e1 usar todo o poder do N1QL nesses campos.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_migrating_and_translating_data\">Migra\u00e7\u00e3o e tradu\u00e7\u00e3o de dados<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Dependendo da sua organiza\u00e7\u00e3o e da sua equipe, talvez seja necess\u00e1rio trazer pessoas de v\u00e1rias fun\u00e7\u00f5es para garantir uma migra\u00e7\u00e3o bem-sucedida. Se voc\u00ea tiver um DBA, ele ter\u00e1 de saber como executar e gerenciar o Couchbase t\u00e3o bem quanto o SQL Server. Se voc\u00ea for DevOps ou tiver uma equipe de DevOps, \u00e9 importante envolv\u00ea-la desde o in\u00edcio, para que ela saiba o que voc\u00ea est\u00e1 fazendo e possa ajud\u00e1-lo a coordenar seus esfor\u00e7os. Mudan\u00e7a para um banco de dados de documentos <strong>n\u00e3o<\/strong> significa que voc\u00ea n\u00e3o precisa mais do envolvimento de DBAs, Ops ou DevOps. Essas fun\u00e7\u00f5es tamb\u00e9m devem ser envolvidas ao fazer a modelagem de dados, se poss\u00edvel, para que possam fornecer informa\u00e7\u00f5es e entender o que est\u00e1 acontecendo.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Depois de projetar seu modelo com o <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/moving-from-sql-server-to-couchbase-part-1-data-modeling\/\">Parte 1 sobre modelagem de dados<\/a>Voc\u00ea pode come\u00e7ar a mover os dados para o Couchbase.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Para uma migra\u00e7\u00e3o ing\u00eanua (1 linha para 1 documento), voc\u00ea pode escrever um programa muito simples para percorrer as tabelas, colunas e valores de um banco de dados relacional e gerar os documentos correspondentes. Uma ferramenta como <a href=\"https:\/\/github.com\/StackExchange\/dapper-dot-net\">Bonit\u00e3o<\/a> trataria todas as tradu\u00e7\u00f5es de tipos de dados no C# e as alimentaria no <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/sdk\/dotnet\/start-using-sdk.html?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">SDK do Couchbase .NET<\/a>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>No entanto, dados totalmente planos s\u00e3o relativamente incomuns, portanto, para modelos mais complexos, voc\u00ea provavelmente precisar\u00e1 escrever c\u00f3digo para migrar do modelo relacional antigo para o novo modelo de documento.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Aqui est\u00e3o algumas coisas que voc\u00ea deve ter em mente ao escrever c\u00f3digo de migra\u00e7\u00e3o (de qualquer tipo, mas especialmente de relacional para n\u00e3o relacional):<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><strong>D\u00ea a si mesmo bastante tempo para planejar.<\/strong> Durante a migra\u00e7\u00e3o, voc\u00ea pode descobrir que precisa repensar seu modelo. Voc\u00ea precisar\u00e1 testar e fazer ajustes, e \u00e9 melhor ter mais tempo do que cometer erros na pressa. A migra\u00e7\u00e3o de dados \u00e9 um ciclo iterativo: migrar uma tabela, ver se funciona, ajustar e continuar iterando. Talvez voc\u00ea tenha que passar por esse ciclo v\u00e1rias vezes.<\/li>\n<li><strong>Teste sua migra\u00e7\u00e3o usando dados reais.<\/strong> Os dados podem ser cheios de surpresas. Voc\u00ea pode pensar que o campo NVARCHAR s\u00f3 cont\u00e9m representa\u00e7\u00f5es de string de n\u00fameros, mas talvez haja algumas linhas anormais que contenham palavras. Use uma c\u00f3pia dos dados reais para testar e verificar sua migra\u00e7\u00e3o.<\/li>\n<li><strong>Esteja preparado para executar a migra\u00e7\u00e3o v\u00e1rias vezes.<\/strong> Tenha um plano para limpar uma migra\u00e7\u00e3o com falha e come\u00e7ar de novo. Isso pode ser um simples <code>DELETE FROM bucket<\/code> no N1QL, ou pode ser uma s\u00e9rie de limpezas mais planejadas e direcionadas. Se voc\u00ea planejar desde o in\u00edcio, isso ser\u00e1 mais f\u00e1cil. Automatize sua migra\u00e7\u00e3o para que isso seja menos doloroso.<\/li>\n<li><strong>ETL ou ELT?<\/strong> Extract-Transform-Load ou Extract-Load-Transform. Quando voc\u00ea vai fazer uma transforma\u00e7\u00e3o? Ao colocar dados no Couchbase, a flexibilidade do JSON permite que voc\u00ea transfira no local <em>ap\u00f3s<\/em> carregando se voc\u00ea quiser.<\/li>\n<\/ul>\n<\/div>\n<div class=\"sect2\">\n<h3 id=\"_an_example_etl_migration\">Um exemplo de migra\u00e7\u00e3o ETL<\/h3>\n<div class=\"paragraph\">\n<p>Escrevi um aplicativo de console de migra\u00e7\u00e3o muito simples usando C#, Entity Framework e o Couchbase .NET SDK. Ele migra o carrinho de compras e os exemplos de m\u00eddia social da postagem anterior do blog. O aplicativo completo <a href=\"https:\/\/github.com\/couchbaselabs\/blog-source-code\/tree\/master\/Groves\/045MigrateFromSQLServer\/src\/SQLServerToCouchbase\">O c\u00f3digo-fonte est\u00e1 dispon\u00edvel no GitHub<\/a>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Este aplicativo far\u00e1 a transforma\u00e7\u00e3o, portanto, trata-se de uma abordagem ETL. Essa abordagem usa o Entity Framework para mapear tabelas relacionais para classes C#, que s\u00e3o ent\u00e3o inseridas em documentos. O modelo de dados do Couchbase pode ser melhor representado por classes C# do que por tabelas relacionais (conforme demonstrado na postagem anterior do blog), portanto, essa abordagem tem menos atrito.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Vou usar o C# para escrever um programa de migra\u00e7\u00e3o, mas o que importa \u00e9 a automa\u00e7\u00e3o, n\u00e3o a ferramenta espec\u00edfica. Esse ser\u00e1 um c\u00f3digo essencialmente \"descart\u00e1vel\" ap\u00f3s a conclus\u00e3o da migra\u00e7\u00e3o. Minha abordagem C# n\u00e3o faz nenhum tipo de lote e provavelmente n\u00e3o \u00e9 adequada para quantidades extremamente grandes de dados, portanto, pode ser uma boa ideia usar uma ferramenta como <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/connectors\/talend\/talend.html?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">Talend<\/a> e\/ou uma abordagem ELT para dados de grande escala\/empresariais.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Eu criei um <code>ShoppingCartMigrator<\/code> e uma classe <code>SocialMediaMigrator<\/code> aula. Neste post, abordarei apenas o carrinho de compras. Passo a ele um arquivo Couchbase <code>balde<\/code> e o Entity Framework <code>contexto<\/code> que usei na \u00faltima postagem do blog. (Em vez disso, voc\u00ea poderia passar um arquivo NHibernate <code>sess\u00e3o<\/code> ou um simples <code>DbConnection<\/code> aqui, dependendo de sua prefer\u00eancia).<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\">public class ShoppingCartMigrator\r\n{\r\n    readonly IBucket _bucket;\r\n    readonly SqlToCbContext _context;\r\n\r\n    public ShoppingCartMigrator(IBucket bucket, SqlToCbContext context)\r\n    {\r\n        _bucket = bucket;\r\n        _context = context;\r\n    }\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Com esses objetos no lugar, criei um <code>Ir<\/code> m\u00e9todo para realizar a migra\u00e7\u00e3o, e um <code>Limpeza<\/code> para excluir quaisquer documentos criados na migra\u00e7\u00e3o, caso eu decida faz\u00ea-lo.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Para o <code>Ir<\/code> deixo que o Entity Framework fa\u00e7a o trabalho pesado das jun\u00e7\u00f5es e fa\u00e7a um loop em cada carrinho de compras.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\">public bool Go()\r\n{\r\n    var carts = _context.ShoppingCarts\r\n        .Include(x =&gt; x.Items)\r\n        .ToList();\r\n    foreach (var cart in carts)\r\n    {\r\n        var cartDocument = new Document&lt;dynamic&gt;\r\n        {\r\n            Id = cart.Id.ToString(),\r\n            Content = MapCart(cart)\r\n        };\r\n        var result = _bucket.Insert(cartDocument);\r\n        if (!result.Success)\r\n        {\r\n            Console.WriteLine($\"There was an error migrating Shopping Cart {cart.Id}\");\r\n            return false;\r\n        }\r\n        Console.WriteLine($\"Successfully migrated Shopping Cart {cart.Id}\");\r\n    }\r\n    return true;\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Optei por abortar a migra\u00e7\u00e3o se houver um erro sequer. Talvez voc\u00ea n\u00e3o queira fazer isso. Em vez disso, talvez queira fazer o log em um arquivo e abordar todos os registros que causam erros de uma s\u00f3 vez.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Para a limpeza, optei por excluir todos os documentos que t\u00eam um tipo de \"ShoppingCart\".<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\">public void Cleanup()\r\n{\r\n    Console.WriteLine(\"Delete all shopping carts...\");\r\n    var result = _bucket.Query&lt;dynamic&gt;(\"DELETE FROM `sqltocb` WHERE type='ShoppingCart';\");\r\n    if (!result.Success)\r\n    {\r\n        Console.WriteLine($\"{result.Exception?.Message}\");\r\n        Console.WriteLine($\"{result.Message}\");\r\n    }\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Essa \u00e9 a abordagem mais simples. Uma abordagem mais complexa poderia envolver a coloca\u00e7\u00e3o de um campo de marca\u00e7\u00e3o de \"impress\u00e3o digital\" tempor\u00e1rio em determinados documentos e, em seguida, a exclus\u00e3o de documentos com uma determinada impress\u00e3o digital na limpeza. (Por exemplo. <code>DELETE FROM sqltocb WHERE fingerprint = '999cfbc3-186e-4219-ab5d-18ad130a9dc6'<\/code>). Ou vice-versa: fa\u00e7a a impress\u00e3o digital dos dados problem\u00e1ticos para an\u00e1lise posterior e exclua o restante. Apenas certifique-se de limpar esses campos tempor\u00e1rios quando a migra\u00e7\u00e3o for conclu\u00edda com \u00eaxito.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Ao tentar fazer isso, talvez queira executar o aplicativo de console duas vezes, apenas para ver a limpeza em a\u00e7\u00e3o. A segunda tentativa resultar\u00e1 em erros, pois ele estar\u00e1 tentando criar documentos com chaves duplicadas.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_what_about_the_other_features_of_sql_server\">E quanto aos outros recursos do SQL Server?<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Nem tudo no SQL Server tem uma contrapartida direta no Couchbase. Em alguns casos, nunca haver\u00e1 uma contrapartida. Em alguns casos, haver\u00e1 um equivalente aproximado. Alguns recursos chegar\u00e3o no futuro, pois o Couchbase est\u00e1 em desenvolvimento acelerado, ativo e de c\u00f3digo aberto, e novos recursos est\u00e3o sendo adicionados quando apropriado.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Al\u00e9m disso, lembre-se de que os bancos de dados de documentos e os bancos de dados NoSQL geralmente for\u00e7am a l\u00f3gica comercial para fora do banco de dados em uma extens\u00e3o maior do que os bancos de dados relacionais. Por melhor que fosse se o Couchbase Server tivesse todos os recursos dispon\u00edveis, sempre h\u00e1 compensa\u00e7\u00f5es. Algumas s\u00e3o de natureza t\u00e9cnica, outras s\u00e3o decis\u00f5es de design do produto. \u00c9 poss\u00edvel fazer concess\u00f5es para adicionar recursos de estilo relacional, mas, em algum momento dessa jornada, o Couchbase deixa de ser um banco de dados r\u00e1pido e escal\u00e1vel e come\u00e7a a ser \"apenas mais um\" banco de dados relacional. Certamente h\u00e1 muita converg\u00eancia nos bancos de dados relacionais e n\u00e3o relacionais, e muitas mudan\u00e7as acontecem todos os anos.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Com isso em mente, fique atento \u00e0 \u00faltima postagem do blog desta s\u00e9rie. Ela abordar\u00e1 as altera\u00e7\u00f5es na codifica\u00e7\u00e3o de aplicativos que v\u00eam com o uso do Couchbase, incluindo:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li>SQL\/N1QL<\/li>\n<li>Procedimentos armazenados<\/li>\n<li>N\u00edveis de servi\u00e7o<\/li>\n<li>Gatilhos<\/li>\n<li>Visualiza\u00e7\u00f5es<\/li>\n<li>Serializa\u00e7\u00e3o<\/li>\n<li>Seguran\u00e7a<\/li>\n<li>Concorr\u00eancia<\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/pt\/using-autonumber-in-couchbase\/\">N\u00famero autom\u00e1tico<\/a><\/li>\n<li>OR\/Ms e ODMs<\/li>\n<li>Transa\u00e7\u00f5es<\/li>\n<\/ul>\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>Esta postagem do blog comparou e contrastou os recursos de dados dispon\u00edveis no Couchbase Server com o SQL Server. Se voc\u00ea estiver usando o SQL Server e estiver pensando em adicionar um banco de dados de documentos ao seu projeto ou iniciar um novo projeto, estou aqui para ajudar.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Confira o <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/developers\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">Portal do desenvolvedor do Couchbase<\/a> para obter mais detalhes.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Entre em contato comigo em <a href=\"mailto:matthew.groves@couchbase.com\">matthew.groves@couchbase.com<\/a>, fa\u00e7a uma pergunta em <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/forums\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">os f\u00f3runs do Couchbase<\/a>ou entre em contato comigo pelo <a href=\"https:\/\/twitter.com\/mgroves\">Twitter @mgroves<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>In this series of blog posts, I\u2019m going to lay out the considerations when moving to a document database when you have a relational background. Specifically, Microsoft SQL Server as compared to Couchbase Server. In three parts, I\u2019m going to [&hellip;]<\/p>\n","protected":false},"author":71,"featured_media":2574,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1811,1814,1815,1816,1819,1812],"tags":[1766,1383,1261,1458,1556],"ppma_author":[8937],"class_list":["post-2572","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-application-design","category-best-practices-and-tutorials","category-couchbase-server","category-data-modeling","category-n1ql-query","tag-data-migration","tag-etl","tag-json","tag-migration","tag-sql-server"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Moving from SQL Server to Couchbase Part 2: Data Migration<\/title>\n<meta name=\"description\" content=\"In this blog post series, I&#039;m laying out the considerations when moving from Microsoft SQL Server to Couchbase Server. This post is about data migration.\" \/>\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\/sql-server-couchbase-data-migration\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Moving from SQL Server to Couchbase Part 2: Data Migration\" \/>\n<meta property=\"og:description\" content=\"In this blog post series, I&#039;m laying out the considerations when moving from Microsoft SQL Server to Couchbase Server. This post is about data migration.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/sql-server-couchbase-data-migration\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-02-14T15:50:41+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-09-09T09:55:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/geese-migration.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2048\" \/>\n\t<meta property=\"og:image:height\" content=\"949\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\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=\"8 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/sql-server-couchbase-data-migration\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/sql-server-couchbase-data-migration\\\/\"},\"author\":{\"name\":\"Matthew Groves\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#\\\/schema\\\/person\\\/3929663e372020321b0152dc4fa65a58\"},\"headline\":\"Moving from SQL Server to Couchbase Part 2: Data Migration\",\"datePublished\":\"2017-02-14T15:50:41+00:00\",\"dateModified\":\"2023-09-09T09:55:28+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/sql-server-couchbase-data-migration\\\/\"},\"wordCount\":1747,\"commentCount\":4,\"publisher\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/sql-server-couchbase-data-migration\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2017\\\/02\\\/geese-migration.jpg\",\"keywords\":[\"Data Migration\",\"ETL\",\"JSON\",\"migration\",\"SQL Server\"],\"articleSection\":[\".NET\",\"Application Design\",\"Best Practices and Tutorials\",\"Couchbase Server\",\"Data Modeling\",\"SQL++ \\\/ N1QL Query\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/sql-server-couchbase-data-migration\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/sql-server-couchbase-data-migration\\\/\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/sql-server-couchbase-data-migration\\\/\",\"name\":\"Moving from SQL Server to Couchbase Part 2: Data Migration\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/sql-server-couchbase-data-migration\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/sql-server-couchbase-data-migration\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2017\\\/02\\\/geese-migration.jpg\",\"datePublished\":\"2017-02-14T15:50:41+00:00\",\"dateModified\":\"2023-09-09T09:55:28+00:00\",\"description\":\"In this blog post series, I'm laying out the considerations when moving from Microsoft SQL Server to Couchbase Server. This post is about data migration.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/sql-server-couchbase-data-migration\\\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/sql-server-couchbase-data-migration\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/sql-server-couchbase-data-migration\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2017\\\/02\\\/geese-migration.jpg\",\"contentUrl\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/wp-content\\\/uploads\\\/sites\\\/1\\\/2017\\\/02\\\/geese-migration.jpg\",\"width\":2048,\"height\":949,\"caption\":\"Geese migration licensed through Creative Commons https:\\\/\\\/commons.wikimedia.org\\\/wiki\\\/File:BrantaLeucopsisMigration.jpg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/sql-server-couchbase-data-migration\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.couchbase.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Moving from SQL Server to Couchbase Part 2: Data Migration\"}]},{\"@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:\\\/\\\/secure.gravatar.com\\\/avatar\\\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=gba51e6aacc53995c323a634e4502ef54\",\"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":"Mudan\u00e7a do SQL Server para o Couchbase Parte 2: Migra\u00e7\u00e3o de dados","description":"In this blog post series, I'm laying out the considerations when moving from Microsoft SQL Server to Couchbase Server. This post is about data migration.","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\/sql-server-couchbase-data-migration\/","og_locale":"pt_BR","og_type":"article","og_title":"Moving from SQL Server to Couchbase Part 2: Data Migration","og_description":"In this blog post series, I'm laying out the considerations when moving from Microsoft SQL Server to Couchbase Server. This post is about data migration.","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/sql-server-couchbase-data-migration\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-02-14T15:50:41+00:00","article_modified_time":"2023-09-09T09:55:28+00:00","og_image":[{"width":2048,"height":949,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/geese-migration.jpg","type":"image\/jpeg"}],"author":"Matthew Groves","twitter_card":"summary_large_image","twitter_creator":"@mgroves","twitter_misc":{"Written by":"Matthew Groves","Est. reading time":"8 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/sql-server-couchbase-data-migration\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/sql-server-couchbase-data-migration\/"},"author":{"name":"Matthew Groves","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58"},"headline":"Moving from SQL Server to Couchbase Part 2: Data Migration","datePublished":"2017-02-14T15:50:41+00:00","dateModified":"2023-09-09T09:55:28+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/sql-server-couchbase-data-migration\/"},"wordCount":1747,"commentCount":4,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/sql-server-couchbase-data-migration\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/geese-migration.jpg","keywords":["Data Migration","ETL","JSON","migration","SQL Server"],"articleSection":[".NET","Application Design","Best Practices and Tutorials","Couchbase Server","Data Modeling","SQL++ \/ N1QL Query"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/sql-server-couchbase-data-migration\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/sql-server-couchbase-data-migration\/","url":"https:\/\/www.couchbase.com\/blog\/sql-server-couchbase-data-migration\/","name":"Mudan\u00e7a do SQL Server para o Couchbase Parte 2: Migra\u00e7\u00e3o de dados","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/sql-server-couchbase-data-migration\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/sql-server-couchbase-data-migration\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/geese-migration.jpg","datePublished":"2017-02-14T15:50:41+00:00","dateModified":"2023-09-09T09:55:28+00:00","description":"In this blog post series, I'm laying out the considerations when moving from Microsoft SQL Server to Couchbase Server. This post is about data migration.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/sql-server-couchbase-data-migration\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/sql-server-couchbase-data-migration\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/sql-server-couchbase-data-migration\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/geese-migration.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/geese-migration.jpg","width":2048,"height":949,"caption":"Geese migration licensed through Creative Commons https:\/\/commons.wikimedia.org\/wiki\/File:BrantaLeucopsisMigration.jpg"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/sql-server-couchbase-data-migration\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Moving from SQL Server to Couchbase Part 2: Data Migration"}]},{"@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:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=gba51e6aacc53995c323a634e4502ef54","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\/"}]}},"acf":[],"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","0":null,"1":"","2":"","3":"","4":"","5":"","6":"","7":"","8":""}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2572","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=2572"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/2572\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media\/2574"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/media?parent=2572"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=2572"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=2572"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=2572"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}