Teoría BBDD

Claves Foráneas (FK): Trucos, Ventajas e Inconvenientes

En las bases de datos, las claves foráneas (FK) son una herramienta esencial para mantener la integridad referencial entre las tablas. Sin embargo, su uso puede tener tanto ventajas como desventajas, especialmente en términos de rendimiento y consumo de CPU. Tanto es así que por ejemplo MySQL por defecto renuncia a la integridad referencial en pro de la velocidad. Otros SGBD relacionales como SQL Server, PostgreSQL u Oracle sí que tratan las FK como una restricción. Comprender este comportamiento es clave para entender el comportamiento de nuestras bases de datos. Pero, veámoslo con detenimiento.

¿Qué son y cómo funcionan las FK?

Como hemos adelantado en la introducción, las claves foráneas son una forma de garantizar la integridad referencial en nuestras bases de datos. Cuando definimos una FK, estamos creando una relación entre dos tablas, donde una tabla tiene una columna o un conjunto de columnas que hacen referencia a una clave primaria en otra tabla. De esta manera no podremos crear en nuestra tabla destino registros con un valor que no exista previamente en la tabla de referencia.

Pensad en un modelo normalizado donde tenemos una tabla de cabeceras de facturas y en otra tabla las líneas de esas facturas. Una FK entre las tablas nos permitirá no poder tener en la tabla de líneas ningún registro que pertenezca a una factura inexistente. Esto tiene más implicaciones, como por ejemplo que en la tabla de facturas no podamos editar o borrar un dato si tiene líneas asociadas que, de otra manera, quedarían huérfanas. 

Actualización y Borrado en Cascada

Las claves foráneas en SQL Server y otros sistemas permiten configurar acciones de actualización y borrado en cascada. Esto significa que cuando se actualiza o se elimina un registro en la tabla principal, SQL Server automáticamente actualizará o eliminará los registros correspondientes en las tablas relacionadas.

La principal ventaja de la actualización y borrado en cascada es que simplifica la gestión de las bases de datos. No necesitamos escribir código adicional para manejar estas operaciones, ya que SQL Server se encarga de ello por nosotros. Esto puede ahorrar tiempo y reducir la posibilidad de errores.Sin embargo, la actualización y borrado en cascada también tienen sus inconvenientes. Si no se utilizan correctamente, pueden llevar a la eliminación inadvertida de datos. Por lo tanto, es importante utilizar estas características con cuidado y entender completamente sus implicaciones antes de implementarlas.

En resumen, la actualización y borrado en cascada son herramientas poderosas que pueden simplificar la gestión de nuestras bases de datos. Sin embargo, como con cualquier herramienta, deben utilizarse con cuidado y con un entendimiento completo de sus ventajas e inconvenientes.

Ventajas de las FK

Las FK proporcionan varias ventajas. La más importante, como ya hemos visto, es la garantía de la integridad referencial. Esto significa que no podemos tener datos huérfanos en nuestra base de datos. Además, las FK pueden ayudar a mejorar la legibilidad y la organización de nuestra base de datos. Además tienen otra gran ventaja que a menudo pasamos por alto y no es otra que facilitarnos la comprensión del modelo de datos.

Mantenimiento de la Integridad referencial

Las FK garantizan que los datos en las tablas relacionadas siempre sean consistentes. Esto es crucial para evitar anomalías de datos y garantizar la precisión de los resultados de las consultas.

Comprensión del modelo de datos

Las FK simplifican el proceso de entender el modelo de datos, sobre todo cuando nos enfrentamos a él por primera vez y no hay documentación. Al proporcionar conexiones claras entre las tablas es sencillo entender esas relaciones para cualquiera que lo sepa leer.

Inconvenientes de las FK

A pesar de sus ventajas, las FK, como todo, también tienen sus inconvenientes. Como hemos mencionado, pueden afectar al rendimiento y al consumo de CPU y disco. Además, pueden complicar las operaciones de inserción, actualización y eliminación, ya que requieren comprobaciones adicionales.

Rendimiento

El uso de FK puede tener un impacto significativo en el rendimiento y el consumo de CPU y el disco duro de nuestra base de datos. Cuando se inserta, actualiza o elimina un registro en una tabla que tiene una FK, SQL Server debe realizar comprobaciones adicionales en todas las tablas referenciadas para mantener la integridad referencial. Esto puede aumentar el tiempo de ejecución de estas operaciones y, por lo tanto, el consumo de CPU y disco. Personalmente he llegado a operaciones tan simples como un DELETE por la PK de una tabla que, debido a las FK, obliga a SQL Server a leer más de 50 tablas. Tenemos que tener cuidado con esto sobre todo a medida que el modelo de datos crece y las relaciones entre las tablas se complican.

Además, las verificaciones de integridad referencial requieren un procesamiento adicional, lo que puede aumentar el consumo de CPU además del disco duro. En sistemas con una gran cantidad de transacciones, esto puede ser un problema. Recuerda mantener siempre una buena monitorización sobre el rendimiento de tu modelo de datos.

Complejidad de las operaciones de escritura

No solo nos vamos a encontrar con degradaciones en el rendimiento de SQL Server sino que, para nosotros como DBAs y para los administradores de los datos también se va a añadir una capa de complejidad a la hora de trabajar con los datos. Son escenarios muy comunes para un DBA el de restaurar solo los datos de una tabla de la copia de seguridad o el de copiar datos entre distintos entornos. En estos casos, por ejemplo, tendremos que tener muy claro el orden de las inserciones y deberemos hacerlo de manera secuencial para evitar errores. O eso o deshabilitamos temporalmente las FK pero en este caso deberemos validarlas otra vez al activarlas y en tablas grandes eso es inviable. 

Indexar para evitar los inconvenientes de las FK

Como hemos podido ver, el hecho de tener FKs en nuestra base de datos va a añadir una lógica adicional a las transacciones de escritura lo que va a provocar un mayor consumo de recursos y por tanto un peor rendimiento de nuestro SQL Server. En este sentido, el indexado de los campos de las claves foráneas es una práctica esencial que puede mejorar significativamente el rendimiento de nuestras bases de datos. Crear índices para esos campos referenciados por una clave foránea permitirá, que a la hora de actualizar o borrar un registro en la tabla principal, SQL Server pueda usarlos para verificar rápidamente la integridad referencial sin tener que leer completamente la tabla.

