25 ago 2014

Relaciones en bases de datos

Cuando aprendemos el modelo relacional, el cual es el mas conocido en teoría de datos; normalmente se nos enseña que existen 4 tipos de relaciones:
  • Uno a uno (1 a 1)
  • Uno a muchos (1 a N)
  • Muchos a muchos (N a M)
  • Muchos a uno (N a 1)
Lo que pocas veces se nos explica claramente es que el modelo relacional solo es válido durante la fase de diseño del modelo conceptual, que nos permite documentar y definir un modelo de datos solo a nivel de concepto, así pues, no todos los tipos de relaciones del modelo relacional son válidos para un modelo de base de datos lógico o físico. Pasamos a explicar lo anterior:


Relación uno a uno (1 a 1)

 Las relaciones uno a uno No deben existir en una base de datos pues eso denota inmediatamente que se hizo un mal trabajo de normalización. Ya que cada tabla representa una entidad de la base de datos. Una relación uno a uno, significaría que cada tabla es 'media' entidad o dos tablas representan un asunto o entidad. Lo correcto seria fusionar las columnas de las dos tablas en una sola.
Siendo poco estrictos es verdad que existen relaciones uno a uno en situaciones especiales (desnormalización planeada) por convenir así; por ejemplo: si un campo de una tabla se actualiza constantemente y queremos disminuir el riesgo de colisión en bloqueos, se puede aislar ese campo en una tabla que lo contenga y esté relacionado con una llave primaria idéntica a la llave primaria de la primera tabla.

Tabla normalizada
Producto
* ID
Codigo
Descripcion
Costo
Precio
UltVenta


Tabla desnormalizada con relación uno a uno
Producto
* ID
Codigo
Descripcion
Costo
Precio

Producto2
* ID
UltVenta


Concluimos que una relación uno a uno No es una relación normal y comúnmente no debería existir en una base de datos.



Relaciones uno a muchos (1:N)

Las relaciones uno a muchos son las mas comunes y en realidad es la 'única' relación válida para una base de datos, así; un Cliente puede tener muchas Facturas, una Población tiene muchos Clientes y una Venta puede incluir muchos Productos.


Relaciones muchos a muchos (N:M)
Las relaciones muchos a muchos definitivamente son un tipo de relación que no existen en una base de datos por una simple razón... son imposibles de implementar a menos que se haga un terrible trabajo de diseño y por supuesto de normalización, ya que implicaría que un mismo registro se repitiera para cada relación.
Por ejemplo, para un Producto hay muchos Proveedores y para un Proveedor hay muchos Productos.
Este tipo de relaciones solo se implementa de manera eficiente si se crea una tabla intermedia que relaciona ambas entidades, para este caso crearíamos la tabla ProductoProveedor de la siguiente manera:
ProveedorProducto
* IDProducto
* IDProveedor
A este tipo de Entidades se les conoce como Entidades débiles, ya que no representan un asunto u objeto de la realidad que intentan resolver. Dicho sea de paso, este tipo de Entidades son las únicas que llegan a cuarta o quinta forma normal.
En el modelo físico las relaciones muchos a muchos se descomponen en relaciones uno a muchos a uno.

Relaciones muchos a uno (N:1)
Bueno, este tipo de relaciones solo es importante en el modelo conceptual, ya que en el modelo lógico y físico, normalmente da la misma distancia de ida que de vuelta, es muy sencillo deducir que es la misma relación 1 a muchos vista desde la derecha.
 Las relaciones muchos a uno se tratan de una relación uno a muchos vista desde el otro lado.

* Recomiendo estudiar de manera independiente las 3 etapas del diseño de bases de datos, iniciando por el modelo conceptual, pasando al modelo lógico y finalizando con el diseño físico definido por el manejador de base de datos a utilizar.

Al llegar al modelo físico es importante comprender y utilizar adecuadamente las reglas de normalización, así como hacer un análisis correcto de cuando es conveniente saltarse alguna regla por ser conveniente a la funcionalidad del sistema o manejo de datos.

Conclusión: Siendo estrictos y siguiendo al pie de las letra las reglas de normalización, nos quedamos con la relación uno a muchos, y eliminamos la relación muchos a uno simplemente moviendo la tabla inicial de la relación a la izquierda y cambiando la relación por uno a muchos



22 oct 2013

Reunion de Comunidad .NET Tepic

Este martes 22 de Octubre tendremos la reunión de Comunidad .NET dentro del marco de la semana de Ciencia y Tecnología; el CETIS 100 ha tenido a bien proporcionarnos el auditorio para nuestra reunión de comunidad. Hay gran entusiasmo entre los miembros de la comunidad, alumnos y profesores que esperan esta serie de conferencias orientadas al tema de la educación.
 
