La migración de SQL a NoSQL parece una contradicción, pero gracias a los avances e innovaciones de la base de datos NoSQL de Couchbase Server, cada vez es más fácil.
En este post, te presentaré una herramienta llamada SqlServerToCouchbaseun intento de herramienta automatizada de código abierto para ayudarte a "convertir" una base de datos Microsoft SQL Server en una base de datos Couchbase Server. Por el camino, veremos estrategias de migración de datos, comparaciones entre términos SQL y NoSQL, y compensaciones entre los dos tipos de bases de datos. Aunque no utilices SQL Server o Couchbase Servereste artículo puede ayudarle en sus esfuerzos de conversión.
Antes de empezar, hay que tener en cuenta que el cambio entre dos bases de datos cualesquiera (de SQL a NoSQL o SQL to SQL) es muy parecido a traducir entre dos idiomas. Existen automatismos como Babelfish, Google Translate, etc. Son herramientas muy útiles para empezar. Son herramientas muy útiles para empezar, pero no sustituyen a la inmersión en el idioma.
#fallo de traducción de Google #oversættelsesfejl pic.twitter.com/SNNoGHBD1Q
- EgoLibris (@egolibris) 17 de mayo de 2017
Más allá de la traducción de la sintaxis, también están los modismos y la cultura que rodean a cualquier tecnología. Ninguna herramienta de automatización puede captar todos los matices, pero vamos a intentarlo para ver hasta dónde podemos llegar.
Convertir SQL a NoSQL: Estrategias de migración de datos
Si estás considerando migrar datos de SQL Server a Couchbase (o de cualquier base de datos relacional a Couchbase), el primer paso es llegar a un acuerdo sobre tus objetivos y planes de alto nivel. Hay varios caminos a seguir, y cada uno de ellos ofrece un equilibrio entre riesgo, esfuerzo y beneficios. Aquí tienes algunos ejemplos de cómo convertir SQL a NoSQL:
Nivel | Descripción | Riesgo | Esfuerzo | Beneficios |
---|---|---|---|---|
1 |
Vuelva a escribir: No hay migración, escríbelo todo |
5/5 |
5/5 |
⭐⭐⭐⭐⭐ |
2 |
Rediseñar el esquema: Mantenga su lógica de negocio, reescriba su capa de datos y esquema, rediseñe totalmente su esquema con un modelo optimizado para NoSQL. |
4/5 |
4/5 |
⭐⭐⭐⭐ |
3 |
Refactorizar primero: Conserve todo, pero refactorice su lógica de datos y esquema RDBMS en un modelo optimizado NoSQL. |
4/5 |
3/5 |
⭐⭐⭐ |
4 |
Optimizar más tarde: Alojar el esquema con el menor número de cambios posible, hacer que la aplicación funcione con la nueva tecnología, refactorizar/optimizar el esquema según sea necesario para mejorar el rendimiento. |
3/5 |
4/5 |
⭐⭐⭐ |
5 |
Sólo acogerlo: Aloje su esquema con el menor número de cambios posible. |
2/5 |
2/5 |
⭐⭐ |
Históricamente, las bases de datos NoSQL se han centrado en la reconstrucción de "Nivel 1" o en proyectos greenfield. Aunque este enfoque permite obtener el máximo beneficio de NoSQL desde el principio, las reconstrucciones son siempre caras y arriesgadas.
Sin embargo, Couchbase Server, junto con las nuevas capacidades que incorpora Couchbase Server 7 (puede descargar Couchbase 7 beta ahora mismo), permite un enfoque de nivel 5 (seguido del nivel 4) que reduce el riesgo y el coste de probar NoSQL. No necesariamente cosechará todos los beneficios de NoSQL de inmediato, pero empezar es más fácil que nunca.
Convertir una consulta SQL en una consulta NoSQL
La mayoría de los desarrolladores y usuarios de bases de datos están familiarizados con las bases de datos relacionales. Esquemas, tablas, filas y columnas, consultas SQL, transacciones ACID. El lenguaje de consulta de Couchbase (N1QL) reconoce desde hace tiempo que SQL es la lingua franca de bases de datos. N1QL actualmente proporciona capacidades SQL completas, incluyendo JOINs, indexación robusta, agregación, CTEs, y más. Esto hace que sea relativamente sencillo para los desarrolladores SQL ser productivos incluso como recién llegados a la oferta NoSQL de Couchbase.
Consejo: Comprobar Por qué los desarrolladores valoran Couchbase y otras investigaciones independientes de TechValidate.
¿Y si la mayoría de los otros conceptos relacionales pudieran traducirse y convertirse con la misma facilidad? Veamos cómo los conceptos de SQL Server podrían ser mapeados a conceptos de Couchbase Server.
Servidor SQL | Servidor Couchbase | Notas |
---|---|---|
Servidor |
Grupo |
Una de las principales ventajas de NoSQL es la escalabilidad y la alta disponibilidad que proporciona la agrupación en clústeres. |
Catálogo/Base de datos |
Cubo |
Los buckets de Couchbase también ofrecen una caché integrada para mejorar el rendimiento. |
Esquema |
Alcance |
Esquema es a menudo sólo "dbo" en SQL Server, pero no siempre. |
Cuadro |
Colección |
Las colecciones son más flexibles: no hay columnas predefinidas ni restricciones |
Fila |
Documento |
JSON en lugar de datos planos |
tSQL |
N1QL |
N1QL no es "SQL-like", es una implementación completa de SQL con extensiones JSON, a veces llamada SQL++. |
Clave principal |
Clave del documento |
Las claves primarias deben ser únicas por tabla, las claves documentales deben ser únicas por colección |
Índice |
Índice |
SQL: Índices en columna(s), Couchbase: Índices sobre campo(s) JSON |
Con este mapeo como base, ¿podemos escribir un programa para convertir automáticamente el contenido de una base de datos SQL Server a una base de datos Couchbase Server?
Creo que podemos recorrer la mayor parte del camino, y he creado un proyecto de código abierto llamado SqlServerToCouchbase para hacer precisamente eso.
Convertir base de datos SQL a NoSQL/Catálogo a Bucket
Voy a utilizar el AdventureWorks muestras proporcionadas por Microsoft en SQL Server. Voy a migrar a una base de datos Couchbase 7 (actualmente en betapero probablemente será RTM este año).
Nota: Estoy usando AdventureWorks2016 porque es la versión de SQL Server que tengo disponible. La mayoría de las versiones anteriores y más recientes deberían funcionar bien, pero si te encuentras con algún problema, cree una incidencia en GitHub!
Puede crear un bucket manualmente en Couchbase Server, o puede hacer que la utilidad cree el bucket por usted automáticamente.
Del esquema al ámbito de aplicación
En SQL Server, un esquema es como un "espacio de nombres" que le permite agrupar objetos (como tablas) con fines de organización/seguridad. Por ejemplo, AdventureWorks contiene esquemas como HumanResources, Person, Production, etc.
Muchos proyectos no utilizan realmente esquemas distintos del esquema "dbo" por defecto. Sin embargo, se puede utilizar un esquema para agrupar datos para un microservicio específico o un inquilino específico en una aplicación multiinquilino.
En Couchbase 7, existe un concepto muy similar llamado "ámbito". Proporciona las mismas ventajas de organización y seguridad para microservicios o multi-tenancy.
Según sus preferencias, la utilidad SqlServerToCouchbase puede crear ámbitos basados en los esquemas de SQL Server, o puede ignorarlos y poner todo en un esquema llamado "_default" (que equivale aproximadamente a "dbo"). En el ejemplo anterior, he optado por crear ámbitos para cada esquema de AdventureWorks.
De la mesa a la colección
En SQL Server, una tabla es una relación estricta (de ahí "relacional") que organiza los datos de forma conjunta.
En Couchbase, no existe una relación estrictamente forzada, pero en Couchbase 7, existe el concepto de un "colección". Aunque no podrá imponer ninguna restricción a los datos (aparte de una clave de documento única, análoga a una clave primaria), puede proporcionar el mismo nivel de organización de datos.
La utilidad SqlServerToCouchbase creará una colección para cada tabla que encuentre. Si elegiste crear ámbitos en el paso anterior, esas colecciones se colocarán dentro del ámbito apropiado.
Consejo: Los nombres de tabla en SQL Server pueden ser mucho más largos que los nombres de colección en Couchbase Server. Por lo tanto, si estás migrando una base de datos con nombres de tabla largos, tendrás que proporcionar explícitamente un nuevo nombre de colección más corto.
¿Y la conversión de la consulta SQL?
La utilidad SqlServerToCouchbase no convertirá (todavía) tus consultas SQL Server por ti, pero aquí tienes una comparación entre una consulta SQL Server de AdventureWorks y la consulta equivalente de la base de datos AdventureWorks convertida en Couchbase.
La siguiente consulta tSQL (tomada de Documentación de Microsoft) está diseñado para "devolver el nombre y apellidos de todos los empleados y las ciudades en las que viven".
1 2 3 4 5 6 7 8 9 10 |
SELECCIONE RTRIM(p.Nombre) + ' ' + LTRIM(p.Apellido) AS Nombre, d.Ciudad DESDE AdventureWorks2016.Persona.Persona AS p INTERIOR ÚNASE A AdventureWorks2016.Recursos Humanos.Empleado e EN p.BusinessEntityID = e.BusinessEntityID INTERIOR ÚNASE A (SELECCIONE bea.BusinessEntityID, a.Ciudad DESDE AdventureWorks2016.Persona.Dirección AS a INTERIOR ÚNASE A AdventureWorks2016.Persona.BusinessEntityAddress AS bea EN a.DirecciónID = bea.DirecciónID) AS d EN p.BusinessEntityID = d.BusinessEntityID PEDIR POR p.Apellido, p.Nombre; |
Los resultados de esta consulta:
Sin apenas cambios, una consulta muy similar puede ejecutarse como una consulta N1QL en Couchbase:
1 2 3 4 5 6 7 8 9 10 |
SELECCIONE RTRIM(p.Nombre) || ' ' || LTRIM(p.Apellido) AS Nombre, d.Ciudad DESDE AdventureWorks2016.Persona.Persona AS p INTERIOR ÚNASE A AdventureWorks2016.Recursos Humanos.Empleado e EN p.BusinessEntityID = e.BusinessEntityID INTERIOR ÚNASE A (SELECCIONE bea.BusinessEntityID, a.Ciudad DESDE AdventureWorks2016.Persona.Dirección AS a INTERIOR ÚNASE A AdventureWorks2016.Persona.BusinessEntityAddress AS bea EN a.DirecciónID = bea.DirecciónID) AS d EN p.BusinessEntityID = d.BusinessEntityID PEDIR POR p.Apellido, p.Nombre; |
La única diferencia en la versión N1QL es el uso de ||
en lugar de +
para la concatenación de cadenas, y los resultados son JSON en lugar de un conjunto de resultados:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
[ { "Ciudad": "Bothell", "Nombre": "Syed Abbas" }, { "Ciudad": "Clavel", "Nombre": "Kim Abercrombie" }, { "Ciudad": "Kenmore", "Nombre": "Hazem Abolrous" }, { "Ciudad": "Seattle", "Nombre": "Pilar Ackerman" }, { "Ciudad": "Monroe", "Nombre": "Jay Adams" }, { "Ciudad": "Issaquah", "Nombre": "François Ajenstat" }, { "Ciudad": "Renton", "Nombre": "Amy Alberts" }, { "Ciudad": "Bellevue", "Nombre": "Greg Alderson" }, { "Ciudad": "Renton", "Nombre": "Sean Alexander" }, { "Ciudad": "Renton", "Nombre": "Gary Altman" }, /// ... etc ... ] |
Esto no no significa que la consulta N1QL está lo más optimizada posible. Por ejemplo, la consulta N1QL anterior no utiliza claves de documento, y tal vez podría beneficiarse de más o diferentes índices. (Dado que sólo necesita FirstName, LastName y City, cubrir el índice(s) podría ser apropiado aquí, por ejemplo). Pero como se trata de una conversión de "nivel 5", debería ser suficiente para empezar.
Conversión de índice a índice
SQL Server permite crear índices en tablas para una o varias columnas.
Couchbase Server también le permite crear índices en colecciones para uno o más campos JSON.
La utilidad SqlServerToCouchbase realizará una conversión directa de los índices de SQL Server.
Por ejemplo, un índice en SQL Server:
1 |
CREAR ÍNDICE Tipo de impuesto de ventas (SalesTaxRate_StateProvinceID_TaxType) EN AdventureWorks2016.Ventas.Tasa de IVA (EstadoProvinciaID, Tipo de impuesto) |
se convertirá en un índice en Couchbase Server:
1 |
CREAR ÍNDICE sql_SalesTaxRate_StateProvinceID_TaxType EN AdventureWorks2016.Ventas.Tasa de IVA (EstadoProvinciaID, Tipo de impuesto) |
Couchbase convertirá todos los índices, pero el nivel de indexación de SQL Server puede ser demasiado alto o demasiado bajo, dependiendo de las consultas que planees ejecutar. Afortunadamente, Couchbase Server 6.6 y posteriores tienen una función integrada de Asesor de índices (un también está disponible la versión web), que le recomendará índices para cualquier consulta N1QL que desee.
Nota: Couchbase Server NO permite el equivalente de escaneos completos de tablas (es decir, índices primarios) por defecto. La utilidad SqlServerToCouchbase no crea índices primarios para cada colección. Si intenta ejecutar una consulta y obtener un mensaje de error como "No hay índice disponible en keyspace", esta es su señal para tratar de utilizar el Index Advisor.
También puede utilizar la función Monitor de índices Couchbase para comprobar la Tasa de Solicitud de Índices (entre otras características de los índices). Esto puede ayudarte a identificar índices que ya no necesitas.
Fila al documento
Una vez que los ámbitos y las colecciones apropiadas están en su lugar, la utilidad SqlServerToCouchbase se puede utilizar para obtener todas las filas de datos de cada tabla y escribirlas en documentos JSON en cada colección.
En su mayor parte, los tipos de datos admitidos por SQL Server mapear bien a JSON tipos de datos. Algunos ejemplos:
Tipo de datos SQL Server | Tipo de datos JSON |
---|---|
char, varchar, nvarchar, etc. |
cadena |
entero, decimal, flotante, real, etc. |
número |
bit |
booleano |
fecha, hora, etc. |
cadena |
Además, hay algunos tipos de datos especializados de SQL Server que la utilidad SqlServerToCouchbase también es capaz de manejar.
Por ejemplo, SQL Server geografía
se convierte en un objeto JSON anidado con propiedades como "Lat" y "Long" y "Z". Este es el documento convertido para la fila de datos de la captura de pantalla anterior.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
{ "AddressID": 1, "DirecciónLínea1": "1970 Napa Ct.", "DirecciónLínea2": null, "Ciudad": "Bothell", "EstadoProvinciaID": 79, "Código postal": "98011", "Localización espacial": { "IsNull": falso, "STSrid": 4326, "Lat": 47.7869921906598, "Largo": -122.164644615406, "Z": null, "M": null, "HasZ": falso, "HasM": falso }, "rowguid": "9aadcb0d-36cf-483f-84d8-585c2d4ec6e9", "FechaModificada": "2007-12-04T00:00:00" } |
Si hay un tipo de datos específico sobre el que tienes curiosidad, prueba la utilidad SqlServerToCouchbase y mira a ver qué pasa. Si no convierte los datos como esperabas, cree una incidencia en GitHub.
De usuario a usuario
SQL Server admite diversos tipos de usuarios, funciones de seguridad y permisos a nivel de base de datos, esquema y tabla.
Couchbase Server tiene autenticación basada en roles (RBAC) que también permite establecer una variedad de permisos a nivel de cubo, ámbito y colección.
La utilidad SqlServerToCouchbase creará usuarios coincidentes y hará todo lo posible para convertir los permisos en la medida de lo posible.
AdventureWorks no contiene ejemplos de usuarios con permisos detallados. Creé los míos propios para representar un subconjunto de permisos para algunas tablas en el esquema Persona.
El usuario correspondiente en Couchbase tendrá permisos similares:
Mientras que SQL Server sólo tiene una API para trabajar con datos (tSQL), Couchbase tiene múltiples: N1QL, clave/valor, búsqueda de texto completo, analítica y más. De ahí que el número de permisos convertidos al usuario en Couchbase sea mayor. A medida que se avanza al "nivel 4", estos pueden ser ajustados según sea necesario.
Advertencia: Usuarios, autenticación, autorización y seguridad es un área en la que definitivamente se debe tener precaución y revisión manual. No deje que este paso sea completamente automatizado hasta que esté seguro de que el resultado es el que desea.
Próximos pasos
La utilidad de "conversión" creará una conversión a Couchbase Server de tu base de datos SQL Server. Sin embargo, actualmente no puede convertir ningún código de cliente. Ese es un problema difícil para cualquier migración de base de datos, no sólo de SQL Server a NoSQL. Sin embargo, ¡no pierdas de vista este blog para futuros artículos sobre la migración de consultas SQL y código de cliente!
Mientras tanto, algunos de los pasos que tendrá que mirar:
- Tendrás que cambiar el acceso a datos en tu cliente para usar un SDK de Couchbase. Por ejemplo, si estás usando ADO.NET, Dapper, PetaPoco, etc, puedes usar el comando SDK .NET de Couchbase.
- ¿Utiliza Entity Framework? Consulte la Proyecto Linq2Couchbase. (Si utiliza Java, consulte Spring Data Couchbase.)
- Couchbase soporta transacciones ACID. Para .NET, Couchbase.Transacciones están actualmente en fase beta. En Couchbase 7, N1QL también soporta
INICIAR/COMPROMETER/RETROCEDER TRANSACCIÓN
- N1QL de Couchbase es una implementación completa de SQL. Sin embargo, como todos los dialectos SQL, hay diferencias entre N1QL y tSQL. Algunas consultas pueden funcionar tal cual, pero en la mayoría de los casos es probable que haya diferencias sintácticas. Echa un vistazo al navegador tutorial interactivo de N1QL.
- ¿Busca un enfoque similar con MySQL? Consulte Migración práctica de sistemas relacionales a colecciones para un enfoque similar que utiliza Python / CLI.
- ¿Busca un enfoque similar con PostgreSQL? Eche un vistazo a Couchgresun proyecto de código abierto apoyado por la comunidad que utiliza un enfoque similar con Golang / CLI.
Resumen
Couchbase Server 7 será la versión más grande e importante de Couchbase Server. No pierdas de vista el blog de Couchbase para leer más artículos como este, diseñados para ayudarte en tu viaje de conversión de SQL a NoSQL.
Couchbase Server 7 beta ya está disponible para que usted descargar y probar. Dado que se trata de una versión beta, agradeceremos cualquier comentario o pregunta que tenga: consulte la página Sección de asistencia Beta en los foros de Couchbase para Couchbase Server 7 y otras versiones beta/preview.