{"id":1634,"date":"2014-12-16T19:33:39","date_gmt":"2014-12-16T19:33:38","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=1634"},"modified":"2025-06-13T23:50:11","modified_gmt":"2025-06-14T06:50:11","slug":"how-move-mysql-couchbase-server-20-part-2","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/pt\/how-move-mysql-couchbase-server-20-part-2\/","title":{"rendered":"Como migrar do MySQL para o Couchbase Server 2.0: Parte 2"},"content":{"rendered":"<div class=\"post\">\n<div class=\"post-content\">\n<div class=\"text\">\n<p>Em minha <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/how-move-mysql-couchbase-server-20-part-1\/\">\u00faltima pe\u00e7a<\/a>No artigo anterior, analisamos a mec\u00e2nica b\u00e1sica do MySQL e do Couchbase Server 2.0 e comparamos as formas de modelar os dados e como as consultas b\u00e1sicas e as listas de registros funcionam, desde a instru\u00e7\u00e3o SQL do MySQL at\u00e9 a visualiza\u00e7\u00e3o do Couchbase Server.<\/p>\n<p>Desta vez, come\u00e7aremos analisando como escrever essas visualiza\u00e7\u00f5es e elementos espec\u00edficos das consultas SQL, como as cl\u00e1usulas WHERE e GROUP BY, e o processo de migra\u00e7\u00e3o real dos dados e da l\u00f3gica do aplicativo para o Couchbase Server.<\/p>\n<h3>Pense nas consultas que voc\u00ea deseja executar<\/h3>\n<p>Como j\u00e1 vimos, a consulta a um banco de dados do Couchbase Server \u00e9, na verdade, um processo de dois est\u00e1gios. A primeira etapa envolve a cria\u00e7\u00e3o de uma visualiza\u00e7\u00e3o dos seus dados que ofere\u00e7a suporte \u00e0 pesquisa ou sele\u00e7\u00e3o nos documentos do seu banco de dados. A segunda parte \u00e9 o URL e os valores-chave que voc\u00ea deseja selecionar na visualiza\u00e7\u00e3o. Isso significa que, ao pensar em como deseja obter as informa\u00e7\u00f5es do banco de dados do Couchbase, voc\u00ea precisa pensar em como deseja pesquisar os dados, e isso permitir\u00e1 que voc\u00ea defina a estrutura da visualiza\u00e7\u00e3o que precisa ser escrita.<\/p>\n<p>O Couchbase Server usa exibi\u00e7\u00f5es para criar listas de documentos do banco de dados, e a sa\u00edda de uma exibi\u00e7\u00e3o \u00e9 uma chave e um valor correspondente. Tanto as chaves quanto os valores podem ser qualquer valor JSON. A chave na sa\u00edda \u00e9 importante porque forma a base do mecanismo de pesquisa, classifica\u00e7\u00e3o e pagina\u00e7\u00e3o.<\/p>\n<p>Por exemplo, uma fun\u00e7\u00e3o de visualiza\u00e7\u00e3o que apenas gera todos os documentos de receita no banco de dados, usando o t\u00edtulo da receita como chave, pode ter a seguinte apar\u00eancia:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">function(doc) {<br \/>\nSe (doc.type === 'recipe' &amp;&amp;<br \/>\ndoc.title !== null) {<br \/>\nemit(doc.title, null);<br \/>\n}<br \/>\n}<\/div>\n<\/div>\n<p>Isso \u00e9 chamado de fun\u00e7\u00e3o map - ela mapeia as informa\u00e7\u00f5es dos documentos em um formato que voc\u00ea deseja usar. Uma segunda etapa opcional \u00e9 chamada de fun\u00e7\u00e3o de redu\u00e7\u00e3o e \u00e9 an\u00e1loga \u00e0s fun\u00e7\u00f5es de agrega\u00e7\u00e3o do MySQL e \u00e0 cl\u00e1usula GROUP BY.<\/p>\n<p>Ao migrar do MySQL, a constru\u00e7\u00e3o de suas exibi\u00e7\u00f5es para corresponder \u00e0s informa\u00e7\u00f5es que voc\u00ea deseja gerar ou consultar tamb\u00e9m pode afetar a forma como voc\u00ea armazena as informa\u00e7\u00f5es. Vamos voltar ao exemplo da receita. No MySQL, voc\u00ea usaria uma consulta na tabela de ingredientes para comparar com cenoura e obter uma lista de receitas correspondentes. Por exemplo, como uma consulta SQL, voc\u00ea expressaria isso como :<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">SELECT receita.id, receita.t\u00edtulo FROM ingredientes join (receita) on<br \/>\n(ingredients.recipeid = recipe.id) where ingredient = 'carrot' (ingredientes.recipeid = receita.id)<\/div>\n<\/div>\n<p>No Couchbase, uma maneira de obter o mesmo resultado \u00e9 escrever uma visualiza\u00e7\u00e3o que produza uma linha para cada ingrediente do nosso documento de receita, assim:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">function(doc) {<br \/>\nSe (doc.type == 'recipe' &amp;&amp;<br \/>\ndoc.title !== null) {<br \/>\npara id em doc.ingredients {<br \/>\nemit(doc.ingredients[id].ingredient, null);<br \/>\n}<br \/>\n}<br \/>\n}<\/div>\n<\/div>\n<p>Para consultar, voc\u00ea deve especificar a chave da sa\u00edda que deseja corresponder. A consulta \u00e9 realizada pela API REST ou pela biblioteca do cliente, mas a especifica\u00e7\u00e3o \u00e9 a mesma. Por exemplo, se quiser pesquisar \"cenouras\", voc\u00ea deve especificar isso como a chave que est\u00e1 procurando. Usando a API REST:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">https:\/\/localhost:8092\/recipes\/_design\/dev_ingred\/_view\/byingred?key=%22carrots%22&amp;connection_timeout=60000&amp;limit=10&amp;skip=0<\/div>\n<\/div>\n<p>Lembre-se de que a chave \u00e9 qualquer valor JSON, portanto, os valores de chave que voc\u00ea fornece \u00e0 consulta tamb\u00e9m devem ser JSON codificados corretamente. Como voc\u00ea pode ver neste exemplo, a visualiza\u00e7\u00e3o fornece a base da sua consulta e o banco de dados acessa o mecanismo de sele\u00e7\u00e3o.<\/p>\n<p>O uso de exibi\u00e7\u00f5es dessa forma significa que a maioria dos aplicativos acabar\u00e1 sendo constru\u00edda com v\u00e1rias exibi\u00e7\u00f5es simult\u00e2neas. O processo de cria\u00e7\u00e3o das exibi\u00e7\u00f5es n\u00e3o \u00e9 diferente da constru\u00e7\u00e3o das consultas principais dentro do aplicativo e, em seguida, da otimiza\u00e7\u00e3o da consulta e dos \u00edndices que produzem o resultado. A principal diferen\u00e7a \u00e9 que a defini\u00e7\u00e3o da visualiza\u00e7\u00e3o \u00e9 armazenada no banco de dados, e n\u00e3o como uma consulta no c\u00f3digo do aplicativo.<\/p>\n<h3>Agrega\u00e7\u00f5es<\/h3>\n<p>No MySQL, a agrega\u00e7\u00e3o \u00e9 usada em v\u00e1rios lugares diferentes. A agrega\u00e7\u00e3o \u00e9 tratada por uma combina\u00e7\u00e3o da cl\u00e1usula GROUP BY e fun\u00e7\u00f5es que coletam ou resumem as informa\u00e7\u00f5es. Usando nosso exemplo de receita novamente, podemos executar uma consulta que forne\u00e7a uma contagem das diferentes receitas pelos ingredientes que elas cont\u00eam. Por exemplo, uma consulta como esta:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">SELECT ingrediente,count(recipeid) FROM ingredientes GROUP BY ingrediente<\/div>\n<\/div>\n<p>vai nos fornecer uma lista de ingredientes, com uma contagem ao lado de cada um para mostrar quantas receitas t\u00eam aquele ingrediente. Em um aplicativo final, isso comp\u00f5e os \"ingredientes da receita mais quente\" ou, em outros aplicativos, a \"postagem de blog mais popular\" e assim por diante.<\/p>\n<p>Por exemplo, para obter o equivalente ao que foi dito acima, podemos usar a mesma fun\u00e7\u00e3o map que usamos acima. Em seguida, podemos usar uma das fun\u00e7\u00f5es de redu\u00e7\u00e3o incorporadas, _count, que produzir\u00e1 uma contagem com base no n\u00famero de chaves exclusivas geradas pela fun\u00e7\u00e3o emit(). Se houver uma fun\u00e7\u00e3o de redu\u00e7\u00e3o, ela ser\u00e1 usada automaticamente quando a exibi\u00e7\u00e3o for acessada. O acesso \u00e0 visualiza\u00e7\u00e3o produz uma lista do n\u00famero de receitas para ingredientes individuais:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">{\"rows\":[<br \/>\n{\"key\": \"banana\", \"value\":20},<br \/>\n{\"key\": \"bananas\", \"value\":33},<br \/>\n{\"key\": \"baps\", \"value\":1},<br \/>\n{\"key\": \"barbecue sauce\", \"value\":1},<br \/>\n{\"key\": \"basmati rice\", \"value\":16},<br \/>\n{\"key\": \"bay leaf\", \"value\":58},<br \/>\n{\"key\": \"bay leaves\", \"value\":35},<br \/>\n{\"key\": \"bean sprouts\", \"value\":18},<br \/>\n{\"key\": \"bean thread noodles\", \"value\":1},<br \/>\n{\"key\": \"beef braising steak\", \"value\":17}<br \/>\n]<br \/>\n}<\/div>\n<\/div>\n<p>As fun\u00e7\u00f5es de agrega\u00e7\u00e3o e redu\u00e7\u00e3o tamb\u00e9m podem ser usadas para outras opera\u00e7\u00f5es. Por exemplo, na parte 1, mostrei uma receita com informa\u00e7\u00f5es de tempo para a prepara\u00e7\u00e3o e o cozimento. Poder\u00edamos usar uma fun\u00e7\u00e3o map e reduce juntas para obter o tempo total de cozimento de cada receita. Primeiro, escreva uma fun\u00e7\u00e3o de mapa que produza o t\u00edtulo da receita como chave e as informa\u00e7\u00f5es de tempo de cozimento como um valor:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">function (doc, meta) {<br \/>\nif (doc.title) {<br \/>\nemit(doc.title, parseInt(doc.preptime));<br \/>\nemit(doc.title, parseInt(doc.cooktime));<br \/>\n}<br \/>\n}<\/div>\n<\/div>\n<div>Garantimos que a sa\u00edda do valor seja um n\u00famero (usando a fun\u00e7\u00e3o JavaScript parseInt()). O uso da fun\u00e7\u00e3o _sum incorporada far\u00e1 com que a exibi\u00e7\u00e3o calcule o total de todos os valores em rela\u00e7\u00e3o a uma determinada chave (o t\u00edtulo da nossa receita):<\/div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\"><\/div>\n<\/div>\n<div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">{\"rows\":[<br \/>\n{\"key\": \"Apple pie\", \"value\":55},<br \/>\n{\"key\": \"Apricot cheesecake\", \"value\":70},<br \/>\n{\"key\": \"Barbecued aubergine\", \"value\":10},<br \/>\n{\"key\": \"Barbecued beefburgers\", \"value\":30},<br \/>\n{\"key\": \"Barbecued corn on the cob slices\", \"value\":13},<br \/>\n{\"key\": \"Beef in red wine\", \"value\":144},<br \/>\n{\"key\": \"Blue cheese and tomato dip\", \"value\":5},<br \/>\n{\"key\": \"Cajun chicken\", \"value\":20},<br \/>\n{\"key\": \"Caribbean cobbler stew\", \"value\":95},<br \/>\n{\"key\": \"Chappati or roti\", \"value\":45}<br \/>\n]<\/div>\n<\/div>\n<p>No SQL, voc\u00ea pode simplesmente armazenar o tempo total de cozimento na tabela para facilitar a consulta dessas informa\u00e7\u00f5es. No Couchbase, podemos usar a capacidade de processar e combinar informa\u00e7\u00f5es ao criar a visualiza\u00e7\u00e3o.<\/p>\n<\/div>\n<h3>Consultas de intervalo<\/h3>\n<p>Para consultas mais complexas, em que voc\u00ea est\u00e1 selecionando v\u00e1rios campos, \u00e9 necess\u00e1rio criar uma exibi\u00e7\u00e3o adequada e, em seguida, usar o argumento chave da consulta para especificar o que est\u00e1 procurando. Quando quiser extrair informa\u00e7\u00f5es de um intervalo de valores, voc\u00ea pode usar a chave inicial e a chave final para especificar o intervalo a ser retornado pela exibi\u00e7\u00e3o. Por exemplo, a constru\u00e7\u00e3o de uma exibi\u00e7\u00e3o com o tempo de cozimento como chave permitiria a sa\u00edda de uma lista de todas as receitas correspondentes em que o tempo de cozimento estivesse entre 5 e 25 minutos:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\"><span style=\"font-size: 16px\">https:\/\/localhost:8092<\/span>\/recipes\/_design\/recipes\/_view\/by_cooktime?startkey=%225%22&amp;endkey=%2225%22<\/div>\n<\/div>\n<p>Isso \u00e9 an\u00e1logo a:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">SELECT title FROM recipe WHERE cooktime &gt;= 5 AND cooktime &lt;= 25<\/div>\n<\/div>\n<h3>Consulta em v\u00e1rios campos<\/h3>\n<p>Para consultar v\u00e1rios campos, voc\u00ea precisa criar uma exibi\u00e7\u00e3o que produza os dois (ou mais) campos que voc\u00ea deseja consultar. Ao procurar receitas, por exemplo, \u00e9 bastante comum querer procurar receitas com um determinado ingrediente, mas tamb\u00e9m dentro de um determinado limite de tempo. Quando voc\u00ea abre a geladeira 30 minutos antes de sair e encontra tomates, voc\u00ea quer saber o que pode cozinhar em 20 minutos com tomates. Para fazer isso, produzimos uma exibi\u00e7\u00e3o que emite uma chave com o ingrediente e o tempo necess\u00e1rio para preparar a receita, assim:<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><span style=\"color: #003366;font-weight: bold\">fun\u00e7\u00e3o<\/span> <span style=\"color: #009900\">(<\/span>doc<span style=\"color: #339933\">,<\/span> meta<span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">se<\/span> <span style=\"color: #009900\">(<\/span>doc.<span style=\"color: #660066\">ingredientes<\/span><span style=\"color: #009900\">)<\/span> <span style=\"color: #009900\">{<\/span><br \/>\n<span style=\"color: #000066;font-weight: bold\">para<\/span> <span style=\"color: #009900\">(<\/span>i<span style=\"color: #339933\">=<\/span><span style=\"color: #cc0000\">0<\/span><span style=\"color: #339933\">;<\/span> i <span style=\"color: #339933\">&lt;<\/span> doc.<span style=\"color: #660066\">ingredientes<\/span>.<span style=\"color: #660066\">comprimento<\/span><span style=\"color: #339933\">;<\/span> i<span style=\"color: #339933\">++<\/span><span style=\"color: #009900\">)<\/span> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0<span style=\"color: #009900\">{<\/span> \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 \u00a0 <span style=\"color: #000066;font-weight: bold\">se<\/span> <span style=\"color: #009900\">(<\/span>doc.<span style=\"color: #660066\">ingredientes<\/span><span style=\"color: #009900\">[<\/span>i<span style=\"color: #009900\">]<\/span>.<span style=\"color: #660066\">ingrediente<\/span> <span style=\"color: #339933\">!=<\/span> <span style=\"color: #003366;font-weight: bold\">nulo<\/span><span style=\"color: #009900\">)<\/span><br \/>\n<span style=\"color: #009900\">{<\/span><br \/>\nemitir<span style=\"color: #009900\">(<\/span><span style=\"color: #009900\">[<\/span>doc.<span style=\"color: #660066\">ingredientes<\/span><span style=\"color: #009900\">[<\/span>i<span style=\"color: #009900\">]<\/span>.<span style=\"color: #660066\">ingrediente<\/span><span style=\"color: #339933\">,<\/span> parseInt<span style=\"color: #009900\">(<\/span>doc.<span style=\"color: #660066\">tempo total<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #009900\">]<\/span><span style=\"color: #339933\">,<\/span> <span style=\"color: #003366;font-weight: bold\">nulo<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #339933\">;<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><br \/>\n<span style=\"color: #009900\">}<\/span><\/div>\n<\/div>\n<div>Agora, para obter todas as receitas com tomates que podem ser preparadas em 20 minutos, podemos pesquisar:<\/div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[\"tomates\",20]<\/div>\n<\/div>\n<div>Ou de forma mais expl\u00edcita:<\/div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">https:\/\/localhost:8092\/recipes\/_design\/dev_bytime\/_view\/byingredtime?full_set=true&amp;key=%5B%22tomatoes%22%2C20%5D&amp;stale=false&amp;connection_timeout=60000&amp;limit=10&amp;skip=0<\/div>\n<\/div>\n<div>\u00c9 claro que, se voc\u00ea tem 20 minutos para preparar uma receita, voc\u00ea tem menos de 20 minutos. Ent\u00e3o, de fato, podemos usar uma consulta de intervalo com uma chave inicial de [\"tomates\",0] e uma chave final de [\"tomates\",20] e agora obteremos todas as receitas que podem ser preparadas em 20 minutos contendo cenouras:<\/div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">{\"total_rows\":27446, \"rows\":[<br \/>\n{\u201cid\u201d:\u201d4997AFDE-3027-11E2-BB0D-B67A7E241592\u2033,\u201dkey\u201d:[\u201ctomatoes\u201d,5],\u201dvalue\u201d:null},<br \/>\n{\u201cid\u201d:\u201d79C16D8A-3027-11E2-BB0D-B67A7E241592\u2033,\u201dkey\u201d:[\u201ctomatoes\u201d,5],\u201dvalue\u201d:null},<br \/>\n{\u201cid\u201d:\u201dCF52D23E-3027-11E2-BB0D-B67A7E241592\u2033,\u201dkey\u201d:[\u201ctomatoes\u201d,5],\u201dvalue\u201d:null},<br \/>\n{\u201cid\u201d:\u201d42F5D520-3027-11E2-BB0D-B67A7E241592\u2033,\u201dkey\u201d:[\u201ctomatoes\u201d,6],\u201dvalue\u201d:null},<br \/>\n{\u201cid\u201d:\u201d1A0AB61C-3027-11E2-BB0D-B67A7E241592\u2033,\u201dkey\u201d:[\u201ctomatoes\u201d,8],\u201dvalue\u201d:null},<br \/>\n{\u201cid\u201d:\u201d4D0F9DF2-3027-11E2-BB0D-B67A7E241592\u2033,\u201dkey\u201d:[\u201ctomatoes\u201d,8],\u201dvalue\u201d:null},<br \/>\n{\u201cid\u201d:\u201d50CE1676-3027-11E2-BB0D-B67A7E241592\u2033,\u201dkey\u201d:[\u201ctomatoes\u201d,10],\u201dvalue\u201d:null},<br \/>\n{\u201cid\u201d:\u201d564A66CC-3027-11E2-BB0D-B67A7E241592\u2033,\u201dkey\u201d:[\u201ctomatoes\u201d,10],\u201dvalue\u201d:null},<br \/>\n{\u201cid\u201d:\u201d95E9464A-3027-11E2-BB0D-B67A7E241592\u2033,\u201dkey\u201d:[\u201ctomatoes\u201d,10],\u201dvalue\u201d:null},<br \/>\n{\u201cid\u201d:\u201d9A78477E-3027-11E2-BB0D-B67A7E241592\u2033,\u201dkey\u201d:[\u201ctomatoes\u201d,10],\u201dvalue\u201d:null}<br \/>\n]<br \/>\n}<\/div>\n<\/div>\n<\/div>\n<p>Legal! Em compara\u00e7\u00e3o com a instru\u00e7\u00e3o SQL:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">SELECT recipeid from recipes JOIN ingredients ON (ingredients.recipeid = recipe.recipeid) WHERE ingredients.ingredient = 'tomatoes' and totaltime &lt;= 20<\/div>\n<\/div>\n<p>A prop\u00f3sito, observe que obtemos o ID de cada documento para que possamos carregar o documento e, portanto, a receita. Talvez n\u00e3o tenhamos o t\u00edtulo da receita em nossa sa\u00edda, mas as bibliotecas de clientes podem carregar automaticamente as informa\u00e7\u00f5es do documento para n\u00f3s. A parte dif\u00edcil \u00e9 realizar a pesquisa.<\/p>\n<h3>Classifica\u00e7\u00e3o da sa\u00edda da visualiza\u00e7\u00e3o<\/h3>\n<p>A classifica\u00e7\u00e3o da sa\u00edda de uma visualiza\u00e7\u00e3o \u00e9 autom\u00e1tica. A sa\u00edda de cada visualiza\u00e7\u00e3o \u00e9 classificada automaticamente pela chave gerada por cada visualiza\u00e7\u00e3o. Isso \u00e9 necess\u00e1rio porque, sem isso, a consulta de intervalo seria imposs\u00edvel de ser realizada. Isso torna algumas opera\u00e7\u00f5es r\u00e1pidas e f\u00e1ceis. Se voc\u00ea quiser gerar uma lista de receitas em ordem alfab\u00e9tica pelo t\u00edtulo, crie uma visualiza\u00e7\u00e3o que gere o t\u00edtulo da receita como chave. Isso significa que a fun\u00e7\u00e3o map:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">fun\u00e7\u00e3o (doc, meta)<br \/>\n{<br \/>\nemit(doc.title, null);<br \/>\n}<\/div>\n<\/div>\n<div>Acessado por meio da op\u00e7\u00e3o Exibir como:<\/div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\"><span style=\"font-size: 16px\">https:\/\/localhost:8092<\/span>\/recipes\/_design\/recipes\/_view\/by_title<\/div>\n<\/div>\n<p>\u00c9 an\u00e1logo a:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">SELECT title FROM recipe ORDER BY title<\/div>\n<\/div>\n<p>Para obter uma lista em ordem decrescente no MySQL, use a palavra-chave DESC:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">SELECT title FROM recipe ORDER BY title DESC<\/div>\n<\/div>\n<p>No Couchbase Server, voc\u00ea usa o par\u00e2metro descendente para o URL:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\"><span style=\"font-size: 16px\">https:\/\/localhost:8092\/recipes<\/span>\/_design\/recipes\/_view\/by_title?descending=true<\/div>\n<\/div>\n<h3>Pagina\u00e7\u00e3o<\/h3>\n<p>No MySQL, a pagina\u00e7\u00e3o \u00e9 feita usando uma combina\u00e7\u00e3o das cl\u00e1usulas LIMIT e OFFSET, por exemplo, para obter os primeiros 10 registros da nossa consulta de t\u00edtulo de receita:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">SELECT title FROM recipe ORDER BY title LIMIT 10<\/div>\n<\/div>\n<p>Para obter os pr\u00f3ximos 10 registros:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">SELECT title FROM recipe ORDER BY title LIMIT 10 OFFSET 10<\/div>\n<\/div>\n<p>Com o Couchbase Server, voc\u00ea usa uma configura\u00e7\u00e3o semelhante, fornecendo os argumentos limit e skip \u00e0 consulta de visualiza\u00e7\u00e3o. Para obter os dez primeiros registros:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\"><span style=\"font-size: 16px\">https:\/\/localhost:8092\/recipes<\/span>\/_design\/recipes\/_view\/by_title?limit=10<\/div>\n<\/div>\n<p>E os pr\u00f3ximos 10 registros:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\"><span style=\"font-size: 16px\">https:\/\/localhost:8092\/recipes<\/span>\/_design\/recipes\/_view\/by_title?limit=10&amp;skip=10<\/div>\n<\/div>\n<p>Quando se trata de blocos de p\u00e1ginas relativamente curtos, isso funciona bem. No caso de p\u00e1ginas mais longas, ou quando \u00e9 poss\u00edvel que voc\u00ea esteja pulando um grande n\u00famero de linhas de sa\u00edda, \u00e9 poss\u00edvel usar startkey_docid para avan\u00e7ar na exibi\u00e7\u00e3o. Isso \u00e9 mais eficiente para esses cen\u00e1rios de pagina\u00e7\u00e3o mais longos. Verifique o <a href=\"https:\/\/www.couchbase.com\/blog\/pt\/docs\/couchbase-manual-2.0\/couchbase-views-writing-querying-pagination.html\/\">documenta\u00e7\u00e3o<\/a> para obter mais informa\u00e7\u00f5es.<\/p>\n<h3>Carregando o objeto principal<\/h3>\n<p>Em nosso exemplo de banco de dados de receitas no MySQL, h\u00e1 v\u00e1rias tabelas necess\u00e1rias para carregar as informa\u00e7\u00f5es do banco de dados sobre uma \u00fanica receita para que ela possa ser exibida. No Couchbase Server, quando voc\u00ea tiver o ID do documento de uma determinada receita, ter\u00e1 acesso a toda a estrutura de registro da receita, pois ela foi armazenada no banco de dados do Couchbase Server.<\/p>\n<p>Com o MySQL, a necessidade de simplificar o mecanismo de carregamento de objetos t\u00e3o complexos levou a v\u00e1rios projetos de suporte diferentes que podem ser usados como uma forma de armazenar em cache os dados complexos carregados para que fiquem mais acess\u00edveis (memcached, por exemplo). O Couchbase Server n\u00e3o elimina a necessidade de carregar as informa\u00e7\u00f5es do banco de dados, mas faz com que o carregamento do registro da receita seja uma \u00fanica opera\u00e7\u00e3o, em vez de v\u00e1rias consultas e formata\u00e7\u00e3o desses dados na estrutura usada para exibi\u00e7\u00e3o.<\/p>\n<p>No SQL, por exemplo, voc\u00ea pode carregar os dados da receita examinando as tabelas individuais e construindo seu objeto, executando v\u00e1rias consultas diferentes:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">SELECT * FROM recipe WHERE recipeid=23434<br \/>\nSELECT * FROM ingredients WHERE recipeid=23434<br \/>\nSELECT * FROM methods WHERE recipeid=23434<br \/>\nSELECT * FROM keywords WHERE recipeid=23434<\/div>\n<\/div>\n<div>Quando voc\u00ea souber o ID do documento, obter o conte\u00fado de todo o documento \u00e9 uma \u00fanica consulta ao Couchbase Server. Por exemplo, se voc\u00ea obtiver o ID do documento Aromaticroastchicken da nossa visualiza\u00e7\u00e3o \"por ingrediente\", poderei obter a receita inteira para exibi\u00e7\u00e3o com uma \u00fanica solicita\u00e7\u00e3o GET usando a biblioteca do cliente. Por exemplo, em PHP:<\/div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">$recipe = couchbase-&gt;get('Aromaticroastchicken');<\/div>\n<\/div>\n<p>O resultado s\u00e3o os dados da receita como JSON:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\n<p>{<br \/>\n\"title\" : \"Aromatic roast chicken\" (Frango assado arom\u00e1tico),<br \/>\n\"preptime\" : \"15\",<br \/>\n\"por\u00e7\u00f5es\" : \"6\",<br \/>\n\"totaltime\" : \"120\",<br \/>\n\"subtitle\" : \"Um recheio de cuscuz e temperos arom\u00e1ticos com lim\u00e3o perfumado e alho assado transformam um simples frango assado em algo especial\",<br \/>\n\"cooktime\" : \"105\",<br \/>\n\"palavras-chave\" : [<br \/>\n\"diet@dairy-free\",<br \/>\n\"cook method.hob, oven, grill@oven\",<br \/>\n\"diet@peanut-free\",<br \/>\n\"cole\u00e7\u00f5es especiais@cheffy recomendado\",<br \/>\n\"diet@corn-free\",<br \/>\n\"cole\u00e7\u00f5es especiais@refei\u00e7\u00e3o de fim de semana\",<br \/>\n\"occasion@entertaining\",<br \/>\n\"cole\u00e7\u00f5es especiais@muito f\u00e1cil\",<br \/>\n\"diet@yeast-free\",<br \/>\n\"diet@shellfish-free\",<br \/>\n\"cole\u00e7\u00f5es especiais@feeling spicy!\",<br \/>\n\"main ingredient@poultry\" (ingrediente principal@aves),<br \/>\n\"diet@demi-veg\",<br \/>\n\"meal type@main\",<br \/>\n\"diet@egg-free\",<br \/>\n\"diet@cow sem latic\u00ednios\"<br \/>\n],<br \/>\n\"ingredientes\" : [<br \/>\n&#8230;<br \/>\n],<br \/>\n\"method\" : [<br \/>\n&#8230;<br \/>\n],<\/p>\n<p>}<\/p>\n<\/div>\n<\/div>\n<p>Uma consulta, uma solicita\u00e7\u00e3o ao banco de dados para carregar tudo o que \u00e9 necess\u00e1rio para exibir a receita em uma \u00fanica p\u00e1gina. Outros conte\u00fados poderiam ser inclu\u00eddos aqui, \u00e9 claro, coment\u00e1rios de usu\u00e1rios, metadados adicionais, todos armazenados em um \u00fanico documento e a uma \u00fanica solicita\u00e7\u00e3o de dist\u00e2ncia.<\/p>\n<h3>Migra\u00e7\u00e3o dos dados<\/h3>\n<p>A formata\u00e7\u00e3o dos dados traz \u00e0 tona outro ponto importante ao pensar nessa migra\u00e7\u00e3o quando iniciei o processo. Pense em seus dados e em como eles ser\u00e3o usados. Se voc\u00ea exibe informa\u00e7\u00f5es que, no MySQL, v\u00eam de v\u00e1rias fontes, faz sentido agrupar essas informa\u00e7\u00f5es e armazen\u00e1-las no Couchbase Sever como um \u00fanico documento.\u00a0<span style=\"font-family: ff-meta-serif-web-pro-1, ff-meta-serif-web-pro-2, Georgia, 'Times New Roman', Times, serif;font-size: 16px;font-style: normal\">\u00a0<\/span><\/p>\n<p>Como j\u00e1 foi mencionado, muitos mecanismos de acelera\u00e7\u00e3o usados com o MySQL funcionam com base no armazenamento em cache das informa\u00e7\u00f5es depois de terem sido carregadas de v\u00e1rias fontes para acelerar o carregamento de estruturas e informa\u00e7\u00f5es t\u00e3o complexas.<\/p>\n<p>O mesmo princ\u00edpio b\u00e1sico \u00e9 verdadeiro com o Couchbase Server, levando em conta as ressalvas que mencionei acima sobre a estrutura. Voc\u00ea precisa ter certeza de que a estrutura criada permite a constru\u00e7\u00e3o de uma visualiza\u00e7\u00e3o que torne o conte\u00fado pesquis\u00e1vel, se esses dados forem a forma como voc\u00ea deseja extrair os documentos do banco de dados.<\/p>\n<p>Por exemplo, em nossa estrutura de receitas, n\u00e3o faz sentido armazenar os ingredientes em um \u00fanico campo de texto e perder os detalhes do conte\u00fado. Isso \u00e9 semelhante a colocar tudo em uma \u00fanica coluna de texto no MySQL e tem as mesmas armadilhas: dificulta a pesquisa e a consulta do conte\u00fado e complica as possibilidades de visualiza\u00e7\u00e3o e exibi\u00e7\u00e3o.<\/p>\n<p>O processo de migra\u00e7\u00e3o real deve ser bastante simples. Carregue as informa\u00e7\u00f5es do MySQL, crie um documento para cada objeto principal em seu banco de dados e, em seguida, escreva os documentos em um servidor Couchbase.\u00a0<span style=\"font-family: ff-meta-serif-web-pro-1, ff-meta-serif-web-pro-2, Georgia, 'Times New Roman', Times, serif;font-size: 16px;font-style: normal\">Na verdade, voc\u00ea pode at\u00e9 usar esse m\u00e9todo para migrar as informa\u00e7\u00f5es em um aplicativo em execu\u00e7\u00e3o. Em vez disso, tente carregar o item do Couchbase e, se ele n\u00e3o existir, carregue-o do MySQL e, em seguida, armazene o objeto estruturado no Couchbase.\u00a0<\/span><\/p>\n<p>Os documentos no Couchbase s\u00e3o armazenados por seu ID. O ID pode ser qualquer cadeia de caracteres que voc\u00ea desejar, o que significa que voc\u00ea pode usar algo identific\u00e1vel para voc\u00ea ou para o seu aplicativo sem ter que depender sempre de uma visualiza\u00e7\u00e3o para encontr\u00e1-lo. Para usar nosso banco de dados de receitas sempre presente, voc\u00ea poderia usar o t\u00edtulo da receita, por exemplo, \"Fish Stew\" (ensopado de peixe). A limita\u00e7\u00e3o dessa abordagem (assim como no MySQL e nos \u00edndices exclusivos) \u00e9 que voc\u00ea n\u00e3o pode armazenar dois documentos com o mesmo ID, e h\u00e1 muitas receitas diferentes de ensopado de peixe por a\u00ed. Como alternativa, voc\u00ea poderia usar um UUID ou usar o t\u00edtulo da receita com um sufixo para permitir v\u00e1rias receitas \"Fish Stew\".<\/p>\n<p>Assim como na op\u00e7\u00e3o de campo MySQL AUTO_INCREMENT, o Couchbase gerar\u00e1 automaticamente um UUID para cada documento. Isso n\u00e3o \u00e9 obrigat\u00f3rio; voc\u00ea pode armazenar tanto documentos com um ID de documento espec\u00edfico quanto IDs gerados automaticamente no mesmo banco de dados, o que significa que voc\u00ea pode usar IDs conhecidos para armazenar informa\u00e7\u00f5es espec\u00edficas e IDs gerados automaticamente para o corpo principal de dados.<\/p>\n<h3>Concluindo<\/h3>\n<p>A principal diferen\u00e7a entre o Couchbase e o MySQL \u00e9 a representa\u00e7\u00e3o dos dados e como voc\u00ea os acessa. Para determinados modelos de dados, o Couchbase oferece uma solu\u00e7\u00e3o mais simples para o problema de carregar os dados no estilo de objeto \u00fanico que vimos demonstrados nestes artigos. As receitas s\u00e3o um bom exemplo em que o elemento principal do armazenamento de dados \u00e9 a receita como um todo (nosso documento). A capacidade de pesquisar e localizar dados de receitas e apresent\u00e1-los como uma lista \u00e9 um requisito em termos da forma como precisamos apresentar e acessar os dados, n\u00e3o um requisito relacionado \u00e0 forma como eles s\u00e3o armazenados.<\/p>\n<p>Esperamos que essas duas publica\u00e7\u00f5es tenham lhe dado algumas ideias sobre como seus dados podem ser movidos do MySQL para o Couchase Server e como modelar e desenvolver os dados do Couchbase Server e o c\u00f3digo do aplicativo para fazer com que o sistema funcione e opere como sua infraestrutura existente baseada no MySQL.<\/p>\n<\/div>\n<\/div>\n<p>#next_pages_container { width: 5px; hight: 5px; position: absolute; top: -100px; left: -100px; z-index: 2147483647 !important; }<\/p>\n<div id=\"_clearly_component__next_pages_container\"><\/div>\n<p>#next_pages_container { width: 5px; hight: 5px; position: absolute; top: -100px; left: -100px; z-index: 2147483647 !important; }<\/p>\n<div id=\"_clearly_component__next_pages_container\"><\/div>\n<p>#next_pages_container { width: 5px; hight: 5px; position: absolute; top: -100px; left: -100px; z-index: 2147483647 !important; }<\/p>\n<div id=\"_clearly_component__next_pages_container\"><\/div>\n<p>#next_pages_container { width: 5px; hight: 5px; position: absolute; top: -100px; left: -100px; z-index: 2147483647 !important; }<\/p>\n<div id=\"_clearly_component__next_pages_container\"><\/div>\n<p>#next_pages_container { width: 5px; hight: 5px; position: absolute; top: -100px; left: -100px; z-index: 2147483647 !important; }<\/p>\n<div id=\"_clearly_component__next_pages_container\"><\/div>\n<p>#next_pages_container { width: 5px; hight: 5px; position: absolute; top: -100px; left: -100px; z-index: 2147483647 !important; }<\/p>\n<div id=\"_clearly_component__next_pages_container\"><\/div>\n<p>#next_pages_container { width: 5px; hight: 5px; position: absolute; top: -100px; left: -100px; z-index: 2147483647 !important; }<\/p>\n<div id=\"_clearly_component__next_pages_container\"><\/div>","protected":false},"excerpt":{"rendered":"<p>In my last piece, we looked at the basic mechanics of MySQL and Couchbase Server 2.0, and compared the ways in which you would model the data, and how the basic queries and lists of records operate, from the MySQL [&hellip;]<\/p>","protected":false},"author":35,"featured_media":13873,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1816],"tags":[1336],"ppma_author":[9012],"class_list":["post-1634","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-couchbase-server","tag-mysql"],"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>How to Move from MySQL to Couchbase Server 2.0: Part 2 - 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\/how-move-mysql-couchbase-server-20-part-2\/\" \/>\n<meta property=\"og:locale\" content=\"pt_BR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Move from MySQL to Couchbase Server 2.0: Part 2\" \/>\n<meta property=\"og:description\" content=\"In my last piece, we looked at the basic mechanics of MySQL and Couchbase Server 2.0, and compared the ways in which you would model the data, and how the basic queries and lists of records operate, from the MySQL [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/pt\/how-move-mysql-couchbase-server-20-part-2\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-12-16T19:33:38+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T06:50:11+00:00\" \/>\n<meta name=\"author\" content=\"MC Brown\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"MC Brown\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/\"},\"author\":{\"name\":\"MC Brown\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/52986346eb631b1a48e46835090d367f\"},\"headline\":\"How to Move from MySQL to Couchbase Server 2.0: Part 2\",\"datePublished\":\"2014-12-16T19:33:38+00:00\",\"dateModified\":\"2025-06-14T06:50:11+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/\"},\"wordCount\":3092,\"commentCount\":5,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"keywords\":[\"mysql\"],\"articleSection\":[\"Couchbase Server\"],\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/\",\"name\":\"How to Move from MySQL to Couchbase Server 2.0: Part 2 - The Couchbase Blog\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png\",\"datePublished\":\"2014-12-16T19:33:38+00:00\",\"dateModified\":\"2025-06-14T06:50:11+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/#breadcrumb\"},\"inLanguage\":\"pt-BR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/#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\/how-move-mysql-couchbase-server-20-part-2\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Move from MySQL to Couchbase Server 2.0: Part 2\"}]},{\"@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\/52986346eb631b1a48e46835090d367f\",\"name\":\"MC Brown\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"pt-BR\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/dd98ed7be15f11839c69e0379e0894fa\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/a994eaa1c5f25839d2f602c410a8dc5080b3520d435d27e2d98c7ff87988355b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/a994eaa1c5f25839d2f602c410a8dc5080b3520d435d27e2d98c7ff87988355b?s=96&d=mm&r=g\",\"caption\":\"MC Brown\"},\"description\":\"Mc Brown is a Vice President, Technical Publications &amp; Education at Couchbase. Responsible for building the documentation &amp; supporting information.\",\"url\":\"https:\/\/www.couchbase.com\/blog\/pt\/author\/mc-brown\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"How to Move from MySQL to Couchbase Server 2.0: Part 2 - 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\/how-move-mysql-couchbase-server-20-part-2\/","og_locale":"pt_BR","og_type":"article","og_title":"How to Move from MySQL to Couchbase Server 2.0: Part 2","og_description":"In my last piece, we looked at the basic mechanics of MySQL and Couchbase Server 2.0, and compared the ways in which you would model the data, and how the basic queries and lists of records operate, from the MySQL [&hellip;]","og_url":"https:\/\/www.couchbase.com\/blog\/pt\/how-move-mysql-couchbase-server-20-part-2\/","og_site_name":"The Couchbase Blog","article_published_time":"2014-12-16T19:33:38+00:00","article_modified_time":"2025-06-14T06:50:11+00:00","author":"MC Brown","twitter_card":"summary_large_image","twitter_misc":{"Written by":"MC Brown","Est. reading time":"13 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/"},"author":{"name":"MC Brown","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/52986346eb631b1a48e46835090d367f"},"headline":"How to Move from MySQL to Couchbase Server 2.0: Part 2","datePublished":"2014-12-16T19:33:38+00:00","dateModified":"2025-06-14T06:50:11+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/"},"wordCount":3092,"commentCount":5,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","keywords":["mysql"],"articleSection":["Couchbase Server"],"inLanguage":"pt-BR","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/","url":"https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/","name":"How to Move from MySQL to Couchbase Server 2.0: Part 2 - The Couchbase Blog","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2022\/11\/couchbase-nosql-dbaas.png","datePublished":"2014-12-16T19:33:38+00:00","dateModified":"2025-06-14T06:50:11+00:00","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/#breadcrumb"},"inLanguage":"pt-BR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/"]}]},{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/#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\/how-move-mysql-couchbase-server-20-part-2\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to Move from MySQL to Couchbase Server 2.0: Part 2"}]},{"@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\/52986346eb631b1a48e46835090d367f","name":"MC Brown","image":{"@type":"ImageObject","inLanguage":"pt-BR","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/dd98ed7be15f11839c69e0379e0894fa","url":"https:\/\/secure.gravatar.com\/avatar\/a994eaa1c5f25839d2f602c410a8dc5080b3520d435d27e2d98c7ff87988355b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/a994eaa1c5f25839d2f602c410a8dc5080b3520d435d27e2d98c7ff87988355b?s=96&d=mm&r=g","caption":"MC Brown"},"description":"Mc Brown \u00e9 vice-presidente de publica\u00e7\u00f5es t\u00e9cnicas e educa\u00e7\u00e3o da Couchbase. Respons\u00e1vel pela cria\u00e7\u00e3o da documenta\u00e7\u00e3o e das informa\u00e7\u00f5es de suporte.","url":"https:\/\/www.couchbase.com\/blog\/pt\/author\/mc-brown\/"}]}},"authors":[{"term_id":9012,"user_id":35,"is_guest":0,"slug":"mc-brown","display_name":"MC Brown","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/a994eaa1c5f25839d2f602c410a8dc5080b3520d435d27e2d98c7ff87988355b?s=96&d=mm&r=g","first_name":"MC","last_name":"Brown","user_url":"","author_category":"","description":"Mc Brown \u00e9 vice-presidente de publica\u00e7\u00f5es t\u00e9cnicas e educa\u00e7\u00e3o da Couchbase. Respons\u00e1vel pela cria\u00e7\u00e3o da documenta\u00e7\u00e3o e das informa\u00e7\u00f5es de suporte."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1634","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\/35"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/comments?post=1634"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/posts\/1634\/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=1634"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/categories?post=1634"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/tags?post=1634"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/pt\/wp-json\/wp\/v2\/ppma_author?post=1634"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}