Durante esta serie de conferencias se mostrarán productos Microsoft que facilitan el proceso de aprendizaje relacionado a la programación y las TICs en general, además el material y cursos gratuitos online.

Durante el transcurso de las conferencias se realizaran demostraciones practicas en el uso de los diferentes productos mostrados. Por ejemplo, para el tema de bases de datos se mostrara como realizar consultas aun servidor remoto desde consola o desde el Management Studio, incluso se realizara una consulta distribuida.



La sede es:


CETIS 100
Puerto Rico 39,
Col. Miravalles
Tepic, Nay, Mexico.

13 jun 2013

Perfil del (buen) programador

La programación de computadoras es un trabajo que require conocimiento de múltiples disciplinas y mucho se escribe sobre lo que es necesario que sepa o lo que es inútil para un programador. En este artículo intentaré describir lo que desde mi perspectiva como programador con 20 años de experiencia es importante que deba estar entre los conocimientos de un buen programador.

Al iniciar a programar, es indispensable que un programador aprenda un lenguaje de programación y todas las estructuras de control, el concepto de variable, objeto, alcance de variables, etc.

Más adelante entre los conocimientos fundamentales de todo buen programador están las estructuras de datos, matemáticas discretas, base de datos relacionales y teoría de sistemas cliente-servidor.

Por otro lado deberían conocer la arquitectura SOA y su implementación más  extendida que son los WebServices



 ESTRUCTURAS DE CONTROL
. Preparan al estudiante en el conocimiento de los elementos esenciales de un lenguaje de programación y si se trata de un lenguaje moderno debería ser orientado a objetos.


MATEMATICAS DISCRETAS
. La teoría de conjuntos es uno de los temas dentro de las matemáticas discretas; permitirá en un futuro programar fácilmente código que incluye manejo de conjuntos de cualquier tipo, además que facilitará la comprensión y creación de consultas en lenguaje SQL. Por otro lado la lógica que se ve en este tema, ademas de ser un buen ejercicio mental, apoyará en la resolución de problemas lógicos durante la codificación.

Los árboles de decisiones, grafos y autómatas son algunos de los temas que proporcionan conocimientos esenciales a un buen programador con lo cual crear software innovador y le permite tener las bases para crear nueva tecnología. En general las matemáticas discretas es un tema fundamental en la formación de todo futuro programador.


ESTRUCTURA DE DATOS
. El tema de estructura de datos es un pilar de la programación de computadoras, ya que permitirá programar con solidez muchas soluciones para problemas comunes. Las estructuras de datos también son la base de tecnologías conocidas ampliamente, por ejemplo los árboles B, que son la base de la implementación de la mayoría de las bases de datos relacionales. En manejadores de bases de datos como SQL Server y Access, los conceptos de páginas de datos, llave clustered y/o primaria corresponden o tienen una similitud muy cercana a urnas y estructuras de árbol B. https://sites.google.com/site/clasearbolesb/arboles-b


BASES DE DATOS
La teoría relacional es esencial cuando se trata de crear una solución con datos empresariales o de cualquier tipo que contiene entidades que se relacionan. La arquitectura cliente-servidor va de la mano de este tema, pues hoy en día se manejan grandes cantidades de datos que serían imposibles de administrar con un sistema basado en archivos. Por otro lado la arquitectura cliente-servidor provee el conocimiento que permite entender mejor el funcionamiento de servidores Web, FTP, etc.

Los conocimientos de Arboles B y otras estructuras de datos apoyan en gran manera en la implementación de las bases de datos relacionales. Un buen diseñador de bases de datos relacionales realizará un mejor trabajo si comprende exactamente conceptos y técnicas como Urnas, Llave Primaria, Llave secundaria, Normalización, etc.




SOA / WEBSERVICES
Hoy en día no se concibe un programador que no conoce SOA y su implementación mas conocida: WebServices; en un mundo conectado es muy frecuente que los sistemas intercambien información e interactúen de manera automática. Con la arquitectura SOA  se adquieren la capacidad de conectar sistemas localizados en cualquier parte del mundo o crear una aplicación distribuida.



DESARROLLO WEB Y MOVILES
Un vocero de Microsoft declaró recientemente que al menos el 80% de sus programadores estaban trabajando en algún producto relacionado con la nube; esto indica que la tendencia del mercado es el modelo de software como servicio (SAAS). Es por esto que actualmente es importante desarrollar para la web y los móviles, ademas de poder desarrollar servicios web (webservices).



En definitiva el conocimiento de estructuras de datos, matemáticas discretas y arquitectura SOA entre otros resulta fundamental en la formación de un buen programador, el carecer de una buena formación en cualquiera de ellas podría resultar en serias deficiencias como programador.