Conclusión

Las claves foráneas son una herramienta poderosa en SQL Server pero también es un arma de doble filo. Aunque pueden tener un impacto en el rendimiento y el consumo de CPU, los beneficios que aportan en términos de integridad referencial suelen superar estos costes. Como siempre, la clave está en entender cómo funcionan y usarlas de manera inteligente. Recuerda, cada base de datos es un mundo y lo que funciona en uno puede no funcionar en otro. Por lo tanto, siempre es recomendable probar y monitorizar el rendimiento antes de implementar cualquier cambio a gran escala.

Como siempre, te animo a experimentar con estas técnicas y a explorar todas las posibilidades que ofrecen. Si tenéis alguna duda o sugerencia, podéis dejarla en Twitter, por mail o dejarnos un mensaje en los comentarios. Y recuerda que también tenemos un grupo de LinkedIn y un canal de YouTube a los que te puede unir. ¡Hasta la próxima!

Publicado por Roberto Carrancio en Rendimiento, SQL Server, 1 comentario

VLF: Entendiendo el Log de SQL Server nivel pro

En nuestra constante búsqueda de optimización y eficiencia en el manejo de bases de datos, nos encontramos con una pieza clave en el rompecabezas de SQL Server: los Virtual Log Files (VLF). Estos componentes, aunque pequeños y a menudo pasados por alto, son fundamentales para el rendimiento y la gestión de nuestras bases de datos. Hoy, nos sumergimos en el mundo de los VLF para entender su función y cómo una gestión adecuada puede marcar la diferencia en nuestro trabajo diario como DBAs. Referenciando nuestro artículo anterior ¿Cómo funcionan los ficheros de Log de SQL Server?, podemos recordar que el log de transacciones juega un papel vital en la recuperación de datos y, los VLFs, como parte fundamental de los logs, tienen la misma importancia.

¿Qué son los VLF y por qué son importantes?

Los VLF son segmentos virtuales en los que se divide el archivo de log de transacciones de una base de datos en SQL Server. Es decir, SQL Server no trabaja con el fichero de log completo sino con pequeñas particiones del mismo. Cada vez que se crea o se expande un log, SQL Server lo divide en varios VLFs. La cantidad y el tamaño de estos VLF pueden tener un impacto significativo en el rendimiento de la base de datos, especialmente durante operaciones de recuperación y respaldo. En casos extremos, si tenemos el log muy particionado puede afectarnos también al rendimiento de nuestras transacciones. 

Gestión Efectiva de VLF

Para mantener un sistema saludable, es crucial gestionar adecuadamente los VLF. Un número excesivo de VLF pequeños puede causar lentitud en el proceso de recuperación de la base de datos, mientras que muy pocos VLF grandes pueden dificultar el proceso de respaldo. Por ello, encontrar el equilibrio correcto es esencial. Los VLF son los bloques de construcción de este log, y su gestión eficiente permite una recuperación más rápida y una mejor disponibilidad de la base de datos.

Una estrategia efectiva para la gestión de VLF implica monitorear su cantidad y tamaño regularmente. SQL Server proporciona herramientas que nos permiten visualizar y ajustar estos parámetros, como el deprecado comando DBCC LOGINFO o su nueva versión, la función sys.dm_db_log_info. Además, prácticas como el truncamiento regular del log y la expansión controlada del archivo de log ayudan a mantener un número óptimo de VLF.

Creación de VLFs

Hemos visto que el motor de SQL Server crea automáticamente los VLFs durante el crecimiento de los ficheros de logs, sin embargo, esto no significa que nosotros no podamos influir sobre ello. Simplemente tendremos que conocer qué reglas sigue SQL para crear VLFs para adaptarnos a ello. Antes de nada tenemos que especificar que las reglas de creación de VLFs han cambiado con SQL 2022 por lo que tanto para esta versión como para Azure tendremos que tenerlo en cuenta. Veamos cómo se crean los VLFs:

  • Cuando el crecimiento del archivo de log es menor a 64 Mb SQL creará 4 VLFs en versiones antiguas y solo 1 VLF en SQL 2022 y en Azure.
  • Si el crecimiento del archivo de log es igual o mayor a 64 Mb pero menor a 1 Gb se crearán 8 VLFs.
  • Si el crecimiento del archivo de log es igual o mayor a 1Gb se crearán 16 VLFs.

Cuantos VLFs tienen mis logs

Ya sabemos cómo se crean los VLFs y por qué podemos llegar a tener muchos en nuestros mecheros de logs pero, no os he dicho aún cómo comprobar en vuestras bases de datos cuantos VLFs teneis. Para ello usaremos el siguiente script. Y ahora la pregunta clave, ¿Cuántos VLF debería tener? La respuesta es depende, no hay una respuesta universal a esta pregunta. Personalmente creo que sobre 50 es una buena cifra pero dependerá en gran medida del tamaño del fichero de log. 

Hora de hacer números y corregir los VLF

Supongamos que nuestra base de datos tiene un log de 20Gb y hemos visto que por alguna mala práctica del pasado tenemos muchos VLF. Lo primero que tendremos que hacer es un shrink para reducir el log lo máximo posible. Una vez con el log en su tamaño mínimo vamos a volver a dimensionarlo a sus 20Gb originales pero siguiendo las buenas prácticas de VLF. Vamos a crear un número de VLF cercano a 50. Para ello no podemos dimensionar directamente en 20Gb porque solo nos crearía 16 VLF y serían muy grandes para ser administrados por SQL de manera óptima. Qué pasa si aumentamos 8 Gb iniciales, luego otros 8 y terminamos con un crecimiento de 4 Gb. Esto serían 3 crecimientos del fichero superiores a 1 Gb por lo que se nos crearían 16 VLF en cada “salto”, 16*3=48. Parece bastante razonable. Ahora, si el fichero puede necesitar crecer en un futuro, podría ser interesante hacer 3 crecimientos de 8 Gb lo que nos daría 24 Gb de log repartidos igualmente en 48 VLF (unos ficheros de 512 Mb cada uno, algo asumible).

