{"id":2708,"date":"2017-03-07T09:51:19","date_gmt":"2017-03-07T17:51:19","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=2708"},"modified":"2024-09-12T02:19:18","modified_gmt":"2024-09-12T09:19:18","slug":"moving-sql-server-couchbase-app-migration","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/moving-sql-server-couchbase-app-migration\/","title":{"rendered":"Migraci\u00f3n de SQL Server a Couchbase Parte 3: Migraci\u00f3n de aplicaciones"},"content":{"rendered":"<div id=\"header\">\n<h2>Migraci\u00f3n de SQL Server a Couchbase Parte 3: Migraci\u00f3n de aplicaciones<\/h2>\n<\/div>\n<div id=\"preamble\">\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>En esta serie de entradas de blog, voy a exponer las consideraciones a tener en cuenta al pasar a una base de datos de documentos cuando se tiene una experiencia relacional. En concreto, Microsoft SQL Server en comparaci\u00f3n con <a href=\"https:\/\/developer.couchbase.com\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">Servidor Couchbase<\/a>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>En tres partes, voy a cubrir:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/es\/moving-from-sql-server-to-couchbase-part-1-data-modeling\/\">Modelizaci\u00f3n de datos<\/a><\/li>\n<li><a href=\"https:\/\/www.couchbase.com\/blog\/es\/sql-server-couchbase-data-migration\/\">Migraci\u00f3n de datos<\/a><\/li>\n<li>Aplicaciones que utilizan los datos (esta entrada del blog)<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>El objetivo es establecer algunas directrices generales que pueda aplicar a la planificaci\u00f3n y el dise\u00f1o de su aplicaci\u00f3n.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Si quieres seguirme, he creado una aplicaci\u00f3n que demuestra Couchbase y SQL Server lado a lado. <a href=\"https:\/\/github.com\/couchbaselabs\/blog-source-code\/tree\/master\/Groves\/045MigrateFromSQLServer\/src\/SQLServerToCouchbase\">Obtenga el c\u00f3digo fuente en GitHub<\/a>y aseg\u00farese de <a href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">descargar una versi\u00f3n preliminar para desarrolladores de Couchbase Server<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_migrate_vs_rewrite\">Migrar frente a reescribir<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Si est\u00e1s construyendo una nueva aplicaci\u00f3n web, entonces Couchbase Server es una buena opci\u00f3n para utilizar como su <strong>sistema de registro<\/strong>. El modelado de datos flexible, el acceso r\u00e1pido a los datos y la facilidad de ampliaci\u00f3n lo convierten en una buena opci\u00f3n.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Couchbase Server puede complementar SQL Server en tu aplicaci\u00f3n web existente. Puede ser un almac\u00e9n de sesiones o un almac\u00e9n cach\u00e9. No tienes que reemplazar tu RDMBS para beneficiarte de Couchbase Server. Puedes usarlo como <strong>sistema de compromiso<\/strong>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Sin embargo, si est\u00e1 considerando convertir una base de datos de documentos en su \"sistema de registro\" para una aplicaci\u00f3n existente, entonces necesita planificar qu\u00e9 hacer con esa aplicaci\u00f3n (suponiendo que ya haya elaborado un plan de modelado de datos y migraci\u00f3n de datos como se ha cubierto en las partes anteriores de esta serie de blogs). En realidad, hay dos opciones:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><strong>Sustituya su capa de datos\/servicios<\/strong>. Si has construido tu aplicaci\u00f3n de una manera que la desacopla de la persistencia subyacente, eso te va a beneficiar enormemente cuando cambies de SQL Server a Couchbase. Si est\u00e1s usando una SOA, por ejemplo, entonces puede que no tengas que hacer muchos cambios en la aplicaci\u00f3n web.<\/li>\n<li><strong>Reconstruya su aplicaci\u00f3n<\/strong>. Si no tiene una arquitectura desacoplada, es probable que tenga que hacer de tripas coraz\u00f3n y reescribir\/refactorizar grandes partes de su aplicaci\u00f3n. Este puede ser un coste significativo que tendr\u00e1s que tener en cuenta a la hora de decidir si cambiar o no a una base de datos de documentos. Ojal\u00e1 pudiera decir que es m\u00e1s f\u00e1cil, que existe una poci\u00f3n m\u00e1gica. Pero recuerda, incluso si el coste de una reconstrucci\u00f3n es demasiado grande, todav\u00eda puedes usar Couchbase Server en<br \/>\ncon SQL Server.<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>Las piezas de su pila que podr\u00eda necesitar reconstruir o sustituir incluyen:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><strong>ADO.NET<\/strong> - Si est\u00e1s usando ADO.NET o un micro-OR\/M como Dapper, estos pueden ser reemplazados por el SDK .NET de Couchbase.<\/li>\n<li><strong>O\/M<\/strong> - Entity framework, NHibernate, Linq2SQL, etc. Estos pueden ser reemplazados por Linq2Couchbase<\/li>\n<li><strong>Cualquier c\u00f3digo que los utilice directamente<\/strong> - Cualquier c\u00f3digo que toque ADO.NET, OR\/Ms, u otro c\u00f3digo SQL Server necesitar\u00e1 ser reemplazado para usar Couchbase (y\/o reescrito para introducir otra capa de abstracci\u00f3n).<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>El resto de esta entrada del blog ser\u00e1n consejos y directrices aplicables a la reescritura, refactorizaci\u00f3n o inicio de un nuevo proyecto.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_what_s_going_to_be_covered\">Qu\u00e9 se va a cubrir<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Las bases de datos de documentos fuerzan la l\u00f3gica de negocio fuera de la base de datos en mayor medida que las bases de datos relacionales. Por muy bonito que fuera que Couchbase Server tuviera todas las funciones posibles, siempre hay compensaciones.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>En esta entrada del blog, vamos a cubrir los cambios en la codificaci\u00f3n de aplicaciones que vienen con el uso de Couchbase. A grandes rasgos, esto es lo que trataremos en esta entrada. A la izquierda, una caracter\u00edstica de SQL Server; a la derecha, el equivalente m\u00e1s cercano al usar Couchbase Server.<\/p>\n<\/div>\n<table class=\"tableblock frame-all grid-all spread\">\n<colgroup>\n<col style=\"width: 50%\" \/>\n<col style=\"width: 50%\" \/> <\/colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Servidor SQL<\/th>\n<th class=\"tableblock halign-left valign-top\">Servidor Couchbase<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">tSQL<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">N1QL<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Procedimientos almacenados<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Nivel de servicio<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Disparadores<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Nivel de servicio<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Vistas<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Vistas Map\/Reduce<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Auton\u00famero<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Contador<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">OR\/M (mapeador objeto\/relacional)<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">ODM (Modelo de datos de objetos)<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">\u00c1CIDO<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">Documento \u00fanico ACID<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div class=\"paragraph\">\n<p>Adem\u00e1s, tambi\u00e9n trataremos estos importantes temas:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li>Serializaci\u00f3n<\/li>\n<li>Seguridad<\/li>\n<li>Concurrencia<\/li>\n<li>SSIS, SSRS, SSAS<\/li>\n<\/ul>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_using_n1ql\">Uso de N1QL<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>En <a href=\"https:\/\/www.couchbase.com\/blog\/es\/n1ql\/\">N1QL (pronunciado \"nickel\")<\/a> es una de mis caracter\u00edsticas favoritas de Couchbase Server. Ya te sientes c\u00f3modo con el lenguaje de consulta SQL. Con N1QL, puedes aplicar tus conocimientos a una base de datos de documentos.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>He aqu\u00ed algunos ejemplos para mostrar la <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/n1ql\/n1ql-intro\/n1ql-sql-differences.html?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">similitudes entre N1QL y tSQL<\/a>:<\/p>\n<\/div>\n<table class=\"tableblock frame-all grid-all spread\">\n<colgroup>\n<col style=\"width: 50%\" \/>\n<col style=\"width: 50%\" \/> <\/colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">tSQL<\/th>\n<th class=\"tableblock halign-left valign-top\">N1QL<\/th>\n<\/tr>\n<\/thead>\n<tfoot>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">DELETE FROM [tabla] WHERE val1 = 'foo'<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">DELETE FROM `bucket` WHERE val1 = &#8216;foo&#8217;<\/p>\n<\/td>\n<\/tr>\n<\/tfoot>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">SELECT * FROM [tabla]<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">SELECT * from `bucket`<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">SELECT t1.* , t2.* FROM [tabla1] t1 JOIN [tabla2] t2 ON t1.id = t2.id<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">SELECT b1.* , b2.* FROM `bucket` b1 JOIN `bucket` b2 ON KEYS b1.mykeys<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">INSERT INTO [tabla] (clave, col1, col2) VALUES (1, 'val1\u2032,'val2')<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">INSERT INTO `bucket` (KEY, VALUE) VALUES (&#8216;1&#8217;, {&#8220;col1&#8243;:&#8221;val1&#8221;, &#8220;col2&#8243;:&#8221;val2&#8221;})<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">UPDATE [tabla] SET val1 = 'nuevovalor' WHERE val1 = 'foo'<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">UPDATE `bucket` SET val1 =&#8217;newvalue&#8217; WHERE val1 = &#8216;foo&#8217;<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div class=\"paragraph\">\n<p>Gracias a <a href=\"https:\/\/www.couchbase.com\/blog\/es\/n1ql\/\">N1QL<\/a>migrar sus consultas SQL deber\u00eda ser menos dif\u00edcil que otras bases de datos documentales. Su modelo de datos ser\u00e1 diferente, y no todas las funciones en tSQL est\u00e1n (todav\u00eda) disponibles en N1QL. Pero en su mayor parte, su experiencia existente en tSQL puede ser aplicada.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Volviendo a la cesta de la compra, he aqu\u00ed un ejemplo de una simple consulta tSQL que obtendr\u00eda la informaci\u00f3n de la cesta de la compra de un usuario determinado:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-SQL\">SELECT c.Id, c.DateCreated, c.[User], i.Price, i.Quantity\r\nFROM ShoppingCart c\r\nINNER JOIN ShoppingCartItems i ON i.ShoppingCartID = c.Id\r\nWHERE c.[Usuario] = 'mschuster'<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>En Couchbase, una cesta de la compra podr\u00eda modelarse como un \u00fanico documento, por lo que una consulta aproximadamente equivalente ser\u00eda:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-SQL\">SELECT META(c).id, c.dateCreated, c.items, c.`user`\r\nFROM `sqltocb` c\r\nWHERE c.type = 'ShoppingCart'\r\nAND c.`user` = 'mschuster';<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>N\u00f3tese que mientras N1QL tiene <code>\u00daNASE A<\/code> funcionalidad, no <code>\u00daNASE A<\/code> es necesario en esta consulta de la cesta de la compra. Todos los datos de la cesta de la compra se encuentran en un \u00fanico documento, en lugar de estar repartidos entre varias tablas y filas.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Los resultados no son <em>exactamente<\/em> lo mismo: la consulta N1QL devuelve un resultado m\u00e1s jer\u00e1rquico. Pero la consulta <em>podr\u00eda<\/em> modificarse con un <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/n1ql\/n1ql-language-reference\/from.html#concept_rnt_zfk_np__unnest\"><code>UNNEST<\/code><\/a> para aplanar los resultados si es necesario. <code>UNNEST<\/code> es un <em>uni\u00f3n entre documentos<\/em>que es una caracter\u00edstica necesaria cuando se escribe SQL para JSON.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>En muchas bases de datos de documentos que no sean Couchbase, probablemente tendr\u00edas que aprender una API para crear consultas, y no podr\u00edas aplicar tu experiencia en tSQL para ayudar a mejorar. No estoy diciendo que la traducci\u00f3n vaya a ser siempre un paseo por el parque, pero va a ser relativamente f\u00e1cil en comparaci\u00f3n con las alternativas. Si est\u00e1s empezando un <strong>nuevo<\/strong> te alegrar\u00e1 saber que tus conocimientos de SQL seguir\u00e1n siendo \u00fatiles.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Al escribir C# para interactuar con N1QL, hay un par de conceptos clave que es importante conocer.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><strong>Consistencia de la exploraci\u00f3n<\/strong>. Cuando se ejecuta una consulta N1QL, hay varias opciones de consistencia de escaneo. La consistencia de escaneo define c\u00f3mo debe comportarse su consulta N1QL con respecto a la indexaci\u00f3n. El comportamiento por defecto es \"Not Bounded\", y proporciona el mejor rendimiento. En el otro extremo del espectro est\u00e1 \"RequestPlus\", y proporciona la mejor consistencia. Tambi\u00e9n est\u00e1 \"AtPlus\", que es un buen t\u00e9rmino medio, pero requiere un poco m\u00e1s de trabajo. I <a href=\"https:\/\/www.couchbase.com\/blog\/es\/new-to-couchbase-4.5-atplus\/\">blog sobre la coherencia de la exploraci\u00f3n<\/a> en junio, y vale la pena repasarlo antes de empezar a escribir N1QL en .NET.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><strong>Parametrizaci\u00f3n<\/strong>. Si est\u00e1 creando consultas N1QL, es importante que <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/4.5\/sdk\/dotnet\/n1ql-queries-with-sdk.html?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">utilizar la parametrizaci\u00f3n<\/a> para evitar la inyecci\u00f3n SQL. Existen dos opciones con N1QL: par\u00e1metros posicionales (numerados) y par\u00e1metros con nombre.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>He aqu\u00ed un ejemplo tanto de la Consistencia de Exploraci\u00f3n como de la Parametrizaci\u00f3n utilizada en C#:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\">var query = QueryRequest.Create(n1ql);\r\nquery.ScanConsistency(ScanConsistency.RequestPlus);\r\nquery.AddNamedParameter(\"userId\", id);\r\nvar result = _bucket.Query(query);<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>No voy a sumergirme en la <a href=\"https:\/\/docs.couchbase.com\/server\/6.0\/n1ql\/n1ql-language-reference\/index.html\">Lenguaje de consulta N1QL<\/a> m\u00e1s que esto, porque es un tema muy profundo. Pero puede <a href=\"https:\/\/www.couchbase.com\/blog\/es\/products\/n1ql\/\">consulta los fundamentos de N1QL<\/a> y <a href=\"https:\/\/query.pub.couchbase.com\/tutorial\/#1\">Empieza con el tutorial interactivo de N1QL<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_sql_stored_procedures\">Procedimientos almacenados SQL<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>No hay equivalente a los procedimientos almacenados (sprocs) en Couchbase. Si todav\u00eda no tienes un nivel de servicio, y est\u00e1s usando sprocs para compartir alguna l\u00f3gica entre dominios, te recomiendo que crees un nivel de servicio y muevas la l\u00f3gica all\u00ed.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>De hecho, no estaba seguro de si los sprocs pertenec\u00edan a la parte 2 o a la parte 3 de esta serie de blogs. Niveles t\u00edpicos en una aplicaci\u00f3n empresarial:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li>Web tier (UI - Angular\/React\/Traditional ASP.NET MVC)<\/li>\n<li>Nivel de servicio (ASP.NET WebApi)<\/li>\n<li>Base de datos<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>Los sprocs viven en la base de datos, pero contienen l\u00f3gica. El nivel de servicio tambi\u00e9n contiene l\u00f3gica de negocio. Entonces, \u00bfcuentan como datos o como funcionalidad?<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Hice una encuesta en Twitter para decidirme.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><span class=\"image\"><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/047_01_twitter_sproc_poll.png\" alt=\"Twitter straw poll on Stored Procedures\" \/><\/span><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Pero mi recomendaci\u00f3n es que si ya tienes un nivel de servicio, muevas la l\u00f3gica sproc a ese nivel. Si no tienes un nivel de servicio, crea uno. Esto vivir\u00e1 entre la base de datos y la interfaz de usuario.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>En el c\u00f3digo fuente de esta serie, he creado un \u00fanico procedimiento almacenado.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-SQL\">CREATE PROCEDURE SP_SEARCH_SHOPPING_CART_BY_NAME\r\n\t@searchString NVARCHAR(50)\r\nAS\r\nBEGIN\r\n\tSELECT c.Id, c.[Usuario], c.DateCreated\r\n\tFROM CestaDeCompra c\r\n\tWHERE c.[Usuario] LIKE '%' + @searchString + '%'\r\nEND\r\nIR A<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Este sproc se puede ejecutar desde Entity Framework de la siguiente manera:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\">public List SearchForCartsByUserName(cadena searchString)\r\n{\r\n    var cmd = _context.Database.Connection.CreateCommand();\r\n    cmd.CommandText = \"SP_SEARCH_SHOPPING_CART_BY_NAME @searchString\";\r\n    cmd.Parameters.Add(new SqlParameter(\"@cadenaB\u00fasqueda\", cadenaB\u00fasqueda));\r\n    _context.Database.Connection.Open();\r\n    var reader = cmd.ExecuteReader();\r\n\r\n    var carts = ((IObjectContextAdapter) _context)\r\n        .ObjectContext\r\n        .Translate(reader, \"ShoppingCarts\", MergeOption.AppendOnly);\r\n\r\n    var result = carritos.ToList();\r\n    _context.Database.Connection.Close();\r\n    devolver resultado;\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p><em>Por cierto, ese c\u00f3digo sproc de Entity Framework es feo. \u00bfQuiz\u00e1s lo hice mal? No estoy tratando de calumniar a EF, pero en general, no he usado OR\/Ms y sprocs juntos mucho en mi carrera. Ciertamente un trozo de c\u00f3digo ADO.NET o Dapper ser\u00eda m\u00e1s corto y limpio.<\/em><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Este es un sproc muy simple, pero introduce una funcionalidad b\u00e1sica de b\u00fasqueda. Las ventajas de un sproc as\u00ed:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><strong>Reutilizaci\u00f3n:<\/strong> El mismo sproc puede reutilizarse entre distintas aplicaciones<\/li>\n<li><strong>Abstracci\u00f3n:<\/strong> La implementaci\u00f3n del sproc puede modificarse o mejorarse. En este caso, un <code>COMO<\/code> podr\u00eda cambiarse por una b\u00fasqueda de texto completo m\u00e1s robusta.<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>Cualquier enfoque adoptado con la introducci\u00f3n de un nivel de servicio debe proporcionar los mismos beneficios. He creado un ASP.NET WebApi endpoint para tomar el lugar de la sproc.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\">[HttpGet]\r\n[Route(\"api\/buscarPorNombre\/{cadenaB\u00fasqueda}\")]\r\npublic IHttpActionResult SearchByName(cadena searchString)\r\n{\r\n    var n1ql = @\"SELECT META(c).id, c.`user`\r\n        FROM `sqltocb` c\r\n        WHERE c.type = 'ShoppingCart'\r\n        AND c.`user` LIKE $searchString\";\r\n    var query = QueryRequest.Create(n1ql);\r\n    query.AddNamedParameter(\"searchString\", \"%\" + searchString + \"%\");\r\n    query.ScanConsistency(ScanConsistency.RequestPlus);\r\n    var results = _bucket.Query(query).Rows;\r\n\r\n    return Json(resultados);\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p><em>Nota: en aras de la simplicidad en el c\u00f3digo de ejemplo, este punto final en realidad vive en el mismo proyecto web, pero en la producci\u00f3n, debe ser trasladado a su propio proyecto y desplegado por separado.<\/em><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Este endpoint contiene una consulta N1QL que es similar en naturaleza al sproc anterior. Veamos si tiene los mismos beneficios:<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><strong>\u00bfReutilizar?<\/strong> S\u00ed. Este endpoint puede desplegarse en su propio servidor y reutilizarse desde otras aplicaciones.<\/li>\n<li><strong>\u00bfAbstracci\u00f3n?<\/strong> De nuevo, s\u00ed. La aplicaci\u00f3n utiliza la ingenua <code>COMO<\/code> que podr\u00edamos mejorar cambi\u00e1ndolo por el uso de <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/sdk\/dotnet\/full-text-searching-with-sdk.html\">Funciones de b\u00fasqueda de texto completo de Couchbase<\/a> sin cambiar la API.<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p>En lugar de llamar a un sproc a trav\u00e9s de Entity Framework, este endpoint se llamar\u00eda a trav\u00e9s de HTTP. Aqu\u00ed hay un ejemplo que utiliza la biblioteca RestSharp:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\">public List SearchForCartsByUserName(cadena searchString)\r\n{\r\n    \/\/ normalmente habr\u00eda autenticaci\u00f3n\/autorizaci\u00f3n con una llamada REST como esta\r\n    var client = new RestClient(_baseUrl);\r\n    var request = new RestRequest(\"\/api\/b\u00fasquedaPorNombre\/\" + searchString);\r\n    request.AddHeader(\"Accept\", \"application\/json\");\r\n    var response = client.Execute&lt;List&gt;(request);\r\n    return respuesta.Datos;\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Si est\u00e1s construyendo un nuevo proyecto, te recomiendo que crees un nivel de servicio con la expectativa de que sea utilizado en toda tu empresa. Esto le permite tener el mismo \"c\u00f3digo compartido\" que los sprocs proporcionar\u00edan normalmente sin poner ese c\u00f3digo en la base de datos.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Lo mismo ocurre con SQL Server <strong>funciones, tipos definidos por el usuario, reglas, objetos CLR definidos por el usuario<\/strong>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><em>Nota: el ejemplo de sproc anterior es un <code>SELECCIONE<\/code> para simplificar el ejemplo. En este caso, se podr\u00eda crear una vista MapReduce en su lugar (que se discute m\u00e1s adelante). Sin embargo, una vista MapReduce no puede mutar documentos, por lo que un enfoque de nivel de servicio es una mejor soluci\u00f3n general para reemplazar los sprocs.<\/em><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_sql_triggers\">Triggers SQL<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Si los sprocs no fueran ya suficientemente controvertidos, basta con sacar el tema de los triggers en una conversaci\u00f3n. Al igual que con los procedimientos almacenados, generalmente recomiendo que muevas la l\u00f3gica de los disparadores al nivel de servicio, lejos de la base de datos. Si tu proyecto de software depende de muchos triggers, o triggers complejos, o muchos triggers complejos, entonces puede que quieras esperar a otro proyecto en el que intentar usar Couchbase Server.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Dicho esto, se est\u00e1 trabajando en algunas cosas de vanguardia que podr\u00edan ser m\u00e1s o menos equivalentes a los activadores. Si te interesa, ponte en contacto conmigo, y tambi\u00e9n permanece atento a <a href=\"https:\/\/www.couchbase.com\/blog\/es\/\">el blog de Couchbase<\/a> para obtener la informaci\u00f3n m\u00e1s reciente.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_views\">Vistas<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>En SQL Server, las vistas son una forma de almacenar consultas complejas en el servidor, as\u00ed como proporcionar algunos beneficios de rendimiento. En Couchbase, las vistas Map\/reduce han estado proporcionando una funcionalidad similar durante alg\u00fan tiempo. En su mayor parte, la funcionalidad proporcionada por las vistas se puede proporcionar de una manera m\u00e1s expresiva con N1QL. Sin embargo, las vistas no van a desaparecer, y a veces hay beneficios al usarlas.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Las vistas map\/reduce pueden definirse y almacenarse en el cl\u00faster de Couchbase. Para crearlas, se define una funci\u00f3n \"map\" (con JavaScript) y opcionalmente una funci\u00f3n \"reduce\" (tambi\u00e9n en JavaScript).<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>En la interfaz de usuario de la consola de Couchbase, ve a \u00cdndices \u2192 Vistas \u2192 Crear vista. Crea un documento de dise\u00f1o, y crea una vista dentro de ese documento de dise\u00f1o.<\/p>\n<\/div>\n<div class=\"imageblock\">\n<div class=\"content\"><img decoding=\"async\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2017\/02\/047_01_Couchbase_View_editor.png\" alt=\"Editing a Map\/Reduce view in Couchbase\" \/><\/div>\n<div class=\"title\">Figura 1. Captura de pantalla del editor de vistas Map\/Reduce en la \u00faltima consola de Couchbase<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>En el centro est\u00e1 el c\u00f3digo Map\/Reduce en el que est\u00e1s trabajando. Tambi\u00e9n se muestra un documento de ejemplo y sus metadatos para darte algo de ayuda visual, y en la parte inferior tienes algunas opciones para ejecutar tu vista.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Para m\u00e1s informaci\u00f3n sobre el funcionamiento de las vistas, consulte la p\u00e1gina <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/sdk\/dotnet\/view-queries-with-sdk.html\">Documentaci\u00f3n sobre MapReduce Views<\/a>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Como ejemplo r\u00e1pido, quiero crear una vista que enumere s\u00f3lo las personas que tienen una edad superior a 21 a\u00f1os.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-JavaScript\">function (doc, meta) {\r\n  if(doc.edad &gt; 21) {\r\n  \temit(meta.id, doc.name);\r\n  }\r\n}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Esta vista emitir\u00eda la clave del documento y el valor del campo \"nombre\". Si mi cubo contuviera los siguientes documentos<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-JavaScript\">foo1 {\"edad\":17, \"nombre\": \"Carmella Albert\"}\r\nfoo2 {\"edad\":25, \"nombre\": \"Lara Salinas\"}\r\nfoo3 {\"edad\":35, \"nombre\": \"Teresa Johns\"}<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Entonces los resultados de la vista tendr\u00edan el siguiente aspecto:<\/p>\n<\/div>\n<table class=\"tableblock frame-all grid-all spread\">\n<colgroup>\n<col style=\"width: 50%\" \/>\n<col style=\"width: 50%\" \/> <\/colgroup>\n<thead>\n<tr>\n<th class=\"tableblock halign-left valign-top\">Clave<\/th>\n<th class=\"tableblock halign-left valign-top\">Valor<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">\"foo2\"<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">\"Lara Salinas\"<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">\"foo3\"<\/p>\n<\/td>\n<td class=\"tableblock halign-left valign-top\">\n<p class=\"tableblock\">\"Teresa Johns\"<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div class=\"paragraph\">\n<p>Los resultados de estas vistas se actualizan autom\u00e1ticamente en un intervalo, y tambi\u00e9n se actualizan de forma incremental a medida que los documentos mutan. Esto significa que, por defecto, los resultados de las vistas son <strong>finalmente<\/strong> coherente con los documentos reales. Como desarrollador, puede <a href=\"https:\/\/docs.couchbase.com\/server\/current\/learn\/architecture-overview.html\">especificar el nivel de coherencia<\/a> (o estancamiento) que desee. Esto repercutir\u00e1 en el rendimiento.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Las vistas map\/reduce pueden ser muy \u00fatiles cuando se tiene una l\u00f3gica muy compleja que es m\u00e1s f\u00e1cil de escribir en JavaScript que en N1QL. Tambi\u00e9n puede ser beneficioso para el rendimiento cuando se trabaja con un sistema de escritura pesada.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Se puede acceder a las vistas desde .NET utilizando <code>ViewQuery<\/code>.<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\">var query = new ViewQuery().From(\"viewdesigndocument\", \"viewname\").Limit(10);\r\nvar people = bucket.Query(query);\r\nforeach (var persona in personas.Filas)\r\n    Console.WriteLine(hito.Clave);<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Alternativamente, puede crear consultas N1QL en lugar de utilizar Vistas. En muchos casos, N1QL ser\u00e1 m\u00e1s f\u00e1cil de escribir, y la diferencia de rendimiento ser\u00e1 insignificante. A diferencia de las Vistas, las consultas N1QL vivir\u00edan en el nivel de servicio. Actualmente no hay forma de almacenar una \"Vista N1QL\" en el cluster de Couchbase Server.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_serialization_deserialization\">Serializaci\u00f3n\/deserializaci\u00f3n<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Tanto si utilizas N1QL, Views u operaciones clave\/valor, es importante tener en cuenta c\u00f3mo se serializa y deserializa JSON.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>El SDK .NET utiliza <a href=\"https:\/\/www.newtonsoft.com\/json\">Newtonson JSON.NET<\/a>. Si est\u00e1 familiarizado con esa herramienta (y qui\u00e9n de los desarrolladores .NET no lo est\u00e1), recuerde que puede utilizar los mismos atributos (como <a href=\"https:\/\/www.newtonsoft.com\/json\/help\/html\/SerializationAttributes.htm\">JsonProperty, JsonConverter<\/a>etc). En algunos casos, puede ser \u00fatil crear tu propio serializador personalizado, lo cual es posible con el SDK .NET de Couchbase. Echa un vistazo al <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/sdk\/nonjson.html?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">documentaci\u00f3n sobre serializaci\u00f3n y documentos no JSON<\/a> para m\u00e1s informaci\u00f3n.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_security\">Seguridad<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Couchbase tiene <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/security\/concepts-rba.html?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">control de acceso basado en roles (RBAC)<\/a> para los administradores.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Couchbase puede integrarse con LDAP para gestionar los administradores de Couchbase y asignar roles a los usuarios. Couchbase tambi\u00e9n puede crear usuarios de s\u00f3lo lectura internamente.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Hay algunos cambios m\u00e1s robustos y mejoras que vienen al sistema RBAC de Couchbase, as\u00ed que mantente atento. De hecho, te recomiendo que empieces <a href=\"https:\/\/www.couchbase.com\/blog\/es\/introducing-developer-builds\/\">consultar las compilaciones mensuales para desarrolladores<\/a>ya que espero ver pronto algunas mejoras y funciones interesantes en este \u00e1mbito.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_concurrency\">Concurrencia<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>La concurrencia es algo con lo que hay que lidiar a menudo, especialmente en una aplicaci\u00f3n web. M\u00faltiples usuarios podr\u00edan estar tomando acciones que resulten en que el mismo documento sea cambiado al mismo tiempo.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>SQL Server utiliza <a href=\"https:\/\/www.couchbase.com\/blog\/es\/optimistic-or-pessimistic-locking-which-one-should-you-pick\/\">cierre pesimista<\/a> por defecto. Esto significa que SQL Server espera que las filas est\u00e9n en contenci\u00f3n, por lo que act\u00faa a la defensiva. Se trata de un valor predeterminado razonable para las bases de datos relacionales, ya que los datos desnormalizados se reparten entre varias tablas y varias filas. SQL Server tiene la capacidad de utilizar <a href=\"https:\/\/www.couchbase.com\/blog\/es\/optimistic-or-pessimistic-locking-which-one-should-you-pick\/\">bloqueo optimista<\/a> tambi\u00e9n, a trav\u00e9s de una variedad de <a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/ms173763.aspx\">niveles de transacci\u00f3n<\/a>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Couchbase tambi\u00e9n ofrece dos opciones para gestionar la concurrencia: optimista y pesimista.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><strong>Optimista<\/strong>. Esto se llama \"optimista\" porque funciona mejor cuando es poco probable que un documento est\u00e9 en disputa muy a menudo. Est\u00e1s haciendo una suposici\u00f3n optimista. En Couchbase, esto se hace con <a href=\"https:\/\/docs.couchbase.com\/dotnet-sdk\/current\/howtos\/concurrent-document-mutations.html\">CAS (Comparar e intercambiar)<\/a>. Cuando se recupera un documento, \u00e9ste viene con metadatos, incluido un valor CAS (que no es m\u00e1s que un n\u00famero). Cuando vaya a actualizar ese documento, puede proporcionar el valor CAS. Si los valores coinciden, el optimismo ha merecido la pena y los cambios se guardan. Si no coinciden, la operaci\u00f3n falla y tendr\u00e1s que gestionarla (una fusi\u00f3n, un mensaje de error, etc.). <em>Si no proporciona un valor CAS, los cambios se guardar\u00e1n pase lo que pase.<\/em><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><strong>Pesimista<\/strong>. Esto se llama \"pesimista\" porque funciona mejor cuando se sabe que un documento va a mutar mucho. Usted est\u00e1 haciendo una suposici\u00f3n pesimista y est\u00e1 bloqueando el documento a la fuerza. Si utiliza <code>GetAndLock<\/code> en el SDK .NET, el documento quedar\u00e1 bloqueado, lo que significa que no podr\u00e1 modificarse. Los documentos se bloquean durante un m\u00e1ximo de 15 segundos. Puede fijar un valor inferior. Tambi\u00e9n puede desbloquear expl\u00edcitamente un documento, pero para ello debe tener en cuenta el valor CAS.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Para m\u00e1s detalles, consulte la documentaci\u00f3n sobre <a href=\"https:\/\/docs.couchbase.com\/dotnet-sdk\/current\/concurrent-mutations-cluster.html\">Mutaciones simult\u00e1neas de documentos<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_autonumber\">Auton\u00famero<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Couchbase Server no ofrece actualmente ning\u00fan tipo de generaci\u00f3n autom\u00e1tica de claves o numeraci\u00f3n secuencial de claves.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Sin embargo, puede <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/current\/sdk\/core-operations.html\">utilizar el <strong>Contador<\/strong> funci\u00f3n<\/a> hacer algo parecido. La idea es que un documento se reserva como un documento contador especial. Este documento se puede incrementar como una operaci\u00f3n at\u00f3mica, y el n\u00famero se puede utilizar como una clave parcial o total del nuevo documento que se est\u00e1 creando.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Ratnopam Chakrabarti, desarrollador de Ericsson, escribi\u00f3 recientemente un <a href=\"https:\/\/www.couchbase.com\/blog\/es\/using-autonumber-in-couchbase\/\">entrada de blog invitado sobre c\u00f3mo crear claves numeradas secuencialmente con Couchbase Server<\/a>. Su ejemplo est\u00e1 en Java, pero es bastante f\u00e1cil de seguir, as\u00ed que no repetir\u00e9 su ejemplo aqu\u00ed.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_or_ms_and_odms\">OR\/Ms y ODMs<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Si utiliza SQL Server, es posible que est\u00e9 familiarizado con los OR\/M (Object-relational mappers). Entity Framework, NHibernate, Linq2SQL y muchos otros son OR\/Ms. Los OR\/Ms intentan tender un puente entre los datos estructurados en C# y los datos normalizados en bases de datos relacionales. Tambi\u00e9n suelen proporcionar otras capacidades como proveedores de Linq, unidad de trabajo, etc. Creo que los OR\/M siguen la regla del 80\/20. Pueden ser muy \u00fatiles. Pueden ser muy \u00fatiles el 80% de las veces, y un grano en el culo el 20% restante.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>En el caso de las bases de datos de documentos, el desajuste de impedancia es mucho menor, ya que los objetos C# pueden serializarse\/deserializarse a JSON, y no tienen que dividirse en un conjunto normalizado de tablas.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Sin embargo, las dem\u00e1s funcionalidades que ofrecen los OR\/M pueden seguir siendo \u00fatiles en las bases de datos de documentos. La herramienta equivalente se denomina ODM (Object Document Model). Estas herramientas te ayudan a definir un conjunto de clases para mapear documentos. Ottoman y Linq2Couchbase son ODMs populares para Couchbase, para Node y .NET respectivamente.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><a href=\"https:\/\/github.com\/couchbaselabs\/Linq2Couchbase\">Linq2Base<\/a> tiene un proveedor Linq. No es un proyecto oficialmente soportado (todav\u00eda), pero es uno de los proveedores Linq m\u00e1s completos que he usado, y es usado en producci\u00f3n por clientes de Couchbase.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>A continuaci\u00f3n se muestra un ejemplo de la documentaci\u00f3n de Linq2Couchbase que deber\u00eda resultar familiar a los usuarios de Entity Framework y NHibernate.Linq:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\">var context = new BucketContext(ClusterHelper.GetBucket(\"muestra-viaje\"));\r\nvar query = (from a in context.Query()\r\n             where a.Pa\u00eds == \"Reino Unido\"\r\n             select a).\r\n             Take(10);<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Tambi\u00e9n utilic\u00e9 Linq2Couchbase en el c\u00f3digo de ejemplo para esta serie de blogs. Aqu\u00ed hay un ejemplo para Shopping Carts:<\/p>\n<\/div>\n<div class=\"listingblock\">\n<div class=\"content\">\n<pre class=\"highlight decode:true\"><code class=\"language-C#\">var query = from c in _context.Query()\r\n    where c.Type == \"ShoppingCart\" \/\/ podr\u00eda utilizar el atributo DocumentFilter en lugar de este Where\r\n    orderby c.FechaCreaci\u00f3n descendente\r\n    select new {Cart = c, Id = N1QlFunctions.Meta(c).Id};\r\nvar results = query.ScanConsistency(ScanConsistency.RequestPlus)\r\n    .Take(10)\r\n    .ToList();<\/code><\/pre>\n<\/div>\n<\/div>\n<div class=\"paragraph\">\n<p>Adem\u00e1s de ser un gran proveedor de Linq, Linq2Couchbase tambi\u00e9n tiene una funci\u00f3n experimental de seguimiento de cambios. Merece la pena echarle un vistazo. Brant Burnett es uno de los principales contribuidores al proyecto, y tambi\u00e9n es un <a href=\"https:\/\/developer.couchbase.com\/experts-and-champions?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">Experto en Couchbase<\/a>. Present\u00f3 una sesi\u00f3n en Couchbase Connect 2016 llamada <a href=\"https:\/\/www.youtube.com\/watch?v=X__mC2FArp4\">LINQing a los datos: Facilitar la transici\u00f3n desde SQL<\/a>.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>[youtube https:\/\/www.youtube.com\/watch?v=X__mC2FArp4&amp;w=560&amp;h=315]<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_transactions\">Transacciones<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Ya he cubierto los bloqueos pesimista y optimista para transacciones sobre un \u00fanico documento. Debido a esto, podemos decir que Couchbase soporta transacciones ACID a nivel de documento. Couchbase no soporta, en este momento, transacciones ACID entre m\u00faltiples documentos.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Pensando en el <a href=\"https:\/\/www.couchbase.com\/blog\/es\/moving-from-sql-server-to-couchbase-part-1-data-modeling\/\">primera entrada en el blog sobre modelado de datos<\/a>En comparaci\u00f3n con un modelo relacional, la necesidad de transacciones multi-documento es a menudo reducida o eliminada. Un concepto (como la cesta de la compra) puede requerir filas en m\u00faltiples tablas en un modelo relacional, pero un \u00fanico modelo de documento en Couchbase.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Si sigue un modelo referencial, como en el ejemplo de las redes sociales del <a href=\"https:\/\/www.couchbase.com\/blog\/es\/moving-from-sql-server-to-couchbase-part-1-data-modeling\/\">primera entrada en el blog<\/a>Si se trata de un modelo de datos, es posible que le preocupe la falta de transacciones. Esto pone de relieve la importancia de pensar en los casos de uso al crear el modelo de datos. Si las transacciones son vitales para su caso de uso, el modelo de datos a menudo se puede estructurar para adaptarse. <a href=\"https:\/\/www.couchbase.com\/blog\/es\/forums\/\">Estaremos encantados de ayudarle, \u00a1s\u00f3lo tiene que ped\u00edrnoslo!<\/a><\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>El soporte de transacciones multi-documento puede venir en el futuro si suficientes desarrolladores y clientes de Couchbase lo piden o lo necesitan. As\u00ed que, si haces el ejercicio de dise\u00f1ar un modelo de datos de base de datos de documentos, y las transacciones son <em>todav\u00eda<\/em> una parte vital de tu proyecto, entonces Couchbase puede no ser el mejor \"sistema de registro\" para al menos parte de tu proyecto. Couchbase todav\u00eda puede ser el mejor \"sistema de compromiso\", capaz de ayudar con el escalado, el almacenamiento en cach\u00e9, el rendimiento y la flexibilidad cuando sea necesario.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p><em>Como nota al margen, puede que merezca la pena echar un vistazo al <a href=\"https:\/\/ndescribe.atlassian.net\/wiki\/display\/DOC\/Transactional+Documents\">NDescribir proyecto<\/a>ya que incluye un SDK que funciona sobre el SDK de Couchbase y proporciona un sistema de transacciones. (Ten en cuenta que no es una herramienta soportada oficialmente).<\/em><\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_ssis_ssas_ssrs\">SSIS, SSAS, SSRS<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>No todo el mundo utiliza SQL Server Integration Services (SSIS), SQL Server Analysis Services (SSAS) y SQL Server Reporting Services (SSRS), pero se trata de potentes funciones que SQL Server ofrece para la integraci\u00f3n, la generaci\u00f3n de informes y el an\u00e1lisis.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>No puedo decirte \"usa X en lugar de Y\" para esto, porque depende mucho de tu caso de uso. Puedo indicarte algunas de las herramientas disponibles para Couchbase que giran en torno al procesamiento de datos, transformaci\u00f3n de datos, informes y an\u00e1lisis.<\/p>\n<\/div>\n<div class=\"ulist\">\n<ul>\n<li><strong>Kafka<\/strong> es una herramienta de flujo de datos de c\u00f3digo abierto. Algunas de las <a href=\"https:\/\/kafka.apache.org\/uses\">casos de uso populares para Kafka<\/a> incluyen mensajer\u00eda, seguimiento de la actividad del sitio web, m\u00e9tricas y mucho m\u00e1s.<\/li>\n<li><strong>Chispa<\/strong> es un motor de procesamiento de datos, destinado al procesamiento de datos a gran escala y ETL.<\/li>\n<li><strong>Hadoop<\/strong> es un marco de macrodatos para el almacenamiento y procesamiento distribuidos.<\/li>\n<\/ul>\n<\/div>\n<div class=\"paragraph\">\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/es\/bigdata\/\">Couchbase tiene conectores<\/a> que admiten cada una de estas tres populares herramientas.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Por fin, <a href=\"https:\/\/developer.couchbase.com\/documentation\/server\/4.5\/analytics\/introduction.html\"><strong>An\u00e1lisis de Couchbase<\/strong> se encuentra actualmente en versi\u00f3n preliminar para desarrolladores<\/a>. Est\u00e1 pensado como un motor de gesti\u00f3n de datos que se ejecuta en paralelo a Couchbase Server. Es una vista previa para desarrolladores, y a\u00fan no se recomienda su uso en producci\u00f3n, pero puedes <a href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/\">descarga Couchbase Analytics y las extensiones Kafka, Spark, Hadoop (haz clic en la pesta\u00f1a Extensiones) y pru\u00e9balas<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>\n<div class=\"sect1\">\n<h2 id=\"_summary\">Resumen<\/h2>\n<div class=\"sectionbody\">\n<div class=\"paragraph\">\n<p>Hemos cubierto el modelado de datos, la migraci\u00f3n de datos y la migraci\u00f3n de aplicaciones a trav\u00e9s de la lente de SQL Server. Este es un buen punto de partida para su pr\u00f3ximo proyecto, y le dar\u00e1 algo en qu\u00e9 pensar si est\u00e1 considerando migrar.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>En <a href=\"https:\/\/developer.couchbase.com\/?utm_source=blogs&amp;utm_medium=link&amp;utm_campaign=blogs\">Portal para desarrolladores de Couchbase<\/a> contiene m\u00e1s detalles e informaci\u00f3n sobre cada aspecto de Couchbase Server.<\/p>\n<\/div>\n<div class=\"paragraph\">\n<p>Quiero que me cuentes qu\u00e9 puede hacer Couchbase para facilitarte la transici\u00f3n, tanto si est\u00e1s migrando como si empiezas de cero. \u00bfMe he perdido algo? \u00bfTienes alguna herramienta o sistema que recomiendes? \u00bfTienes preguntas? Echa un vistazo a la <a href=\"https:\/\/www.couchbase.com\/blog\/es\/forums\/\">Foros de Couchbase<\/a>env\u00edeme un correo electr\u00f3nico a <a href=\"mailto:matthew.groves@couchbase.com\">matthew.groves@couchbase.com<\/a> o b\u00fascame en <a href=\"https:\/\/twitter.com\/mgroves\">Twitter @mgroves<\/a>.<\/p>\n<\/div>\n<\/div>\n<\/div>","protected":false},"excerpt":{"rendered":"<p>Moving from SQL Server to Couchbase Part 3: App Migration In this series of blog posts, I\u2019m going to lay out the considerations when moving to a document database when you have a relational background. Specifically, Microsoft SQL Server as [&hellip;]<\/p>","protected":false},"author":71,"featured_media":2574,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1811,1814,1816,1819,1812],"tags":[1806,1556],"ppma_author":[8937],"class_list":["post-2708","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-dotnet","category-application-design","category-couchbase-server","category-data-modeling","category-n1ql-query","tag-entity-framework","tag-sql-server"],"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>Moving from SQL Server to Couchbase Part 3: App Migration<\/title>\n<meta name=\"description\" content=\"In this blog post series, I&#039;m laying out the considerations when moving from Microsoft SQL Server to Couchbase Server. This post is about app migration.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/moving-sql-server-couchbase-app-migration\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Moving from SQL Server to Couchbase Part 3: App Migration\" \/>\n<meta property=\"og:description\" content=\"In this blog post series, I&#039;m laying out the considerations when moving from Microsoft SQL Server to Couchbase Server. This post is about app migration.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/moving-sql-server-couchbase-app-migration\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2017-03-07T17:51:19+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-09-12T09:19:18+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/geese-migration.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2048\" \/>\n\t<meta property=\"og:image:height\" content=\"949\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Matthew Groves\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@mgroves\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Matthew Groves\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/\"},\"author\":{\"name\":\"Matthew Groves\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58\"},\"headline\":\"Moving from SQL Server to Couchbase Part 3: App Migration\",\"datePublished\":\"2017-03-07T17:51:19+00:00\",\"dateModified\":\"2024-09-12T09:19:18+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/\"},\"wordCount\":3837,\"commentCount\":2,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/geese-migration.jpg\",\"keywords\":[\"Entity Framework\",\"SQL Server\"],\"articleSection\":[\".NET\",\"Application Design\",\"Couchbase Server\",\"Data Modeling\",\"SQL++ \/ N1QL Query\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/\",\"name\":\"Moving from SQL Server to Couchbase Part 3: App Migration\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/geese-migration.jpg\",\"datePublished\":\"2017-03-07T17:51:19+00:00\",\"dateModified\":\"2024-09-12T09:19:18+00:00\",\"description\":\"In this blog post series, I'm laying out the considerations when moving from Microsoft SQL Server to Couchbase Server. This post is about app migration.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/geese-migration.jpg\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/geese-migration.jpg\",\"width\":2048,\"height\":949,\"caption\":\"Geese migration licensed through Creative Commons https:\/\/commons.wikimedia.org\/wiki\/File:BrantaLeucopsisMigration.jpg\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Moving from SQL Server to Couchbase Part 3: App Migration\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"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\/3929663e372020321b0152dc4fa65a58\",\"name\":\"Matthew Groves\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g\",\"caption\":\"Matthew Groves\"},\"description\":\"Matthew D. Groves is a guy who loves to code. It doesn't matter if it's C#, jQuery, or PHP: he'll submit pull requests for anything. He has been coding professionally ever since he wrote a QuickBASIC point-of-sale app for his parent's pizza shop back in the 90s. He currently works as a Senior Product Marketing Manager for Couchbase. His free time is spent with his family, watching the Reds, and getting involved in the developer community. He is the author of AOP in .NET, Pro Microservices in .NET, a Pluralsight author, and a Microsoft MVP.\",\"sameAs\":[\"https:\/\/crosscuttingconcerns.com\",\"https:\/\/x.com\/mgroves\"],\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/matthew-groves\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Migraci\u00f3n de SQL Server a Couchbase Parte 3: Migraci\u00f3n de aplicaciones","description":"In this blog post series, I'm laying out the considerations when moving from Microsoft SQL Server to Couchbase Server. This post is about app migration.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/moving-sql-server-couchbase-app-migration\/","og_locale":"es_MX","og_type":"article","og_title":"Moving from SQL Server to Couchbase Part 3: App Migration","og_description":"In this blog post series, I'm laying out the considerations when moving from Microsoft SQL Server to Couchbase Server. This post is about app migration.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/moving-sql-server-couchbase-app-migration\/","og_site_name":"The Couchbase Blog","article_published_time":"2017-03-07T17:51:19+00:00","article_modified_time":"2024-09-12T09:19:18+00:00","og_image":[{"width":2048,"height":949,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/geese-migration.jpg","type":"image\/jpeg"}],"author":"Matthew Groves","twitter_card":"summary_large_image","twitter_creator":"@mgroves","twitter_misc":{"Written by":"Matthew Groves","Est. reading time":"17 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/"},"author":{"name":"Matthew Groves","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/3929663e372020321b0152dc4fa65a58"},"headline":"Moving from SQL Server to Couchbase Part 3: App Migration","datePublished":"2017-03-07T17:51:19+00:00","dateModified":"2024-09-12T09:19:18+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/"},"wordCount":3837,"commentCount":2,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/geese-migration.jpg","keywords":["Entity Framework","SQL Server"],"articleSection":[".NET","Application Design","Couchbase Server","Data Modeling","SQL++ \/ N1QL Query"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/","url":"https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/","name":"Migraci\u00f3n de SQL Server a Couchbase Parte 3: Migraci\u00f3n de aplicaciones","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/geese-migration.jpg","datePublished":"2017-03-07T17:51:19+00:00","dateModified":"2024-09-12T09:19:18+00:00","description":"In this blog post series, I'm laying out the considerations when moving from Microsoft SQL Server to Couchbase Server. This post is about app migration.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/geese-migration.jpg","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2017\/02\/geese-migration.jpg","width":2048,"height":949,"caption":"Geese migration licensed through Creative Commons https:\/\/commons.wikimedia.org\/wiki\/File:BrantaLeucopsisMigration.jpg"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/moving-sql-server-couchbase-app-migration\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Moving from SQL Server to Couchbase Part 3: App Migration"}]},{"@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\/3929663e372020321b0152dc4fa65a58","name":"Matthew Groves","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/ba51e6aacc53995c323a634e4502ef54","url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","caption":"Matthew Groves"},"description":"A Matthew D. Groves le encanta programar. No importa si se trata de C#, jQuery o PHP: enviar\u00e1 pull requests para cualquier cosa. Lleva codificando profesionalmente desde que escribi\u00f3 una aplicaci\u00f3n de punto de venta en QuickBASIC para la pizzer\u00eda de sus padres, all\u00e1 por los a\u00f1os noventa. Actualmente trabaja como Director de Marketing de Producto para Couchbase. Su tiempo libre lo pasa con su familia, viendo a los Reds y participando en la comunidad de desarrolladores. Es autor de AOP in .NET, Pro Microservices in .NET, autor de Pluralsight y MVP de Microsoft.","sameAs":["https:\/\/crosscuttingconcerns.com","https:\/\/x.com\/mgroves"],"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/matthew-groves\/"}]}},"authors":[{"term_id":8937,"user_id":71,"is_guest":0,"slug":"matthew-groves","display_name":"Matthew Groves","avatar_url":"https:\/\/secure.gravatar.com\/avatar\/70feb1b28a099ad0112b8d21fe1e81e1a4524beed3e20b7f107d5370e85a07ab?s=96&d=mm&r=g","author_category":"","last_name":"Groves","first_name":"Matthew","job_title":"","user_url":"https:\/\/crosscuttingconcerns.com","description":"A Matthew D. Groves le encanta programar.  No importa si se trata de C#, jQuery o PHP: enviar\u00e1 pull requests para cualquier cosa.  Lleva codificando profesionalmente desde que escribi\u00f3 una aplicaci\u00f3n de punto de venta en QuickBASIC para la pizzer\u00eda de sus padres, all\u00e1 por los a\u00f1os noventa.  Actualmente trabaja como Director de Marketing de Producto para Couchbase. Su tiempo libre lo pasa con su familia, viendo a los Reds y participando en la comunidad de desarrolladores.  Es autor de AOP in .NET, Pro Microservices in .NET, autor de Pluralsight y MVP de Microsoft."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2708","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\/71"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=2708"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/2708\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/2574"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=2708"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=2708"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=2708"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=2708"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}