He escuchado en repetidas ocasiones frases como: "Los mejores programadores que conozco son contadores, administradores..." y definitivamente tienen razón, pero estas personas tendrán que aprender todos estos temas si desean programar software de mayor complejidad. Mi respuesta a estos comentarios es: "Conozco muy buenos albañiles que hacen casas igual o mejor que un arquitecto, pero no conozco un albañil que construya edificios de 10 pisos o plazas comerciales".

En definitiva ser buen programador va mas allá de aprender un lenguaje de programación. Se requiere como ya mencioné de matemJticas discretas, estructuras de datos, modelo relacional, arquitectura SOA y otras técnicas y conocimientos importantes.

4 jun 2013

Reparar base de datos SQL Server 2005 o posterior

En algunas ocasiones las base de datos se dañan con fallas de hardware, apagones inesperados del servidor y transacciones interrumpidas incorrectamente. SQL Server provee de sentencias que permiten verificar y reparar una base de datos con inconsistencias o dañada.

Antes de realizar el siguiente procedimiento deberia realizar un respaldo de la base de datos dañada si lo permite SQL Server o hacer una copia física de los archivos.


Paso 1: se coloca la base de datos en modo emergencia y usuario único
Alter Database mibd SET SINGLE_USER
Alter Database mibd SET EMERGENCY


Paso 2: Reparar la base datos
DBCC CHECKDB('mibd', REPAIR_ALLOW_DATA_LOSS)

. Repita este paso hasta que el mensaje sea '0 errores encontrados' para la base de datos
. La sentecia CHECKDB con la opcion REPAIR_ALLOW_DATA_LOSS elimina datos de ser necesario para realizar la reparación o corregir la consistencia de los datos, para una reparación más rápida y sin pérdida de datos pruebe la opcion REPAIR_REBUILD, aunque en ocasiones con esta opción no se repara completamente la base de datos.


Paso 3: Regresar a multiusuario y colocar en linea la base de datos
Alter Database mibd SET ONLINE
Alter Database mibd SET MULTI_USER


Aunque esto permite recuperar la base de datos en la mayoría de los casos, es altamente recomendable tener una estrategia correcta de respaldo o recuperación de la base de datos tales como espejos de discos, servidor reflejado, recuperación completa, etc.

29 sept 2012

MICROSOFT ACCESS 2010 RUNTIME CON SP1

Ya pasó más de un año desde que Microsoft liberó el Service Pack 1 del Runtime de Access 2010 y es momento que muchos esperan la versión del instalador del runtime con el service pack integrado. Si se intenta una instalación desde cero con el SP1 del runtime, nos indicará como requisito tener instalado el runtime de Microsoft Access 2010.




Después de investigar un poco me di a la tarea de encontrar la manera de integrar el SP1 a la versión base del runtime. La solución es por demás sencilla una vez que se descubre como hacerlo.




Proceso de Creación del paquete de instalación Access runtime 2010 con service pack 1
  • Se descarga la instalación inicial del runtime desde http://www.microsoft.com/en-us/download/details.aspx?id=10910, seleccione la versión de 32 bits o 64 bits según se desee.
  • Ejecute desde linea de comandos el instalador del runtime con la opción /extract, como se muestra en el ejemplo: C:\AccessRuntime.exe  /extract:C:\AccessRuntime2010x32_with_sp1\
  • Descargue el SP1 correspondiente al runtime desde http://support.microsoft.com/kb/2460015/es
  • Ejecute desde la línea de comandos el instalador del sp1 con la opción /extract indicando como destino la carpeta "updates" incluido dentro de la carpeta donde se extrajo previamente el runtime.
Ejemplo: C:\accessruntime2010sp1-kb2460015-x86-fullfile-es-es.exe  /extract:C:\AccessRuntime2010x32_with_sp1\Updates
  • Hasta este momento ya tenemos una carpeta preparada para la instalación del runtime de Access 2010 incluyendo el sp1 en un solo paso, si deseamos contar con un instalador de un solo archivo ejecutable, tendremos que hechar mano de Winrar y comprimir 'el contenido de la carpeta' que creamos con los siguientes parámetros:
 
Activamos la opción 'Crear un archivo autoextraíble' 
 
  
Hacemos clic en la pestaña Avanzado y luego en el botón Autoextraíble:
 
 
Vamos a la pestaña Instalación y en el recuadro 'Ejecutar tras la extracción' tecleamos: setup.exe 
 
 
 Vamos a la pestaña Modos y activamos el recuadro 'Descomprimir en una carpeta temporal' 
 
 
Vamos a la pestaña 'Texto e icono' y colocamos el título de la instalación si lo deseamos:

 
Finalizamos dando Aceptar en este recuadro, y luego en Aceptar en la ventana principal de Winrar y se creará un archivo ejecutable que contiene la instalación del runtime de Access 2010 con el sp1 integrado. Les dejo los links de los instaladores que he creado por si prefieren ahorrrarse el proceso.