Conclusión

La gestión de VLF no es solo una tarea de mantenimiento; es una oportunidad para maximizar el rendimiento de nuestras bases de datos. Al comprender la importancia de estos elementos y aplicar prácticas de gestión efectivas, podemos asegurar un sistema robusto y ágil. Los VLF son, sin duda, pequeños gigantes en el mundo de SQL Server, y su correcta administración está reservada a unos pocos DBAs expertos con gran pericia técnica, como vosotros ahora.

Espero que este artículo te haya sido útil. Si tenéis alguna duda o sugerencia, podéis dejarla en Twitter, por mail o dejarnos un mensaje en los comentarios. Y recuerda que también tenemos un grupo de LinkedIn y un canal de YouTube a los que te puede unir. ¡Hasta la próxima!

Publicado por Roberto Carrancio en Rendimiento, SQL Server, 0 comentarios

¿Cómo funcionan los ficheros de Log de SQL Server?

En el artículo de hoy vamos a profundizar en los ficheros de log. Estos ficheros representan una de las herramientas más potentes para garantizar la integridad y la recuperación de datos. Estos archivos, a menudo subestimados, son fundamentales para el funcionamiento de cualquier sistema que dependa de la gestión de datos transaccionales como es SQL Server. 

¿Qué son los ficheros de Log?

Los ficheros de log, también conocidos como archivos de transacciones, registran todas las operaciones que modifican los datos o la estructura de la base de datos. Cada transacción en SQL Server comienza con una entrada en el log, asegurando que cualquier cambio pueda ser rastreado y, si es necesario, revertido o reproducido. Físicamente, los podemos encontrar como ficheros con extensión LDF. 

La importancia de los Logs en la recuperación de datos

Como ya vimos en el artículo sobre los CHECKPOINTS, una de las funciones más críticas de los ficheros de log es su papel en la recuperación de datos. En caso de un fallo del sistema, los logs son esenciales para restaurar la base de datos a un punto consistente en el tiempo, minimizando la pérdida de datos y manteniendo la integridad de los datos. Esto, en última instancia, nos garantiza la continuidad de nuestro negocio.

El impacto del nivel de recuperación en el comportamiento de la base de datos

El nivel de recuperación de una base de datos es un factor determinante en la forma en que SQL Server maneja los ficheros de log y, por ende, afecta directamente el comportamiento de la base de datos. Al seleccionar un modelo de recuperación, estamos definiendo cómo y cuándo se registran las transacciones en los ficheros de log, lo que tiene implicaciones significativas en la disponibilidad, la integridad y la recuperabilidad de los datos.

Modelo de recuperación simple

Con el modelo de recuperación simple, SQL Server minimiza el mantenimiento de los ficheros de log al truncar automáticamente los registros de transacciones que ya no son necesarios para la recuperación. Truncar el fichero significa vaciarlo, sin embargo, como ya hemos comentado en más ocasiones, el tamaño del fichero no se reduce, se queda pre dimensionado para cuando otras transacciones lo necesiten. Este modelo de recuperación de las bases de datos reduce el espacio de almacenamiento requerido y simplifica la gestión, pero limita la capacidad de recuperar la base de datos a puntos específicos en el tiempo, ofreciendo solo la posibilidad de restaurar hasta el último respaldo completo o diferencial.

Modelo de recuperación completa

A diferencia del modo simple, el modelo de recuperación completa mantiene un registro detallado de todas las transacciones, lo que permite una recuperación punto a punto. Esto significa que podemos restaurar la base de datos a cualquier momento específico, siempre y cuando dispongamos de los respaldos de log necesarios. Para entendernos, las transacciones no se borran del fichero de log nada más concluyen (commit o rollback) sino que se mantienen en el fichero hasta que se hace una copia de seguridad. Este nivel de detalle, por tanto, requiere una gestión más activa de los ficheros de log para evitar un crecimiento excesivo y problemas de rendimiento.

Modelo de recuperación bulk-logged

El modelo de recuperación bulk-logged es una variante del modelo completo que ofrece una solución intermedia. Permite operaciones masivas de datos, como importaciones o indexaciones, sin registrar cada detalle en el log mientras mantiene todo el detalle de las transacciones normales. Esto nos permite reducir el tamaño del fichero durante estas operaciones. Aunque ofrece ciertas ventajas en términos de rendimiento, también conlleva un riesgo mayor en la recuperación de datos, ya que no se pueden recuperar transacciones individuales realizadas durante las operaciones masivas.

Gestión y mantenimiento de los ficheros de Log

Una gestión efectiva de los ficheros de log implica monitorear su tamaño y realizar un mantenimiento regular, como el truncamiento de log, que libera espacio para nuevas transacciones. Ignorar estas prácticas puede llevar a un crecimiento descontrolado del log y afectar negativamente el rendimiento del sistema. 

Como hemos visto, el log de transacciones almacena las transacciones en curso en el modelo de recuperación simple o, en el modo completo las en curso y las finalizadas de las que no dispongamos backup. Podemos entender entonces que, puede llenarse completamente por varias razones, que van desde un gran número de transacciones hasta consultas mal optimizadas o configuraciones inadecuadas. Uno de los factores más comunes es la retención de registros de transacciones debido a transacciones largas o no completadas. Además, si el modelo de recuperación de la base de datos está configurado como completo o bulk-logged y no se realizan copias de seguridad del log de forma regular, el log seguirá creciendo, ya que SQL Server espera que estos registros estén disponibles para una posible recuperación punto a punto.

¿Por qué no se vacía mi log de transacciones?

