Presentación
SQL Compact Edition es un nuevo integrante de la familia SQL de Microsoft, y se trata de un motor SQL muy liviano y portable, pensado para utilizar pequeñas bases de datos en forma local.
Esta nuevo producto es la evolución de SQL Mobile Edition, el cual nos permitía tener un "mini" motor SQL en dispositivos portátiles (PocketPCs, Smart Phones), ahora extendido al resto de la sistemas operativos Windows (Tablet PCs y computadoras de escritorio).
Arquitectura
SQLCe, a diferencia de sus hermanos mayores, no se trata de un servicio de datos (tipicamente accesible de forma permanente, esperando consultas de aplicaciones cliente, locales o remotas), sino que se trata de una libreria (dll) que es refernciada por la aplicación cliente, es un motor "embebido" en la aplicación, optimizado para dispositivos de escritorio o portátiles.
Características Principales
- SQLCe acepta sintaxis Transact-SQL, lo que lo vuelve facilmente escalable a sus hermanos mayores (SQL Express Edition, Standard Edition, etc). Aún así a la hora de portar código desde/hacia otro SQL Server es necesario tener en cuenta algunos puntos, por ejemplo: los tipos de datos en SQLCe, son un subconjunto de los disponibles para SQL Express Edition.
- No pueden utilizarse Stored Procedures, esta limitación es clave a la hora de pensar en escalabilidad. Puede ser el punto que nos lleve a inclinarnos por SQL Express Edition. Más adelante, en una comparación entre SQLCe y SQL EE voy a resumir algunas razones por las que podría prescindirse de Stored Procedures.
- Una base de datos SQLCe se almacena en un único archivo, lo que facilita la transferencia de bases de datos individuales.
- SQLCe es un conjunto de librerías de alrededor de 2Mb, que pueden ser distribuídas con nuestra aplicación sin necesidad de registrar componentes, ni servicios, por lo tanto, no se necesitan privilegios de administrador durante la instalación, y los recursos de memoria y espacio en disco son mínimos.
- Dado el tipo de dispositivos en los que SQLCe pretende funcionar (desde notebooks, pc's de escritorio a pocket pcs y smartphones), cuenta con características de seguridad, y protección contra errores (robo, perdida de energía) que son exclusivos para estas plataformas.
- Herramientas para la sincronización de datos con SQL Server 2005
Veamos algunos puntos a tener en cuenta al decidir entre SQL Compact Edition y otras bases de datos locales.
SQL Compact Edition vs. XML o Archivos de Texto
- Consultas, transacciones y manipulación de los datos
- Encriptación nativa
SQL Compact Edition vs. Access o FoxPro
- Integración con Visual Studio
- Compatibilidad con el resto de la familia SQL Server
SQL Compact Edition vs. SQL Express Edition
SQL Compact Edition y SQL Express Edition se presentan como las dos opciones, ambas gratuitas, a la hora de implementar bases de datos locales en PC's de escritorio (Windows XP/Vista o Tablet PC), en cambio la opción es clara para dispostitivos móviles (SQLCe), y para bases de datos centrales, multiusuario (SQL Express).
- Stored Procedures
Para los que estén acostumbrados a trabajar con bases de datos centrales, de gran escala, con múltiples usuarios accediendo concurrentemente con diversos privilegios, resulta inmediato basar la capa de datos en Stored Procedures, las históricas razones de esto son 3, voy a resumir porque estas razones podrían no tener tanto peso en un escenario muy distinto, como es una base de datos embebida, local y monousuario (escenario al que apunta SQL Ce).
- Rendimiento: Los stored procedures permiten ejecutar código de acceso a datos, optimizado para este uso. Sin embargo teniendo un solo usuario, sobre una base de datos local, implica que las consultas no llegarán con mayor concurrencia que los clicks de un usuario, por lo tanto (en lo que a performance se refiere) resulta aceptable codificar esta lógica procedural en la capa de datos de la aplicación.
- Abstracción: Acceder a los datos únicamente con stored procedures, es una forma de construir una capa de abstracción sobre éstos, sin embargo tanto el motor de SQLCe como las bases de datos pueden ser distribuídas y versionadas junto con la aplicación, y el beneficio de mantener esa abstracción ya no resulta tan evidente.
- Seguridad: Una vez más, los stored procedures permiten restringir el acceso a los datos, permitiendo únicamente ciertas operaciones sobre éstos, sin embargo la base de datos es distribuída con la aplicación y el usuario es único, en este escenario tienen más sentido otras medidas de seguridad, como encriptar la base de datos, e incluir en ésta únicamente el subconjunto de datos que el usuario local necesita.
- Dicho esto, por supuesto hay que evaluar la escalibilidad de nuestra aplicación, para evitar a toda costa verse en un futuro en la situación de traducir procedimientos C#/Vb.NET, a Transact-SQL.
- Recursos, SQL Ce requiere de solo 2Mb en disco y un uso de memoria y procesador muy inferiores a SQL Express Edition, que al instalarse ocupa alrededor de 200Mb en disco, y al ser un servicio, se encuentra constantemente esperando ser invocado por una aplicación cliente (a pesar de estar preparado para "adormecerse" en períodos de inactividad)
- Instalación, SQL Ce, puede distribuirse con nuestra aplicación, de manera que no requiera privilegios de administrador para instalarse y poder controlar su versionado. Alternativamente puede (como SQL Express) instalarse mediante un MSI, y recibir actualizaciones de Windows Update.
- Almacenamiento, Ambos motores esta limitados a bases de datos de 4Gb, sin embargo las bases de datos de SQLCe estan contenidas en archivos individuales, "code-free" (sin código ejecutable, no sucede lo mismo con bases de datos de SQL Express), que pueden ser encriptados y protegidos con contraseña. Por lo tanto estos archivos pueden ser facilmente enviados, backupeados y asociados a una aplicación mediante una extensión de archivo particular.
Sql Ce con Enterprise Library 3.0
Una de las novedades en Enterprise Library 3.0 es la incorporación de clases para el manejo de SQL Compact Edition, bajo el nuevo namespace System.Data.SqlServerCe.
Una curiosidad es que el manejo de conexiones abiertas es distinto a los demás providers en Enterprise Library, por lo cual es aconsejable (para mantener la performance) utilizar transacciones para mantener una conexion abierta en operaciones en lote. Este comportamiento es explicado aqui:
http://www.codeplex.com/entlib/WorkItem/View.aspx?WorkItemId=9005
(fue reportado como bug, aunque la respuesta aclara que fue una decisión de diseño)
Links
http://www.microsoft.com/sql/editions/compact/default.mspx
http://www.microsoft.com/sql/editions/compact/sscecomparison.mspx
http://www.codeplex.com/entlib/WorkItem/View.aspx?WorkItemId=9005