{"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\/es\/how-move-mysql-couchbase-server-20-part-2\/","title":{"rendered":"C\u00f3mo pasar de MySQL a Couchbase Server 2.0: Parte 2"},"content":{"rendered":"<div class=\"post\">\n<div class=\"post-content\">\n<div class=\"text\">\n<p>En mi <a href=\"https:\/\/www.couchbase.com\/blog\/es\/how-move-mysql-couchbase-server-20-part-1\/\">\u00faltima pieza<\/a>En este art\u00edculo, hemos visto la mec\u00e1nica b\u00e1sica de MySQL y Couchbase Server 2.0, y hemos comparado las formas en las que modelar\u00edas los datos, y c\u00f3mo operan las consultas b\u00e1sicas y las listas de registros, desde la sentencia SQL de MySQL, hasta la Vista de Couchbase Server.<\/p>\n<p>Esta vez, empezaremos viendo c\u00f3mo escribir esas Vistas y elementos espec\u00edficos de las consultas SQL, como las cl\u00e1usulas WHERE y GROUP BY, y el proceso de migrar realmente tus datos y l\u00f3gica de aplicaci\u00f3n a Couchbase Server.<\/p>\n<h3>Piense en las consultas que desea ejecutar<\/h3>\n<p>Como ya hemos visto, consultar una base de datos de Couchbase Server es en realidad un proceso de dos etapas. La primera etapa consiste en crear una vista sobre tus datos que soporte la b\u00fasqueda o selecci\u00f3n sobre los documentos de tu base de datos. La segunda parte es la URL y los valores clave que quieres seleccionar de la vista. Esto significa que cuando pienses en c\u00f3mo quieres obtener la informaci\u00f3n de tu base de datos Couchbase necesitas pensar en c\u00f3mo quieres buscar los datos, y eso te permitir\u00e1 definir la estructura de la vista que necesita ser escrita.<\/p>\n<p>Couchbase Server utiliza vistas para crear listas de documentos de la base de datos, y la salida de una vista es una clave y un valor correspondiente. Tanto las claves como los valores pueden ser cualquier valor JSON. La clave en la salida es significativa porque forma la base del mecanismo de b\u00fasqueda, ordenaci\u00f3n y paginaci\u00f3n.<\/p>\n<p>Por ejemplo, una funci\u00f3n de vista que s\u00f3lo muestre todos los documentos de recetas de la base de datos, utilizando el t\u00edtulo de la receta como clave, podr\u00eda tener este aspecto:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">function(doc) {<br \/>\nif (doc.type === 'receta' &amp;&amp;<br \/>\ndoc.title !== null) {<br \/>\nemit(doc.title, null);<br \/>\n}<br \/>\n}<\/div>\n<\/div>\n<p>Esto se denomina funci\u00f3n de mapeo: mapea la informaci\u00f3n de los documentos en el formato que se desee utilizar. Un segundo paso opcional se denomina funci\u00f3n de reducci\u00f3n, y es an\u00e1loga a las funciones de agregaci\u00f3n y la cl\u00e1usula GROUP BY de MySQL.<\/p>\n<p>Al migrar desde MySQL, la construcci\u00f3n de sus vistas para que coincidan con la informaci\u00f3n que desea mostrar o consultar tambi\u00e9n puede afectar a la forma de almacenar la informaci\u00f3n. Volvamos al ejemplo de la receta. En MySQL, utilizar\u00eda una consulta en la tabla de ingredientes para hacerla coincidir con zanahoria y obtener una lista de recetas coincidentes. Por ejemplo, como consulta SQL se expresar\u00eda como :<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">SELECT receta.id, receta.titulo FROM ingredientes join (receta) on<br \/>\n(ingredients.recipeid = recipe.id) donde ingredient = 'zanahoria'<\/div>\n<\/div>\n<p>En Couchbase, una forma de conseguir el mismo resultado es escribir una vista que genere una fila por cada ingrediente de nuestro documento de receta, de esta forma:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">function(doc) {<br \/>\nif (doc.type == 'receta' &amp;&amp;<br \/>\ndoc.title !== null) {<br \/>\npara id en doc.ingredientes {<br \/>\nemit(doc.ingredients[id].ingredient, null);<br \/>\n}<br \/>\n}<br \/>\n}<\/div>\n<\/div>\n<p>Para realizar una consulta, debe especificar la clave de la salida que desea comparar. La consulta se realiza a trav\u00e9s de la API REST, o a trav\u00e9s de su biblioteca cliente, pero la especificaci\u00f3n es la misma. Por ejemplo, si desea buscar \"zanahorias\", debe especificar \u00e9sta como la clave que busca. Uso de la 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>Recuerde que la clave es cualquier valor JSON, por lo que los valores clave que proporcione a la consulta tambi\u00e9n deben estar codificados correctamente en JSON. Como puedes ver en este ejemplo, la vista proporciona la base de tu consulta, y la base de datos accede al mecanismo de selecci\u00f3n.<\/p>\n<p>El uso de vistas de este modo significa que la mayor\u00eda de las aplicaciones acabar\u00e1n construy\u00e9ndose con varias vistas simult\u00e1neas. El proceso de creaci\u00f3n de vistas no difiere en nada del de creaci\u00f3n de consultas principales dentro de la aplicaci\u00f3n y, a continuaci\u00f3n, optimizaci\u00f3n de las consultas y los \u00edndices que producen el resultado. La principal diferencia es que la definici\u00f3n de la vista se almacena en la base de datos, no como una consulta dentro del c\u00f3digo de la aplicaci\u00f3n.<\/p>\n<h3>Agregaciones<\/h3>\n<p>En MySQL la agregaci\u00f3n se utiliza en varios lugares diferentes. La agregaci\u00f3n se maneja mediante una combinaci\u00f3n de la cl\u00e1usula GROUP BY y funciones que recogen o resumen la informaci\u00f3n. Utilizando de nuevo nuestro ejemplo de la receta, podr\u00edamos ejecutar una consulta que proporcione un recuento de las diferentes recetas por los ingredientes que contienen. Por ejemplo, una consulta como \u00e9sta<\/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>nos va a proporcionar una lista de ingredientes, con un recuento al lado de cada uno para mostrar cu\u00e1ntas recetas tienen ese ingrediente. En una aplicaci\u00f3n final esto va a conformar los 'ingredientes m\u00e1s calientes de la receta', o en otras apps 'la entrada m\u00e1s popular del blog' y as\u00ed sucesivamente.<\/p>\n<p>Por ejemplo, para obtener el equivalente de lo anterior podemos utilizar la misma funci\u00f3n map que hemos utilizado anteriormente. A continuaci\u00f3n, podemos utilizar una de las funciones de reducci\u00f3n incorporadas, _count, que producir\u00e1 un recuento basado en el n\u00famero de claves \u00fanicas emitidas por la funci\u00f3n emit(). Si existe una funci\u00f3n de reducci\u00f3n, se utiliza autom\u00e1ticamente cuando se accede a la vista. El acceso a la vista produce una lista del n\u00famero de recetas para ingredientes individuales:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">{\"filas\":[<br \/>\n{\"clave\": \"pl\u00e1tano\", \"valor\":20},<br \/>\n{\"clave\": \"pl\u00e1tanos\", \"valor\":33},<br \/>\n{\"clave\": \"baps\", \"valor\":1},<br \/>\n{\"clave\": \"salsa barbacoa\", \"valor\":1},<br \/>\n{\"clave\": \"arroz basmati\", \"valor\":16},<br \/>\n{\"clave\": \"laurel\", \"valor\":58},<br \/>\n{\"clave\": \"hojas de laurel\", \"valor\":35},<br \/>\n{\"clave\": \"brotes de soja\", \"valor\":18},<br \/>\n{\"key\": \"bean thread noodles\", \"value\":1},<br \/>\n{\"clave\": \"filete de ternera a la brasa\", \"valor\":17}<br \/>\n]<br \/>\n}<\/div>\n<\/div>\n<p>Las funciones de agregaci\u00f3n y reducci\u00f3n tambi\u00e9n pueden utilizarse para otras operaciones. Por ejemplo, en la parte 1 mostr\u00e9 una receta con informaci\u00f3n sobre el tiempo de preparaci\u00f3n y cocci\u00f3n. Podr\u00edamos utilizar una funci\u00f3n map y una funci\u00f3n reduce para obtener el tiempo total de cocci\u00f3n de cada receta. En primer lugar, escribe una funci\u00f3n map que muestre el t\u00edtulo de la receta como clave y la informaci\u00f3n sobre el tiempo de cocci\u00f3n como 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>Nos aseguramos de que el valor de salida es un n\u00famero (utilizando la funci\u00f3n JavaScript parseInt()). Si utilizamos la funci\u00f3n _sum, la vista calcular\u00e1 el total de todos los valores de una clave determinada (el t\u00edtulo de nuestra receta):<\/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\">{\"filas\":[<br \/>\n{\"clave\": \"Tarta de manzana\", \"valor\":55},<br \/>\n{\"clave\": \"Tarta de queso y albaricoque\", \"valor\":70},<br \/>\n{\"clave\": \"Berenjena asada\", \"valor\":10},<br \/>\n{\"clave\": \"Hamburguesas de ternera a la barbacoa\", \"valor\":30},<br \/>\n{\"key\": \"Rodajas de mazorca de ma\u00edz a la barbacoa\", \"value\":13},<br \/>\n{\"clave\": \"Carne en vino tinto\", \"valor\":144},<br \/>\n{\"key\": \"Salsa de queso azul y tomate\", \"value\":5},<br \/>\n{\"clave\": \"Pollo caj\u00fan\", \"valor\":20},<br \/>\n{\"key\": \"Caribbean cobbler stew\", \"value\":95},<br \/>\n{\"key\": \"Chappati o roti\", \"value\":45}<br \/>\n]<\/div>\n<\/div>\n<p>En SQL podr\u00edamos simplemente almacenar el tiempo total de cocci\u00f3n en la tabla para facilitar la consulta de esta informaci\u00f3n. En Couchbase, podemos hacer uso de la capacidad de procesar y combinar informaci\u00f3n al construir la vista.<\/p>\n<\/div>\n<h3>Consultas por rangos<\/h3>\n<p>Para consultas m\u00e1s complejas, en las que se seleccionan varios campos, es necesario crear una vista adecuada y utilizar el argumento de consulta clave para especificar lo que se busca. Si desea obtener informaci\u00f3n sobre un intervalo de valores, puede utilizar la clave de inicio y la clave final para especificar el intervalo que debe devolver la vista. Por ejemplo, si construyera una vista con el tiempo de cocci\u00f3n como clave, obtendr\u00eda una lista de todas las recetas coincidentes en las que el tiempo de cocci\u00f3n estuviera comprendido entre 5 y 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>Esto es an\u00e1logo a:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">SELECT title FROM receta WHERE tiempo de cocci\u00f3n &gt;= 5 AND tiempo de cocci\u00f3n &lt;= 25<\/div>\n<\/div>\n<h3>Consulta de varios campos<\/h3>\n<p>Para consultar varios campos, debe crear una vista que muestre los dos (o m\u00e1s) campos que desea consultar. Al buscar recetas, por ejemplo, es bastante com\u00fan querer buscar recetas con un determinado ingrediente, pero tambi\u00e9n dentro de un cierto l\u00edmite de tiempo. Cuando abres la nevera 30 minutos antes de salir y encuentras tomates, quieres saber qu\u00e9 puedes cocinar en 20 minutos con tomates. Para ello, damos salida a una vista que emite una clave con el ingrediente, y el tiempo necesario para cocinar la receta, as\u00ed:<\/p>\n<div class=\"geshifilter\">\n<div class=\"javascript geshifilter-javascript\" style=\"font-family: monospace\"><span style=\"color: #003366;font-weight: bold\">funci\u00f3n<\/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\">si<\/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\">longitud<\/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\">si<\/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\">null<\/span><span style=\"color: #009900\">)<\/span><br \/>\n<span style=\"color: #009900\">{<\/span><br \/>\nemite<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\">tiempo total<\/span><span style=\"color: #009900\">)<\/span><span style=\"color: #009900\">]<\/span><span style=\"color: #339933\">,<\/span> <span style=\"color: #003366;font-weight: bold\">null<\/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>Ahora para conseguir todas las recetas con tomates cocinables en 20 minutos podemos buscar:<\/div>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">[\"tomates\",20]<\/div>\n<\/div>\n<div>O m\u00e1s expl\u00edcitamente:<\/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>Por supuesto, si tienes 20 minutos para cocinar una receta, tienes menos de 20 minutos. De hecho, podemos utilizar una consulta de rango con una clave inicial de [\"tomates\",0] y una clave final de [\"tomates\",20] y ahora obtendremos todas las recetas cocinables en 20 minutos que contengan zanahorias:<\/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>Genial. Comparado con la sentencia 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 = 'tomates' and totaltime &lt;= 20<\/div>\n<\/div>\n<p>Por cierto, tenga en cuenta que obtenemos el ID de cada documento para poder cargar el documento y, por tanto, la receta. Puede que no tengamos el t\u00edtulo de la receta en nuestra salida, pero las bibliotecas cliente pueden cargar autom\u00e1ticamente la informaci\u00f3n del documento por nosotros. La parte dif\u00edcil es realizar la b\u00fasqueda.<\/p>\n<h3>Ordenar la salida de la vista<\/h3>\n<p>La ordenaci\u00f3n de la salida de una vista es autom\u00e1tica. La salida de cada vista se ordena autom\u00e1ticamente por la clave generada por cada vista. Esto es necesario porque, sin ella, la consulta de rangos ser\u00eda imposible de realizar. Esto hace que algunas operaciones sean r\u00e1pidas y sencillas. Si desea obtener una lista de recetas ordenadas alfab\u00e9ticamente por su t\u00edtulo, debe crear una vista cuya clave sea el t\u00edtulo de la receta. Esto significa que la funci\u00f3n map:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">funci\u00f3n (doc, meta)<br \/>\n{<br \/>\nemit(doc.title, null);<br \/>\n}<\/div>\n<\/div>\n<div>Se accede a trav\u00e9s de la opci\u00f3n Ver 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>\/recetas\/dise\u00f1o\/recetas\/vista\/por_t\u00edtulo<\/div>\n<\/div>\n<p>Es an\u00e1logo a:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">SELECT t\u00edtulo FROM receta ORDER BY t\u00edtulo<\/div>\n<\/div>\n<p>Para obtener una lista en orden descendente en MySQL se utiliza la palabra clave DESC:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">SELECT title FROM receta ORDER BY t\u00edtulo DESC<\/div>\n<\/div>\n<p>En Couchbase Server se utiliza el par\u00e1metro descendente a la 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>Paginaci\u00f3n<\/h3>\n<p>En MySQL, la paginaci\u00f3n se gestiona utilizando una combinaci\u00f3n de las cl\u00e1usulas LIMIT y OFFSET, por ejemplo para obtener los 10 primeros registros de nuestra consulta sobre el t\u00edtulo de la receta:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">SELECT t\u00edtulo FROM receta ORDER BY t\u00edtulo LIMIT 10<\/div>\n<\/div>\n<p>Para obtener los siguientes 10 registros:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">SELECT title FROM receta ORDER BY t\u00edtulo LIMIT 10 OFFSET 10<\/div>\n<\/div>\n<p>Con Couchbase Server se utiliza una configuraci\u00f3n similar, proporcionando los argumentos limit y skip a la consulta de la vista. Para obtener los diez primeros 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>Y los 10 discos siguientes:<\/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>Cuando se trata de bloques de p\u00e1ginas relativamente cortos, esto funciona bien. Para p\u00e1ginas m\u00e1s largas, o cuando se salta potencialmente sobre un gran n\u00famero de filas de salida, se puede utilizar startkey_docid para saltar hacia adelante dentro de la vista. Esto es m\u00e1s eficiente para estos escenarios de paginaci\u00f3n m\u00e1s largos. Compruebe el <a href=\"https:\/\/www.couchbase.com\/blog\/es\/docs\/couchbase-manual-2.0\/couchbase-views-writing-querying-pagination.html\/\">documentaci\u00f3n<\/a> para m\u00e1s informaci\u00f3n.<\/p>\n<h3>Carga del objeto central<\/h3>\n<p>En nuestra base de datos de recetas de ejemplo en MySQL, hay m\u00faltiples tablas necesarias para cargar la informaci\u00f3n de la base de datos sobre una sola receta para que pueda ser mostrada. Dentro de Couchbase Server, una vez que tienes el ID del documento para una receta dada, tienes acceso a toda la estructura de registros de la receta, ya que ha sido almacenada dentro de la base de datos de Couchbase Server.<\/p>\n<p>Con MySQL la necesidad de simplificar el mecanismo de carga para objetos tan complejos ha llevado a una serie de diferentes proyectos de apoyo que pueden ser como una forma de almacenar en cach\u00e9 los datos complejos cargados para que sean m\u00e1s accesibles (memcached, por ejemplo). Couchbase Server no elimina la necesidad de cargar la informaci\u00f3n desde la base de datos, pero hace que cargar el registro de la receta sea una sola operaci\u00f3n, en lugar de m\u00faltiples consultas y formateo de esos datos en la estructura utilizada para la visualizaci\u00f3n.<\/p>\n<p>En SQL, por ejemplo, podr\u00eda cargar los datos de la receta consultando las tablas individuales y construyendo su objeto, ejecutando una serie de consultas diferentes:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">SELECT * FROM receta WHERE recipeid=23434<br \/>\nSELECT * FROM ingredientes WHERE recipeid=23434<br \/>\nSELECT * FROM m\u00e9todos WHERE recipeid=23434<br \/>\nSELECT * FROM palabras clave WHERE recipeid=23434<\/div>\n<\/div>\n<div>Una vez que conoces el ID del documento, obtener el contenido del documento completo es una simple consulta a Couchbase Server. Por ejemplo, si obtienes el ID del documento Aromaticroastchicken de nuestra vista 'por ingrediente', puedo obtener la receta completa para mostrarla con una \u00fanica petici\u00f3n GET usando la librer\u00eda cliente. Por ejemplo, en 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>El resultado son los datos de la receta en formato JSON:<\/p>\n<div class=\"geshifilter\">\n<div class=\"text geshifilter-text\" style=\"font-family: monospace\">\n<p>{<br \/>\n\"title\" : \"Pollo asado arom\u00e1tico\",<br \/>\n\"preptime\" : \"15\",<br \/>\n\"raciones\" : \"6\",<br \/>\n\"totaltime\" : \"120\",<br \/>\n\"subtitle\" : \"Un relleno de cusc\u00fas, y especias arom\u00e1ticas con lima fragante y ajo asado, convierten un simple pollo asado en algo especial\",<br \/>\n\"cooktime\" : \"105\",<br \/>\n\"palabras clave\" : [<br \/>\n\"diet@dairy-free\",<br \/>\n\"m\u00e9todo de cocci\u00f3n.placa, horno, grill@horno\",<br \/>\n\"dieta@sin cacahuetes\",<br \/>\n\"colecciones especiales@cheffy recomienda\",<br \/>\n\"diet@corn-free\",<br \/>\n\"colectas especiales@comida fin de semana\",<br \/>\n\"ocasi\u00f3n@entretenida\",<br \/>\n\"colecciones especiales@muy f\u00e1cil\",<br \/>\n\"dieta@sin levadura\",<br \/>\n\"dieta@sin marisco\",<br \/>\n\"colecciones especiales@sentir el picante\",<br \/>\n\"ingrediente principal@aves de corral\",<br \/>\n\"dieta@demi-veg\",<br \/>\n\"meal type@main\",<br \/>\n\"diet@egg-free\",<br \/>\n\"dieta@vaca sin l\u00e1cteos\"<br \/>\n],<br \/>\n\"ingredientes\" : [<br \/>\n&#8230;<br \/>\n],<br \/>\n\"m\u00e9todo\" : [<br \/>\n&#8230;<br \/>\n],<\/p>\n<p>}<\/p>\n<\/div>\n<\/div>\n<p>Una consulta, una petici\u00f3n a la base de datos para cargar todo lo necesario para mostrar la receta en una sola p\u00e1gina. Por supuesto, tambi\u00e9n podr\u00eda incluirse otro contenido, como comentarios de los usuarios o metadatos adicionales, todo ello almacenado en el mismo documento y a una sola petici\u00f3n de distancia.<\/p>\n<h3>Migraci\u00f3n de datos<\/h3>\n<p>El formato de los datos trae a colaci\u00f3n otro punto destacado al pensar en esa migraci\u00f3n cuando inici\u00e9 el proceso. Piensa en tus datos y en c\u00f3mo se van a utilizar. Si muestras informaci\u00f3n que, en MySQL, proviene de m\u00faltiples fuentes, entonces tiene sentido agrupar esta informaci\u00f3n y almacenarla en Couchbase Sever como un \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 ya se ha mencionado, muchos mecanismos de aceleraci\u00f3n utilizados con MySQL funcionan sobre la base de almacenar en cach\u00e9 la informaci\u00f3n una vez que ha sido cargada desde m\u00faltiples fuentes para acelerar la carga de estructuras e informaci\u00f3n tan complejas.<\/p>\n<p>El mismo principio b\u00e1sico es cierto con Couchbase Server, teniendo en cuenta las advertencias que he mencionado anteriormente sobre la estructura. Necesitas estar seguro de que la estructura que creas te permite construir una vista que hace que el contenido sea buscable, si esos datos son la forma en que quieres sacar los documentos de la base de datos.<\/p>\n<p>Por ejemplo, en nuestra estructura de recetas, no tiene sentido almacenar los ingredientes como un \u00fanico campo de texto y perder el detalle del contenido. Esto es similar a poner todo en una sola columna de texto dentro de MySQL y tiene las mismas trampas; dificulta la b\u00fasqueda y consulta de los contenidos, y complica tanto la vista como las posibilidades de visualizaci\u00f3n.<\/p>\n<p>El proceso de migraci\u00f3n en s\u00ed deber\u00eda ser bastante sencillo. Carga la informaci\u00f3n de MySQL, construye un documento para cada objeto principal de tu base de datos, y luego escribe los documentos en un Couchbase Server.\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\">De hecho, puedes incluso usar este m\u00e9todo para migrar la informaci\u00f3n de una aplicaci\u00f3n en ejecuci\u00f3n. En su lugar, intenta laod el elemento desde Couchbase, y si no existe, c\u00e1rgalo desde MySQL, luego almacena el objeto construido en Couchbase.\u00a0<\/span><\/p>\n<p>Los documentos en Couchbase se almacenan por su ID. El ID puede ser cualquier cadena que quieras, lo que significa que puedes usar algo identificable para ti o tu aplicaci\u00f3n sin tener que depender siempre de una vista para encontrarlo. Para utilizar nuestra siempre presente base de datos de recetas, podr\u00edas utilizar el t\u00edtulo de la receta, por ejemplo 'Estofado de pescado'. La limitaci\u00f3n de este enfoque (al igual que con MySQL y los \u00edndices \u00fanicos) es que no se pueden almacenar dos documentos con el mismo ID, y hay un mont\u00f3n de recetas diferentes de estofado de pescado por ah\u00ed. Como alternativa se podr\u00eda utilizar un UUID o utilizar el t\u00edtulo de la receta con un sufijo para permitir m\u00faltiples recetas de \"Estofado de Pescado\".<\/p>\n<p>Al igual que con la opci\u00f3n de campo AUTO_INCREMENT de MySQL, Couchbase generar\u00e1 autom\u00e1ticamente un UUID para cada documento. Esto no es obligatorio; puedes almacenar tanto documentos un ID de documento espec\u00edfico como IDs autogenerados en la misma base de datos, lo que significa que puedes usar IDs conocidos para almacenar informaci\u00f3n espec\u00edfica, e IDs autogenerados para el cuerpo principal de datos.<\/p>\n<h3>Conclusi\u00f3n<\/h3>\n<p>La principal diferencia entre Couchbase y MySQL es la representaci\u00f3n de los datos y c\u00f3mo se accede a ellos. Para ciertos modelos de datos, Couchbase proporciona una soluci\u00f3n m\u00e1s simple al problema de cargar los datos de estilo objeto \u00fanico que hemos visto demostrado en estas piezas. Las recetas son un buen ejemplo donde el elemento clave del almac\u00e9n de datos es la receta en su conjunto (nuestro documento). La capacidad de buscar y encontrar datos de recetas y presentarlos como una lista es un requisito en t\u00e9rminos de la forma en que necesitamos presentar y acceder a los datos, no un requisito relacionado con la forma en que se almacenan.<\/p>\n<p>Esperemos que estos dos posts te hayan dado algunas ideas sobre c\u00f3mo mover tus datos de MySQL a Couchase Server, y c\u00f3mo modelar y desarrollar tus datos y c\u00f3digo de aplicaci\u00f3n de Couchbase Server para hacer que el sistema funcione y opere como tu infraestructura existente basada en 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 v26.2 (Yoast SEO v26.2) - 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\/es\/how-move-mysql-couchbase-server-20-part-2\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\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\/es\/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\":\"es\",\"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\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/52986346eb631b1a48e46835090d367f\",\"name\":\"MC Brown\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@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\/es\/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\/es\/how-move-mysql-couchbase-server-20-part-2\/","og_locale":"es_MX","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\/es\/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":"es","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":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/how-move-mysql-couchbase-server-20-part-2\/"]}]},{"@type":"ImageObject","inLanguage":"es","@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":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/52986346eb631b1a48e46835090d367f","name":"MC Marr\u00f3n","image":{"@type":"ImageObject","inLanguage":"es","@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 es Vicepresidente de Publicaciones T\u00e9cnicas y Educaci\u00f3n en Couchbase. Es responsable de la elaboraci\u00f3n de la documentaci\u00f3n y la informaci\u00f3n de apoyo.","url":"https:\/\/www.couchbase.com\/blog\/es\/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","author_category":"","last_name":"Brown","first_name":"MC","job_title":"","user_url":"","description":"Mc Brown es Vicepresidente de Publicaciones T\u00e9cnicas y Educaci\u00f3n en Couchbase. Es responsable de la elaboraci\u00f3n de la documentaci\u00f3n y la informaci\u00f3n de apoyo."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/1634","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/35"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=1634"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/1634\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/13873"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=1634"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=1634"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=1634"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=1634"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}