SQL Server proporciona una columna muy útil en la vista de catálogo sys.databases llamada log_reuse_wait_desc, que indica la razón por la cual el espacio del log de transacciones no se puede reutilizar. Algunos de los tipos de log_reuse_wait más comunes son:

  1. ACTIVE_TRANSACTION: Indica que hay una transacción activa que impide el truncamiento del log.
  2. LOG_BACKUP: Señala que se necesita una copia de seguridad del log para permitir la reutilización del espacio.
  3. CHECKPOINT: Sugiere que no se ha alcanzado un punto de control que permita el truncamiento del log.
  4. ACTIVE_BACKUP_OR_RESTORE: Implica que una operación de copia de seguridad o restauración está en curso, lo que impide el truncamiento.
  5. REPLICATION: Indica que la replicación no ha terminado de procesar los registros que necesitan ser distribuidos. Este tipo de espera se usa también para Log Shipping.
  6. DATABASE_MIRRORING: Señala que el espejo de base de datos está activo y que los registros aún no se han enviado a la réplica secundaria.
  7. AVAILABILITY_REPLICA: Indica que una réplica de disponibilidad de AlwaysOn está aplicando registros del log a una base de datos secundaria.

Cada uno de estos estados requiere una acción específica para liberar espacio en el log de transacciones. Por ejemplo, si el log_reuse_wait_desc muestra LOG_BACKUP, se debe realizar una copia de seguridad del log para permitir que el espacio sea reutilizado. Si muestra ACTIVE_TRANSACTION, se debe investigar y resolver la transacción larga o bloqueada.

Conclusión

Los ficheros de log son el core de la seguridad y la integridad de las bases de datos en SQL Server. Su correcta gestión y comprensión son esenciales para cualquier DBA que busque asegurar la máxima eficiencia y confiabilidad en sus sistemas. Al dominar los ficheros de log, nos equipamos con una poderosa herramienta para enfrentar casi cualquier desafío en el mundo de las bases de datos.

Entender por qué se llena el log de transacciones y cómo gestionar los diferentes tipos de log_reuse_wait es esencial para cualquier administrador de bases de datos SQL Server. Una gestión adecuada del log no solo previene problemas de rendimiento, sino que también asegura la disponibilidad y la recuperabilidad de la base de datos. Con este conocimiento, los DBAs podemos tomar medidas proactivas para mantener el log de transacciones en un tamaño manejable y garantizar el funcionamiento óptimo de nuestros sistemas de bases de datos.

Espero que este artículo te haya sido útil. Si tenéis alguna duda o sugerencia, podéis dejarla en Twitter, por mail o dejarnos un mensaje en los comentarios. Y recuerda que también tenemos un grupo de LinkedIn y un canal de YouTube a los que te puede unir. ¡Hasta la próxima!

Publicado por Roberto Carrancio en SQL Server, 2 comentarios

Cómo manejar el crecimiento de los datos: Estrategias y soluciones

Los datos son el activo más valioso de cualquier organización, pero también suponen un gran desafío para nosotros, los administradores de bases de datos (DBAs). El crecimiento exponencial de los datos, impulsado por la digitalización, el internet de las cosas, el big data y la inteligencia artificial, requiere soluciones eficientes y escalables que garanticen el rendimiento, la disponibilidad y la seguridad de las bases de datos.

En este artículo, vamos a explorar algunas de las estrategias y soluciones que los DBAs podemos implementar para manejar el crecimiento de los datos en nuestras bases de datos, una de las plataformas de gestión de datos más populares y robustas del mercado. Veremos las tendencias y predicciones que marcarán el futuro de las bases de datos, y cómo podemos adaptarnos a ellas con éxito.

¿Qué es el crecimiento de los datos y por qué es un problema?

El crecimiento de los datos se refiere al aumento constante del volumen, la variedad y la velocidad de los datos que se generan, almacenan y procesan en las organizaciones. Según un estudio de IDC, se espera que el volumen global de datos alcance los 175 zettabytes en 2025, lo que supone un incremento del 61% respecto a 2018.

Este crecimiento implica varios retos para nosotros como DBAs, entre los que se encuentran:

  • El aumento de los costes de almacenamiento, infraestructura y licencias.
  • La disminución del rendimiento y la capacidad de respuesta de las consultas y las aplicaciones.
  • La complejidad de gestionar múltiples fuentes, formatos y tipos de datos.
  • La dificultad de garantizar la calidad, la integridad y la seguridad de los datos.
  • La necesidad de cumplir con las normativas legales y regulatorias sobre la protección y el uso de los datos.

Para afrontar estos retos, los DBAs debemos adoptar estrategias y soluciones que nos permitan optimizar el uso de los recursos, mejorar el rendimiento y la disponibilidad, y facilitar la administración y el mantenimiento de las bases de datos.

Estrategias y soluciones para manejar el crecimiento de los datos

Existen diversas estrategias y soluciones que los DBAs podemos aplicar para manejar el crecimiento de los datos en nuestras bases de datos, dependiendo del contexto, las necesidades y los objetivos de cada organización. A continuación, vamos a describir algunas de las más relevantes:

  • Escalado vertical: Consiste en aumentar la capacidad del servidor donde se aloja la base de datos, añadiendo más memoria, procesador o disco. Esta solución es sencilla de implementar, pero tiene limitaciones físicas y económicas. Además, no resuelve el problema de la disponibilidad, ya que si el servidor falla, se pierde el acceso a la base de datos.
  • Escalado horizontal: Consiste en distribuir la carga de trabajo entre varios servidores que contienen réplicas o particiones de la base de datos. Esta solución permite mejorar el rendimiento, la disponibilidad y la escalabilidad, ya que se puede añadir o quitar servidores según la demanda. Sin embargo, requiere una mayor complejidad en la configuración, la sincronización y el balanceo de carga.
  • Bases de datos distribuidas: Consisten en sistemas que almacenan y procesan los datos en múltiples nodos independientes, que pueden estar ubicados en diferentes lugares geográficos. Estos sistemas ofrecen ventajas como la tolerancia a fallos, la elasticidad y la capacidad de manejar grandes volúmenes y variedades de datos. No obstante, presentan desafíos como la consistencia, la latencia y la seguridad.
  • Bases de datos híbridas: Consisten en sistemas que combinan diferentes tipos o modelos de bases de datos, como relacionales, no relacionales o en memoria. Estos sistemas permiten aprovechar las fortalezas y compensar las debilidades de cada tipo o modelo según el caso de uso. Por ejemplo, se puede usar una base de datos relacional para almacenar los datos estructurados y críticos para el negocio, y una base de datos no relacional para almacenar los datos no estructurados o dinámicos.

Tendencias y predicciones sobre el futuro de las bases de datos

El crecimiento de los datos es una realidad que seguirá marcando el futuro de las bases de datos, y que nos exigirá a los DBAs estar al día de las tendencias y predicciones que se perfilan en el horizonte. Algunas de las más destacadas son:

  • El auge de la nube: La nube se ha convertido en una opción cada vez más atractiva y accesible para alojar y gestionar las bases de datos, ya que ofrece beneficios como la reducción de costes, la flexibilidad, la escalabilidad y la seguridad. Según Gartner, se espera que el mercado de servicios de bases de datos en la nube crezca un 23% anual hasta 2025.
  • La importancia de la inteligencia artificial: La inteligencia artificial (IA) es una herramienta clave para extraer valor de los datos, mediante técnicas como el aprendizaje automático, el procesamiento del lenguaje natural o la visión artificial. La IA también puede ayudarnos a los DBAs a optimizar y automatizar tareas como el diseño, monitorización, ajuste o la recuperación de las bases de datos.
  • La convergencia de los datos: Los datos ya no se pueden tratar como entidades aisladas, sino como parte de un ecosistema integrado y conectado. Esto implica que las bases de datos deben ser capaces de interactuar con otras fuentes, plataformas y servicios de datos, tanto internos como externos, para ofrecer una visión holística y actualizada de la información.
  • La ética de los datos: Los datos no solo tienen un valor económico, sino también social y moral. Por ello, los DBAs debemos ser conscientes de las implicaciones éticas que conlleva el manejo de los datos, y respetar los principios de transparencia, privacidad, responsabilidad y equidad. Asimismo, debemos cumplir con las regulaciones legales y normativas que rigen el uso y la protección de los datos.

Conclusión

El crecimiento de los datos es un fenómeno imparable que plantea grandes oportunidades y desafíos para las organizaciones y los DBAs. Para aprovechar las oportunidades y superar los desafíos, es necesario adoptar estrategias y soluciones que permitan manejar el crecimiento de los datos en nuestra base de datos de forma eficaz y eficiente. Además, es imprescindible estar al tanto de las tendencias y predicciones que marcarán el futuro de las bases de datos, y adaptarse a ellas con agilidad e innovación. Solo así se podrá garantizar el éxito y la competitividad en un mundo cada vez más digital y basado en los datos.

Espero que este artículo te haya sido útil y que te ayude a optimizar el rendimiento de tus consultas en SQL Server. Si tenéis alguna duda o sugerencia, podéis dejarla en Twitter, por mail o dejarnos un mensaje en los comentarios. Y recuerda que también tenemos un grupo de LinkedIn y un canal de YouTube a los que te puede unir. ¡Hasta la próxima!

Publicado por Roberto Carrancio en Otros, 0 comentarios

Modelo estrella en profundidad

Los modelos de datos son una forma de representar la información que se almacena en una base de datos. Existen diferentes tipos de modelos de datos, cada uno con sus ventajas e inconvenientes, según el tipo de datos que se quiera gestionar y el objetivo que se persigue. En este artículo vamos a hablar de los modelos de datos en estrella, un tipo de modelo muy utilizado en el ámbito del Business Intelligence y el análisis de datos. Veremos qué son, cómo se construyen y qué beneficios aportan frente a un modelo relacional, que es el más común en las bases de datos relacionales.

¿Qué es un modelo de datos en estrella?

Un modelo de datos en estrella es una forma de organizar los datos en una base de datos que se basa en dos tipos de tablas: una tabla central o tabla de hechos, y varias tablas periféricas o tablas de dimensiones.

Tabla de hechos

La tabla de hechos contiene los datos numéricos o medidas que se quieren analizar, como por ejemplo las ventas, los ingresos, los costes, etc. Cada fila de esta tabla representa un hecho o evento que ha ocurrido en el negocio.

Tablas de dimensiones

Las tablas de dimensiones contienen los atributos o características que describen los hechos, como por ejemplo el cliente, el producto, la fecha, la ubicación, etc. Cada tabla de dimensiones tiene una clave primaria que se relaciona con una clave foránea en la tabla de hechos.

La estructura resultante tiene forma de estrella, donde la tabla de hechos está en el centro y las tablas de dimensiones la rodean. Por ejemplo, si queremos analizar las ventas por cliente, producto y fecha, tendríamos una tabla de hechos con las columnas venta_id, cliente_id, producto_id, fecha_id y cantidad_vendida, y tres tablas de dimensiones con las columnas cliente_id, nombre_cliente, producto_id, nombre_producto y fecha_id, año, mes y día.

Ventajas de un modelo de datos en estrella

Un modelo de datos en estrella tiene varias ventajas frente a un modelo relacional, especialmente para el análisis de datos. Algunas de estas ventajas son:

  • Simplifica las consultas: al tener menos tablas y menos relaciones entre ellas, las consultas son más sencillas y rápidas de escribir y ejecutar. Además, al tener los atributos en las tablas de dimensiones, se evita tener que hacer muchos joins para obtener la información deseada.
  • Facilita el análisis multidimensional: al tener los datos organizados por dimensiones, se puede realizar fácilmente el análisis desde diferentes perspectivas o ángulos. Por ejemplo, se puede analizar las ventas por cliente, por producto o por fecha, o combinar varias dimensiones para obtener resultados más detallados.
  • Mejora el rendimiento: al tener menos tablas y menos columnas, se reduce el espacio ocupado por los datos y se optimiza el acceso a los mismos. Además, al tener los datos numéricos en la tabla de hechos, se pueden aplicar técnicas como la agregación o el precálculo para mejorar la velocidad de las consultas.
  • Favorece la comprensión: al tener los datos más estructurados y organizados por temas o conceptos, se facilita la comprensión y el uso de los mismos por parte de los usuarios finales o analistas.

Modelo de Estrella vs Modelo Relacional

Un modelo relacional es el tipo de modelo más habitual en las bases de datos relacionales. Se basa en normalizar los datos para evitar la redundancia y la inconsistencia. Para ello, se dividen los datos en varias tablas relacionadas entre sí mediante claves primarias y foráneas.

Un modelo relacional tiene como objetivo principal garantizar la integridad y la calidad de los datos. Sin embargo, también tiene algunos inconvenientes para el análisis de datos. Algunos de estos inconvenientes son:

  • Complejidad en las consultas: La estructura relacional, ideal para entornos OLTP tienen muchas tablas y muchas relaciones entre ellas. Esto hace las consultas de análisis de datos más complejas y lentas de escribir y ejecutar. Además, al tener los atributos repartidos por varias tablas, se requieren muchos joins para obtener la información deseada.
  • Dificulta el análisis multidimensional: al tener los datos dispersos por varias tablas, se dificulta el análisis desde diferentes perspectivas o ángulos. Tenemos que pensar que este modelo está pensado para procesos específicos eficientes y no para un análisis global. Por ejemplo, para analizar las ventas por cliente, producto y fecha, se tendría que acceder a varias tablas y combinarlas mediante joins.
  • Rendimiento: al tener muchas tablas y muchas columnas, se incrementa el espacio ocupado por los datos y se ralentiza el acceso a los mismos cuando se quieren analizar todos juntos. Además, al tener los datos numéricos repartidos por varias tablas, se dificulta la aplicación de técnicas como la agregación o el precálculo para mejorar la velocidad de las consultas.
  • Comprensión: al tener los datos estructurados y organizados por temas o conceptos, se complica la visualización y el uso de los mismos de manera centralizada por parte de los usuarios finales o analistas.

Conclusión

Los modelos de datos en estrella son una forma de organizar los datos en una base de datos que se adapta muy bien al ámbito del Business Intelligence y el análisis de datos. Al tener una estructura simple y clara, con una tabla de hechos y varias tablas de dimensiones, se facilita la realización de consultas, el análisis multidimensional, el rendimiento y la comprensión de los datos.
Los modelos de datos en estrella son diferentes de los modelos relacionales, que son los más comunes en las bases de datos relacionales. Estos últimos, se basan en normalizar los datos para evitar la redundancia y la inconsistencia, pero también presentan algunos inconvenientes para el análisis de datos, como la complejidad de las consultas, la dificultad del análisis multidimensional, la reducción del rendimiento y la complicación de la comprensión de los datos.

Esperamos que te haya gustado este artículo y que te haya servido para aprender algo nuevo. Si tienes alguna duda o comentario, no dudes en dejarnos un mensaje en Twitter, por mail o dejarnos en los comentarios. Y recuerda que también tenemos un grupo de LinkedIn al que te puedes unir. 

Publicado por Roberto Carrancio en Power BI, 1 comentario

Consejos para un buen modelo de datos

¿Te gustaría mejorar el rendimiento, la seguridad y la calidad de tus bases de datos en SQL Server? ¿Quieres conocer las mejores prácticas para un buen modelo de datos? Entonces este artículo es para ti. Vamos a explicar, cómo diseñar y optimizar tus modelos de datos, siguiendo las recomendaciones de los expertos. ¡Sigue leyendo!

¿Qué es el modelado de datos?

El modelado de datos es el proceso de definir la estructura, las relaciones y las restricciones de los datos que se almacenan en una base de datos. El modelado de datos tiene como objetivo crear un diseño lógico y físico que sea coherente, eficiente y fácil de mantener.

¿Por qué es importante?

El modelado de datos influye directamente en el rendimiento, la seguridad y la calidad de los datos por lo que es muy importante para nosotros. Un buen modelo de datos nos va a permitir, por ejemplo, reducir el espacio ocupado por los datos y mejorar el tiempo de respuesta de las consultas. No solo eso, a menor espacio mayor velocidad en las copias de seguridad y en los planes de mantenimiento, aspecto de vital importancia en entornos grandes y con pocas ventanas de mantenimiento. Además nos evitará la redundancia, la inconsistencia y la corrupción de los datos y facilitará el acceso, la manipulación y el análisis. ¿Necesitas más motivos? Porque esto no es todo, cumplir estas buenas prácticas no solo garantiza integridad, confidencialidad y disponibilidad de los datos, también va a simplificar el desarrollo, la documentación y la evolución de la base de datos.

Tipos de definición de modelos de datos

Antes de entrar en los modelos de datos más comunes, tenemos que ver la forma en la que los definimos. Atendiendo a esto, existen diferentes tipos según el nivel de abstracción y el grado de detalle que presentan. Los más comunes son:

  • Conceptual: representa los conceptos y las entidades del dominio del problema, así como sus atributos y relaciones. Este modelo es independiente de nuestro sistema gestor de base de datos (SGBD) y se suele expresar mediante diagramas entidad-relación (ER).
  • Lógico: especifica las tablas, las columnas, las claves y las restricciones que se van a implementar en la base de datos. Es un modelo dependiente del SGBD y se suele expresar mediante diagramas relacionales o notación SQL.
  • Físico: describe los detalles técnicos de cómo se almacenan y organizan los datos en el disco. Incluye aspectos como el tamaño, el tipo de dato, el índice, la partición o el formato de almacenamiento. Es un modelo específico del SGBD y se suele expresar mediante scripts SQL o herramientas gráficas.

Tipos de modelos de datos

Como hemos comentado antes, existen varios tipos de modelos de datos según las necesidades de cada sistema y no todos están pensados para bases de datos relacionales de las que nos gustan a nosotros.

Modelo relacional

El modelo relacional es el más usado y se basa en el concepto de tabla con filas y columnas que todos conocemos. Cada fila representa un registro o una entidad, y cada columna representa un atributo o una propiedad. Las tablas se relacionan entre sí mediante claves primarias y foráneas, que son valores únicos que identifican a cada registro. El modelo relacional permite realizar consultas complejas y garantiza la integridad y la consistencia de los datos. Este modelo es el usado por las bases de datos relacionales y se aconseja mantener las tablas por lo menos en la tercera forma normal.

Modelo dimensional

Es un modelo alternativo al relacional, que se usa principalmente para fines analíticos y de inteligencia de negocios. El modelo dimensional se basa en el concepto de cubo, que es una estructura multidimensional que contiene medidas y dimensiones. Las medidas son los valores numéricos que se quieren analizar, como ventas, ingresos o costes. Las dimensiones son los atributos que describen las medidas, como tiempo, producto o cliente. El modelo dimensional permite realizar análisis rápidos y flexibles sobre grandes volúmenes de datos sin embargo no es lo ideal para transacciones que buscan el detalle de un registro. Igual que para el modelo relacional la recomendación es llegar, al menos, a 3FN en estos casos es común quedarse en la segunda forma normal. Este tipo de modelo está quedando en desuso en favor de los siguientes que vamos a ver.

Modelo estrella 

Es una evolución del modelo dimensional, que se caracteriza por tener una tabla central llamada tabla de hechos, que contiene las medidas, y varias tablas periféricas llamadas dimensiones, que contienen los atributos. El modelo estrella tiene una estructura simple y eficiente, que facilita el acceso y la navegación por los datos de manera rápida cuando se desea hacer agregaciones y operaciones de consulta masiva. Por lo general encontraremos este modelo en Datamarts y DataWarehouses donde los datos provenientes de otros orígenes ya han sido clasificados y tratados mediante ETLs y esperan a ser usados en reportes de BI.

Modelo copo de nieve 

Pueden existir ocasiones en las que un modelo estrella se nos quede corto. En estas ocasiones, necesitaremos juntar varios modelos de estrellas mediante relaciones más o menos normalizadas, es decir, dividimos el modelo de estrella en subtablas para evitar la redundancia de datos. Esto se llama modelo copo de nieve y tiene una estructura más compleja y detallada, que reduce el espacio ocupado por los datos pero aumenta el número de tablas y las consultas necesarias.

Pasos para realizar un buen modelado de datos en SQL Server?

Ahora que ya sabemos que tipos de modelo existen y cómo definirlos vamos a ver los pasos necesarios para diseñar un buen modelo de datos:

  1. Analizar los requisitos del negocio y del usuario, identificando las entidades, los atributos y las relaciones que se necesitan representar en la base de datos.
  2. Diseñar el modelo conceptual, utilizando diagramas ER o herramientas CASE (Computer-Aided Software Engineering).
  3. Normalizar el modelo conceptual, aplicando las reglas de normalización para eliminar las anomalías y las dependencias funcionales.
  4. Diseñar el modelo lógico, traduciendo las entidades y relaciones del modelo conceptual en tablas y columnas del modelo de datos. Definir las claves primarias, las claves foráneas y las restricciones de integridad referencial si las hubiera.
  5. Diseñar el modelo físico, ajustando el modelo lógico a las características de nuestro SGBD. Elegir los tipos de datos adecuados, crear los índices necesarios, definir las políticas de seguridad y establecer las estrategias de particionamiento, copia de seguridad y recuperación.
  6. Implementar el modelo físico, generando los scripts SQL o utilizando herramientas gráficas como SQL Server Management Studio (SSMS) o SQL Server Data Tools (SSDT).
  7. Validar y verificar el modelo físico, comprobando que cumple con los requisitos del negocio y del usuario, que no contiene errores ni inconsistencias y que ofrece un buen rendimiento.

Conclusión

El modelado de datos es una tarea fundamental para crear bases de datos eficientes, seguras y de calidad en SQL Server. Siguiendo las buenas prácticas que te hemos mostrado en este artículo, podrás diseñar e implementar modelos de datos que satisfagan las necesidades de tu negocio y tus usuarios. 

Esperamos que te haya gustado este artículo y que lo pongas en práctica.  Si tienes alguna duda o comentario, no dudes en dejarnos un mensaje en Twitter, por mail o dejarnos en los comentarios. Y recuerda que también tenemos un grupo de LinkedIn al que te puedes unir. 

Publicado por Roberto Carrancio en Power BI, Rendimiento, SQL Server, 1 comentario

Formas Normales o Normalización de Bases de Datos

En el pasado post, recreamos con IA una entrevista de trabajo para DBA SQL Server. Una de las preguntas de esta entrevista era sobre la normalización de bases de datos y os comenté que esto era muy importante. Es teoría básica de base de datos, pero tan básica que son las normas sobre las que se construyen las bases de datos. Como aún no hemos hablado de ello y todo el que trabaje con base de datos (DBA o usuario) debe conocerlo vamos a dedicarle el artículo de hoy. 

Desde ya os aviso que es un tema puramente teórico, voy a intentar poner ejemplos prácticos para que sea lo más claro posible pero puede que se nos haga a todos un poco de bola. Es normal. Que esto no os pare, como decimos es la base de todo buen profesional de las bases de datos relacionales y debemos conocerlo al detalle, como los mandamientos de la biblia.

¿Qué es la normalización y por qué es tan importante? 

La normalización es el proceso de organizar los datos en una base de datos de forma que se eviten las redundancias, las inconsistencias y las anomalías. Se basa en aplicar una serie de reglas, llamadas formas normales, que definen cómo deben estructurarse las tablas y las relaciones entre ellas. 

La normalización tiene muchos beneficios, como mejorar el rendimiento, facilitar el mantenimiento, garantizar la integridad y optimizar el espacio de almacenamiento.

¿Cómo se aplica la normalización?

Como hemos comentado existen varias formas normales, desde la primera forma normal (1FN) hasta la sexta forma normal (6FN). Cada una de ellas con sus propios requisitos y objetivos. Sin embargo, no siempre vamos a necesitar aplicar todas las formas normales, depende del tipo de datos y del diseño de la base de datos.

A continuación vamos a explicar brevemente cada forma normal con algunos ejemplos.Para el ejemplo vamos a partir de este conjunto de datos que tenemos y vamos a tratar de normalizarlo:

Primera forma normal (1FN)

Esta primera forma normal trata de eliminar registros duplicados y que cada campo de la tabla contenga un único tipo de información Así cada campo de una tabla debe contener un valor único y atómico, es decir, que no se pueda descomponer en partes más pequeñas. Además, cada tabla debe tener una clave primaria que identifique de forma única a cada registro. 

En nuestro ejemplo no teníamos filas duplicadas, pero sí que debemos descomponer la dirección en varios campos atómicos y unificar el tipo de datos de la columna precio. Quedaría de la siguiente manera:

Segunda forma normal (2FN)

Para poder considerar una tabla en 2FN tiene que cumplir con todos los requisitos de la 1FN y, además, que todos los campos que no formen parte de la clave primaria dependan completamente de la clave primaria. Esto significa que si la clave primaria está compuesta por más de un campo, cada campo no clave debe depender de todos los campos clave y no solo de algunos. Deberemos separar nuestra tabla en varias de manera que todos los campos cumplan con este requisito. ¿Os ha explotado la cabeza ahora mismo? No os preocupéis que con el ejemplo lo vamos a ver más claro.

Como hemos dicho el primer requisito es estar en 1FN así que vamos a empezar a trabajar sobre esa tabla ya en 1FN. Tendremos que saber cuál es su clave primaria, podría ser Num Factura + Cliente + Linea Factura. Sin embargo no es un buen candidato a clave primaria porque no con menos campos también logramos identificar inequívocamente todos los registros. La clave será Num Factura + Linea factura. Con esta nueva clave, tanto la fecha como los datos del cliente dependen del número de factura pero no de la línea de la factura así que vamos a hacer 2 tablas separadas.

Tercera forma normal (3FN)

Para cumplir esta 3FN, además de tener que cumplir con la 2FN, cada campo de una tabla debe depender funcionalmente solo de la clave primaria sin que haya dependencias transitivas. Esto significa que si un campo no clave depende de otro campo no clave, debemos eliminar esa dependencia y crear una tabla separada.

Parecido a la 2FN pero un poco más restrictiva, en este caso tenemos que ver las dependencias de los campos con la clave y ver si puede crearse la relación con una clave intermedia. En nuestro caso separaremos los clientes de las facturas y los datos del artículo de las líneas de facturas.

Otras Formas Normales, para un extra de normalización

Lo más normal es normalizar las bases de datos hasta la tercera forma normal, a partir de aquí, aunque sigue siendo recomendable, no siempre se cumple con todo y va a depender más de casos concretos. Vamos a conocerlo aunque ya sin nuestra tabla de ejemplo, pues lo que resta no aplica en nuestro caso.

Cuarta forma normal (4FN)

Esta 4FN dicta que las tablas no deben contener columnas multivalores, es decir, que no haya campos que contengan más de un valor para un mismo registro. Esto significa que si un campo puede tener varios valores posibles para un mismo registro, debemos crear una tabla aparte para almacenar esos valores y relacionarla con la tabla original mediante una clave foránea.

Por ejemplo, si tenemos una tabla de cursos con los campos código de curso, nombre y requisitos previos, debemos eliminar el campo requisitos previos, ya que puede contener más de un valor para un mismo curso. Este campo debe ir en una tabla aparte de requisitos previos y relacionarse con la tabla de cursos mediante una clave foránea.

Quinta forma normal (5FN)

Esta forma normal establece que cada tabla debe estar libre de anomalías de unión o inserción, es decir, que no haya redundancias o inconsistencias al combinar o insertar datos en varias tablas. Esto significa que si tenemos varias tablas relacionadas entre sí mediante claves foráneas compuestas, debemos asegurarnos de que esas relaciones sean necesarias y suficientes para representar los datos correctamente. 

Por ejemplo, si tenemos tres tablas: profesores, asignaturas y horarios, que se relacionan entre sí mediante las claves foráneas código de profesor, código de asignatura y día de la semana, debemos verificar que no haya combinaciones de valores que no tengan sentido o que falten datos. Si un profesor imparte una asignatura en varios días de la semana, debemos tener un registro por cada día en la tabla de horarios. Igualmente, si una asignatura se imparte por varios profesores en diferentes días, debemos tener un registro por cada profesor y día en la tabla de horarios. Si un profesor no imparte ninguna asignatura o una asignatura no se imparte por ningún profesor, debemos tener registros vacíos en la tabla de horarios.

Sexta forma normal (6FN)

Esta forma normal es la más nueva de todas y en algunos sitios no encontraréis referencias a ella justo por esto. Mientras que el resto de FN datan de los años 70, esta última no se dictó hasta los 90.

Establece que cada tabla debe contener sólo un hecho atómico, es decir, que no haya campos derivados o calculados a partir de otros campos. Esto significa que si tenemos una tabla que contiene información que se puede obtener mediante una operación matemática o lógica sobre otros campos, debemos eliminar esa información y crear una tabla aparte para almacenarla. 

Por ejemplo, si tenemos una tabla de facturas con los campos número de factura, fecha, código de cliente, subtotal, impuesto y total, debemos eliminar los campos impuesto y total, ya que se pueden calcular a partir del subtotal y del porcentaje de impuesto aplicable. Estos campos deben ir en una tabla aparte de impuestos y totales y relacionarse con la tabla de facturas mediante una clave foránea.

Conclusión

Enhorabuena si habéis llegado hasta aquí, os adelantaba que iba a ser un artículo denso de teoría pero a medida que lo escribía hasta a mi se me ha hecho cuesta arriba. Es lo que hay, en todos los campos hay que tratar estos artículos teóricos para tener una buena base. En este caso, la normalización es un proceso fundamental para diseñar bases de datos eficientes, consistentes y fáciles de manejar. Espero que este esfuerzo os haya servido para entender mejor la normalización de bases de datos. Practicad con vuestros propios ejemplos y, si os surgen dudas, podéis dejarlo en los comentarios, Twitter o mail y trataré de ayudaros lo mejor que sepa. 

Publicado por Roberto Carrancio en Otros, 4 comentarios