Sei sulla pagina 1di 38

VISUAL BASIC + MYSQL Primera Parte

1. Introduccin 2. Eleccin de una Aplicacin 3. Listado de Requerimientos y Caractersticas El Tringulo de Desarrollo 4. Diseo de Entidades Usuarios Grupos Eventos 5. Entidades y Relaciones 6. Diseo de la Base de Datos Eleccin de una Clave Primaria Eleccin de los Nombres de Campo y Campos Requeridos Relaciones Uno-a-Muchos Relaciones Muchos-a-Muchos 7. Normalizando la Base de Datos Primera Forma Normal Segunda Forma Normal Tercera Forma Normal 8. Eleccin de los Tipos de Columnas y Armado de Sentencias CREATE TABLE NOT NULL, DEFAULT, AUTO_INCREMENT y PRIMARY KEY CHAR vs. VARCHAR Almacenamiento de Nmeros Telefnicos Columnas ENUM Columnas de Fecha Campos TIMESTAMP Claves Primarias Compuestas Definicin de las Tablas Restantes 9. Conclusin

Introduccin Si bien los artculos de vbmysql.com han tenido una buena recepcin, siempre hay algo nuevo para exponer. Cada semana me llegan pedidos de nuevos artculos y cdigos de ejemplo que expliquen algn aspecto nuevo de la utilizacin de Visual Basic y MySQL. Uno de los pedidos recurrentes ha sido el de un tutorial que explique la creacin de una aplicacin, desde el diseo hasta la implementacin, utilizando Visual Basic y MySQL. En respuesta a estos pedidos, he escrito este artculo como el primero de una serie de artculos que proporcionarn una gua completa para la creacin de una aplicacin con Visual Basic.NET y MySQL. Explicar el diseo de aplicaciones, diseo de bases de datos, programacin con bases de datos en VB.NET y la implementacin de la aplicacin terminada. Este tutorial ser muy prctico, documentando la creacin de una aplicacin real que luego estar disponible para ser descargada ya sea en forma binaria o en cdigo fuente para referencia futura. Los archivos intermedios estarn disponibles al final de cada seccin del tutorial para que se familiaricen con el proyecto a medida que vayamos progresando. En esta primera entrega de la serie comentar el diseo de la base de datos de nuestra aplicacin. Una base de datos bien creada puede ser crtica para el xito de tu proyecto de base de datos, permitiendo la capacidad de expansin y escalabilidad, adems de facilitar el desarrollo. En este tutorial describir los pasos a seguir para comenzar con el diseo de la aplicacin, luego seguir con el diseo de la base de datos y terminar con la escritura de las sentencias de creacin de tablas. Eleccin de una Aplicacin Lo primero que necesitamos al crear una aplicacin es un requerimiento. Los programas de computadoras se crean para satisfacer requerimientos de los usuarios de aplicaciones. En mi oficina tenemos muchos empleados, los cuales pueden estar o no en la oficina en un momento dado. En la actualidad, utilizamos una simple aplicacin que registra qu empleados estn en la oficina y muestra un pequeo mensaje con aquellos que no estn, indicando cundo regresarn. Este tipo de software de registro de entradas y salidas es muy comn, pero este tipo de aplicaciones tienen generalmente dos limitaciones; muchas de estas aplicaciones estn limitadas slo a un cierto nmero de usuarios, normalmente alrededor de 50-100. Adems, estas aplicaciones utilizan a menudo archivos planos (flat files) para almacenar informacin, requiriendo que cada usuario tenga acceso a un directorio de red compartido para poder usar el sistema. Estas dos limitaciones pueden vencerse utilizando una base de datos SQL (en ingls, pronunciado ess-que-ell, no sequel). Si la aplicacin que usamos en la oficina tuviese su cdigo fuente disponible, una opcin sera modificarla (la libertad para modificar una aplicacin que se ajuste a tus necesidades es uno de los beneficios del software y herramientas Open Source). Dado que la aplicacin en cuestin es relativamente simple, he preferido rehacerla utilizando Visual Basic y MySQL.

La idea para tu aplicacin puede venir del deseo de crear una mejor ratonera desarrollar una versin mejor de una aplicacin existente. Por otra parte, quizs necesites una aplicacin pero no puedas encontrar un proyecto existente apropiado. Finalmente, la idea puede ser de otra persona, ya sea un cliente o tu empleador. En cualquier caso, el primer paso al desarrollar una aplicacin es decidir qu aplicacin crear. Listado de Requerimientos y Caractersticas Una vez que hayas elegido qu aplicacin vas a desarrollar, es importante decidir especficamente qu es lo que har la aplicacin. Debers definir las funciones bsicas adems de ciertas caractersticas que implementar el software. Si ests desarrollando este software para ti mismo, este paso del proceso de desarrollo puede ser bastante informal, pero no deja de ser importante. Si ests desarrollando software para un cliente o un empleador, entonces es vital que hagas una lista de caractersticas y requerimientos. La lista determinar cules son tus responsabilidades como desarrollador de software y te dar una clara definicin de lo que necesitas para que tu proyecto se considere completo. Tambin debe recordarse que los clientes y empleadores tienden a solicitar funciones adicionales a medida que avanza el proyecto negndose a aportar dinero adicional para implementarlas. Si tienes una lista de funciones a mano, puedes informarle a tu cliente que tu trabajo es implementar las funciones de la lista y que cualquier caracterstica adicional requerir costos adicionales. Adems de listar las caractersticas y requerimientos, tambin querrs desarrollar una lnea de tiempo y un presupuesto. Sera deseable planificar hitos como la finalizacin del proyecto y etapas importantes de trabajo realizado. Por ejemplo, podras planificar un hito para denotar la entrega de los diseos de aplicacin y base de datos al cliente. Tambin podras agregar un hito para la entrega de una demostracin funcional del proyecto. A menudo, estos hitos coinciden con los pagos del cliente cuando trabajas como consultor, estando los pagos definidos en tu presupuesto. El Tringulo de Desarrollo En cuanto al dinero, las funciones y los tiempos, es importante comprender el equilibrio que debe existir entre los tres. Sin dudas, tu cliente pretender que le entregues tantas funciones como sea posible dentro de un pequeo presupuesto y breve perodo de tiempo. Ser importante tener en cuenta que a veces tienes que rechazar algn pedido de funciones o reduccin de tiempos con el propsito de mantener todo equilibrado. Suponte que el tiempo, las funciones y el dinero son las tres esquinas de un tringulo: Aunque es posible estirar las esquinas de este tringulo, no puedes cambiar el rea que ocupa, ya que el rea del tringulo representa tus recursos totales. El efecto de esto es que cada seccin puede aumentar a expensas de las otras dos: Si quieres que un proyecto tenga ms funciones tendrs que utilizar ms tiempo o invertir ms dinero en herramientas o desarrolladores adicionales. Si deseas que un proyecto cueste menos dinero, tendrs que reducir el nmero de funciones o permitir que el proyecto demore ms tiempo (ya sea porque reduces el nmero de desarrolladores o slo les permites trabajar en el proyecto en su tiempo libre). Finalmente, si quieres que el proyecto finalice rpidamente, tendrs que

reducir el nmero de funciones o invertir ms dinero en ms herramientas y/o desarrolladores (o al menos pagarles horas extras a los desarrolladores existentes). Al negociar una lista de funciones y tiempos con tu cliente o empleador, asegrate de recordar el tringulo e incluso mostrrselo a tu cliente para que puedan comprender la relacin entre las funciones, dinero y tiempo. Si ests desarrollando el proyecto para tu propio uso tienes la ventaja de contar con el cliente perfecto, pero recuerda de todos modos que puedes hacer muy poco en tu tiempo limitado. Echemos un vistazo a la lista de funciones y requerimientos de nuestro software de registro de entradas/salidas: * El ingreso al sistema debera solicitar un nombre de usuario y contrasea * Debera mostrarse un mensaje de estado al usuario cuando ingrese al sistema. * Los usuarios podran elegir entre ningn mensaje de estado, un mensaje de estado predefinido o especificar su propio mensaje al ingresar o salir del sistema. * Los ltimos dos mensajes de estado definidos por los usuarios deberan estar disponibles en una lista junto con los predefinidos. * Los usuarios deberan poder ingresar al sistema desde cualquier PC con conexin a Internet, con una conexin encriptada disponible. * Los usuarios deberan poder marcar un compaero y ser notificados cuando ingrese. * Los usuarios deberan dividirse en distintos grupos (Ventas, Contadura, Sistemas, etc.). * La pantalla principal debera mostrar una lista de todo el personal (o grupos seleccionados) con nombres, estados de entrada/salida, mensajes de estado, y campos personalizados. * La aplicacin debe poder minimizarse a la barra de tareas. * Los usuarios deben poder personalizar la apariencia, el tamao de ventana, tamao de fuente, formato de fecha, formato de nombre y colores. * Los usuarios estndar podrn cambiar sus estados, formato de visualizacin y enviarles mensajes a otros usuarios. * Los usuarios recepcionistas podrn cambiar los estados de grupos de usuarios (varios grupos pueden ser recepcionistas). * Los coordinadores podrn agregar/eliminar usuarios dentro de un grupo, cambiar sus estados (de sus grupos) y asignar recepcionistas. * Los administradores podrn crear usuarios, asignar coordinadores y administradores y cambiar la pertenencia a los grupos. No tienen restricciones. * Los usuarios deberan poder elegir entre tener la aplicacin minimizada o maximizada. * Los usuarios deberan poder elegir una frecuencia de actualizacin de la ventana abierta. Tu lista de funciones y requerimientos debera ser tan detallada como sea necesario para ti y tu cliente, y las aplicaciones ms complejas deberan contar con documentacin ms detallada. Una vez que tu lista de funciones, tu presupuesto y tus tiempos hayan sido aprobados puedes seguir con el diseo de la aplicacin.

Diseo de Entidades Un buen acercamiento al diseo de aplicaciones consiste en identificar las distintas entidades que estarn involucradas en la aplicacin. Una entidad es simplemente un objeto sobre el cual deseamos almacenar informacin. El diseo de aplicaciones basado en las entidades que la conforman es un principio bsico de la programacin orientada a objetos. En nuestra aplicacin las entidades principales son nuestros usuarios. Existen cuatro clases de usuarios: Usuario Regular, Recepcionista, Coordinador y Administrador. Hay dos aproximaciones que podemos hacer para representar los distintos tipos de usuarios. Podramos describir cuatro entidades distintas, una para cada tipo de usuario o podramos tener una nica entidad de usuario con un atributo que defina su tipo. Cuando distintas entidades tienen una base en comn pero an conservan diferencias significativas, puede resultar beneficioso pensar en una entidad base que es heredada por las otras entidades. Tomemos como ejemplo los vehculos. Aunque todos los vehculos comparten una base comn al tener ruedas y desplazarse hacia delante y hacia atrs, siguen teniendo caractersticas nicas: Como podrs ver, cada vehculo tiene propiedades comunes a todos los vehculos, tales como las ruedas, volantes y radios. Sin embargo cada vehculo es nico en cierto modo. Los autos son ms pequeos y generalmente llevan ms pasajeros que los camiones. Los camiones llevan menos pasajeros pero tienen ms lugar para transportar cargas. Los taxis son similares a los autos pero llevan pasajeros que pagan una tarifa y tienen radio transmisores y equipos para calcular las tarifas. Podramos incluso haber concebido al taxi como una sub-entidad de un auto, heredando todos los rasgos de un auto y luego agregando otros propios. La nica propiedad particular a cada una de nuestras entidades de usuario es si corresponden a un coordinador, administrador o recepcionista. Como existe una diferencia muy pequea entre los distintos usuarios es mejor crear una nica entidad con una propiedad que designe las responsabilidades administrativas del usuario. Otras entidades de nuestra aplicacin incluyen grupos y eventos. Echemos un vistazo detallado a cada una de las entidades. Usuarios Un usuario es cualquier usuario del sistema. Los usuarios pueden ingresar a la aplicacin, establecer su estado y ver los estados de los dems. Un usuario tiene las siguientes propiedades: * Nombre * Nmero de Telfono * Nombre de Usuario * Contrasea * Administrador (S/No) * Fecha de Alta * Eliminado (S/No)

* Mensajes de Estado Personalizados * Grupos coordinados por el usuario * Grupos para los cuales el usuario es recepcionista El indicador Eliminado se utiliza para determinar si un usuario debe aparecer en los listados. Si bien podemos eliminar fcilmente un usuario de nuestra base de datos cuando abandona la compaa, simplemente es mejor marcarlos como eliminados. Aunque esto ocupa ms espacio en la base de datos, es una buena prctica para conservar los registros. Puedes ver que no hay un estado de Entrada/Salida asociado al usuario, esto se debe a que su estado ser registrado en la entidad Eventos. Grupos Un grupo es un conjunto de usuarios que comparten algo en comn. En la mayora de las empresas el personal se agrupa por departamentos, tales como Contadura, Ventas y Atencin al cliente. Puede ser til permitir que los usuarios sean miembros de ms de un grupo de forma tal que pueda estar en el grupo de su departamento y quizs pertenecer a algn grupo especial formado para un proyecto inter-departamental. Las siguientes propiedades se aplican a los grupos: * Nombre * Fecha de Alta * Descripcin * Privado/Pblico * Eliminado (S/No) * Coordinadores * Recepcionistas Un grupo privado es aquel que no es visible para los usuarios que no pertenecen a l. Un ejemplo sera un grupo de ejecutivos que no desean que sus estados sean conocidos por los no-ejecutivos. Eventos Un evento es simplemente un cambio en el estado de un usuario. Cuando un usuario sale del sistema, se generar un evento que registrar a qu usuario se refiere el evento, si el usuario entr o sali, su mensaje de estado y quin gener el evento. Aunque normalmente un usuario generar su propio evento, los recepcionistas pueden ingresar y retirar usuarios del sistema. Es importante registrar quin ingres o retir a un usuario dado. Las propiedades de los eventos son las siguientes: * Marca de Tiempo * Usuario * Entrada/Salida * Mensaje de Estado * Generador

Una vez que hayamos definido nuestras entidades, podemos armar un diagrama: En la realidad existen algunas entidades ms pero estas tres entidades principales son suficientes para este tutorial. Entidades y Relaciones Ahora que hemos definido nuestras entidades, es necesario estudiar las relaciones entre ellas. MySQL es una base de datos relacional y, como tal, los datos que la componen se definen mediante relaciones. Una forma de definir las relaciones entre entidades es en trminos de las cantidades a cada lado de la relacin entre dos entidades dadas. Por ejemplo, un usuario puede pertenecer a un grupo (Contadura) o muchos grupos (Contadura, Equipo de Fin de Ao, Comit Organizador de Navidad). Esto se denomina relacin de uno-a-muchos. Cada grupo contendr muchos usuarios. La relacin entre las entidades de grupos y usuarios es una relacin muchos-a-muchos (muchos usuarios pertenecen a muchos grupos). La relacin entre los usuarios y eventos es diferente. Un evento se refiere a un usuario, ni uno ms ni uno menos. Un usuario, por el contrario, tendr muchas muchos eventos que se refieren a l. Esto significa que existir una relacin uno-a-muchos entre los eventos y los usuarios. Estos dos tipos de relaciones (uno-a-muchos y muchos-a-muchos) sern tenidos en cuenta cuando diseemos las tablas de nuestra base de datos. Por ahora, dibujemos unas flechitas para identificar una relacin, con las puntas identificando el lado de muchos de la relacin. Las relaciones son opcionales cuando una relacin puede definirse como cero-a-muchas, como es el caso entre las entidades usuario y evento. Un nuevo usuario podra no haber entrado o salido nunca del sistema. En este caso no existiran eventos relacionados con tal usuario. Nuestras entidades afectarn nuestro software de dos formas. Las entidades que hemos diseado sern utilizadas posteriormente para armar la base de las tablas de la base de datos. Adems, estas entidades nos ayudarn a formar las clases, una unidad de construccin de nuestra aplicacin final (el uso de clases en la programacin de aplicaciones se denomina programacin orientada a objetos y ser explicada en una seccin futura del tutorial). Existen unas cuantas maneras de definir entidades de datos y sus relaciones. La descripcin anterior es simplemente un vistazo general para que empieces a pensar en trminos de entidades y no representa ningn mtodo particular concreto para describir ni diagramar entidades. Quieres aprender un mtodo en particular? Depende. Cuando trabajes por tu cuenta desarrollando una aplicacin generalmente alcanza con armar un diagrama rpido de las entidades, sus propiedades y relaciones utilizando algn

sistema que entiendas y con el cual te sientas cmodo. Si tienes que coordinar un gran proyecto y trabajar con otros desarrolladores ser importante que adoptes un enfoque ms formalizado. Un buen sistema que se est haciendo bastante popular es UML, o Unified Modeling Language (Lenguaje de Modelado Unificado). Hay cientos de libros sobre UML, algunos de los cuales estn especficamente orientados al uso de UML para disear aplicaciones en Visual Basic 6. Un ejemplo de esto es Developing Applications with Visual Basic and UML por Paul Reed. Un buen portal sobre recursos UML est disponible por IBM en http://www-306.ibm.com/software/rational/uml/. Presta mucha atencin al documento Introduction to the Unified Modeling Language Diseo de la Base de Datos Una vez que hayamos definido nuestras entidades y sus relaciones, podemos continuar con el diseo del esquema de la base de datos. Al disear una base de datos, querremos dibujar nuestras tablas, con un icono por tabla, e incluir el nombre de la tabla y las columnas que la conforman. Yo utilizar la herramienta de diseo Visio de Microsoft par realizar los diagramas de la base de datos pero ustedes pueden utilizar cualquier herramienta de dibujo que tengan (incluso el precario lpiz). Comencemos por lo siguiente: Eleccin de una Clave Primaria Ya tenemos todas nuestras entidades listadas con los campos que conformaran sus tablas. Lo primero que necesitamos agregar a nuestras tablas es una CLAVE PRIMARIA. Una clave primaria es una columna de la tabla que identifica unvocamente a cada fila de la tabla. En la tabla Usuario podras tentarte y usar Nombre o quizs Nmero de Telfono como clave primaria pero tu empresa podra tener ms de un John Smith o los empleados podran compartir un telfono. Aunque es posible juntar ms de una columna como clave primaria compuesta (por ejemplo, hacer clave primaria la composicin de Nombre y Nmero de Telfono), tienes que asegurarte de que cada entrada sea nica (qu sucede cuando dos John Smiths comparten los telfonos?). Entonces qu usamos como clave primaria? En este caso seguramente sea mejor agregar una nueva columna, llamada ID_Usuario. Esta columna ser un entero y ser incrementado automticamente por MySQL mediante el uso de la palabra clave AUTO_INCREMENT (veremos ms sobre AUTO_INCREMENT luego). Para la tabla Grupo podemos utilizar la columna Nombre como clave primaria, ya es necesario que cada grupo tenga un nombre diferente para evitar la confusin cuando deba elegirse a qu grupos pertenecern los usuarios. Para la tabla Evento podramos usar la columna Marca de Tiempo como clave primaria pero hay una advertencia para este uso: el tipo de datos TIMESTAMP tiene una precisin del orden de segundos, lo que significa que si dos usuarios registran un evento en el mismo segundo (nada improbable en un sistema con cientos de usuarios), se violara el requisito de unicidad de la clave primaria. En este caso tenemos dos alternativas: podemos usar la combinacin de las columnas Usuario y Marca de Tiempo como clave primaria, asumiendo con seguridad que es improbable que un

usuario dispare dos eventos en el mismo segundo. Al usar la clave primaria de otra tabla (el ID_Usuario de la tabla Usuario) como parte de la clave primaria de una tabla, estamos creando lo que se conoce como Relacin Identificatoria. Una relacin identificatoria es aquella donde la tabla o entidad hija no puede existir sin su padre. Usuario y Grupo tienen una Relacin No-Identificatoria porque un Usuario puede existir independientemente de pertenecer a un Grupo, y un Grupo puede existir sin que existan miembros. Un Evento, por el contrario, carece de sentido si no se refiriera a un usuario. Otra opcin es crear una nueva columna (ID_Evento) que sera una vez ms un valor entero AUTO_INCREMENT. Generalmente cualquier enfoque resulta vlido pero hay algo importante que debes tener en cuenta: MySQL y Visual Basic usan diferentes formatos de fecha. El formato YYYY-MM-DD HH:MM:SS de MySQL es generalmente malinterpretado por Visual Basic, que utiliza una fecha con formato M/D/YYYY HH:MM:SS. Veamos las diferencias, primero con una consulta MySQL y luego con un pequeo ejemplo en VB:
mysql> select now(); +---------------------+ | now() | +---------------------+ | 2004-01-05 13:29:03 | +---------------------+ 1 row in set (0.02 sec)

Y ahora en la ventana inmediato de VB:


?now 1/5/2004 1:25:38 PM

Como podrs ver, hay grandes diferencias en el manejo de fechas. Aparte del orden de los valores, MySQL utiliza ceros a la izquierda para representar nmeros menores que diez y utiliza un reloj de 24 horas. Estas diferencias en el manejo de las fechas pueden producir serios problemas para Visual Basic dado que VB esperar un formato mientras MySQL esperar otro. Por esta razn, se recomienda que NUNCA usen ninguna columna con tipo de dato fecha como parte de la clave primaria de una tabla. Por eso, utilizaremos una columna ID_Evento como clave primaria de nuestra tabla evento. Si bien esto no produce una relacin identificatoria, igual la tratamos como perteneciente a la aplicacin. Echemos un vistazo a nuestro diagrama ahora que tiene claves primarias: Debes haberte dado cuenta que cambi la columna Nombre de la tabla Grupo por Nombre_Grupo. El motivo por el cual hice esto es que las claves primarias generalmente se utilizan en las consultas a la base de datos que involucran mltiples tablas y es ms fcil escribir SELECT Nombre_Grupo FROM Grupo, Usuario; en vez de SELECT Grupo.Nombre FROM Grupo, Usuario, en serio, es mucho ms fcil as. Como vers, nuestras columnas de clave primaria se colocan en el cuadro central de nuestros iconos de

tabla y han sido resaltados en negrita. Con un diagrama de base de datos de Visio, todas las columnas que forman parte de la clave primaria se muestras en el cuadro central y tienen el identificador PK a su izquierda. El resaltado en negrita indica que este es un campo requerido y no puede dejarse en blanco (un campo que no tiene un valor asignado en realidad tiene asignado el valor NULL, lo que significa que no est definido o no tiene un valor). Eleccin de los Nombres de Campo y Campos Requeridos A continuacin, querremos abreviar los nombres de nuestros campos y designar los dems campos requeridos. Una aclaracin sobre los nombres de campo: aunque en MySQL se pueden utilizar nombres campo con espacios, te har las cosas ms difciles porque tendrs que encerrar el nombre entre comillas () cada vez que quieras usarlo. Por ejemplo, para acceder a la columna Fecha de Alta tendras que hacer la consulta de esta manera: SELECT `Fecha de Alta` FROM Grupo; personalmente, no me gusta utilizar comillas y siempre uso guiones en las columnas para representar espacios cuando asigno las claves primarias (ID_Usuario) y uso maysculas para distinguir los nombres de columnas comunes (FechaAlta). Cuando pongas nombres a los campos, debes mantener la legibilidad, querrs que los nombres de columnas sean lo suficientemente cortos como para tipearlos rpido cuando los uses repetidas veces, pero tambin querrs asegurarte de que los desarrolladores (incluso tu mismo) puedan entender su significado: Relaciones Uno-a-Muchos Ahora que hemos nombrado las columnas, definamos las relaciones entre las tablas. Primero miremos la relacin uno-a-muchos entre un Evento y un Usuario. Cuando manejamos una relacin uno-a-muchos, ubicamos la clave primaria de la tabla de muchos como un campo en la tabla de uno (debera comentar que columna, campo y propiedad son sinnimos). En este caso, ya tenemos una columna Usuario en la tabla Evento pero hagmoslo ms claro renombrndola para que concuerde con la definicin de la tabla Usuario, llamndola ID_Usuario. Tambin podemos usar la fecha de relacin para dibujar nuestra relacin (una vez ms, la punta de la flecha apunta a la tabla de muchos): Como puedes ver, se ha agregado un identificador FK1 a la columna de la izquierda, FK significa Foreign Key (Clave Fornea). Una clave fornea es simplemente una columna que se refiere a la clave primaria de otra tabla. El manejador InnoDB incluido en MySQL maneja lo que se conoce como integridad referencial. La integridad referencial es el requerimiento de que las claves forneas representen valores reales. Por ejemplo, si trataras de insertar una fila a la tabla Evento que tuviera el ID_Usuario 10, InnoDB verificara que existe un ID_Usuario 10 en la tabla Usuario y devolvera un error si tal fila padre no existiera. De manera contraria, no se permitira eliminar una fila de la tabla Usuario si existieran filas en la tabla Evento que se refieran a la fila en cuestin. El uso de InnoDB est ms all del alcance de un tutorial sobre el uso bsico de MySQL y no ser tratado con ms profundidad en este tutorial pero s ser el tema de algn artculo futuro. Puedes encontrar ms informacin sobre InnoDB en: http://www.mysql.com/doc/en/InnoDB.html.

Relaciones Muchos-a-Muchos Una vez establecidas las relaciones entre Evento y Usuario, podemos continuar con la definicin de la relacin entre Usuario y Grupo. Como recordarn, la relacin entre Usuario y Grupo es una relacin muchos-a-muchos. Esta clase de relacin no es tan simple de implementar como una relacin uno-a-muchos. En una relacin uno-a-muchos, podemos ubicar la clave primaria de la tabla de muchos en una columna de la tabla de uno, pero esto no encaja efectivamente en nuestra situacin de muchos-a-muchos: qu tabla contendr la clave primaria de la otra? La respuesta es que ninguna de las dos tablas contendr la clave primaria de la otra. Por el contrario, crearemos una tercera tabla para unir las dos. En este caso, la tabla Usuario_Grupo tiene dos claves forneas: Nombre_Grupo e ID_Usuario. Estas dos claves forneas forman una Clave Primaria Compuesta, asegurando que exista una sola entrada en la tabla para cada combinacin nica de Usuario/Grupo. Adems, se han agregado dos campos que indicarn si es usuario es coordinador o recepcionista del grupo, permitindonos eliminar los campos de ambas tablas que se referan a coordinadores y/o recepcionistas de cada grupo y permitiendo tambin que un nico usuario maneje varios grupos. Normalizando la Base de Datos La normalizacin de bases de datos se explica en detalle en otro artculo que escrib ubicado en http://www.vbmysql.com/articles/database-design/normalize.html y recomiendo que lo lean para ms informacin sobre normalizacin de bases de datos. En este tutorial comentar lo bsico dado que se aplica a nuestro diseo de ejemplo. La normalizacin es el proceso de eliminar datos redundantes de las tablas con el fin de mejorar la eficiencia del almacenamiento, la integridad de los datos y la escalabilidad. Esta mejora supone un aumento de complejidad y potenciales prdidas de performance debido a la unin de tablas normalizadas al realizar consultas. Primera Forma Normal El proceso de normalizacin apunta a lograr que nuestros datos se adapten a tres formas normales progresivas, y cada nivel superior de la normalizacin no se puede alcanzar hasta que se hayan alcanzado los niveles anteriores (en realidad existen cinco formas normales pero las ltimas dos son principalmente acadmicas y no se discutirn). La primera forma normal (o 1NF) tiene como objetivo eliminar los datos redundantes de las filas horizontales. Queremos asegurarnos de que no existen datos duplicados en una fila dada y que cada columna almacena la menor cantidad de informacin posible (haciendo que los campos sean atmicos). Tenemos dos violaciones a la Primera Forma Normal (1NF) en nuestro modelo de base de datos. El primero es que nuestra columna Nombre de la tabla Usuario guarda tanto los nombres como los apellidos de un usuario. Esto no representa la menor cantidad de datos posible. Adems, dificulta el ordenamiento de usuarios por apellido. Finalmente, nuestros usuarios no podrs personalizar sus listas para mostrar fcilmente los nombres ordenados

por nombre/apellido o apellido/nombre. Para resolver esto, simplemente dividimos nuestra columna Nombre en dos columnas: La segunda violacin a la 1NF es la redundancia horizontal de las columnas Estado (nota que aunque las columnas aparecen verticalmente en este diagrama, en realidad las columnas se agrupan horizontalmente cuando toman la forma de una tabla. Imagina la tabla como una hoja de un libro mayor, con encabezados de columnas en la parte superior de la pgina y filas individuales hacia abajo). No slo ser difcil hacer consultas sobre columnas horizontalmente redundantes (necesitaras una consulta como SELECT * FROM Usuario WHERE Estado1 = Mi Estado OR Estado2 = Mi Estado), sino que les has restringido a tus usuarios la posibilidad de tener solamente dos mensajes de estado personalizados. Si un cliente solicita algn da la capacidad de almacenar tres mensajes de estado, tendrs que agregar otra columna y rescribir la consulta de ejemplo que di anteriormente. Las columnas horizontalmente redundantes pueden solucionarse agregando otra tabla para guardar los mensajes de estado. Esto tambin nos brinda la oportunidad de agregar los mensajes de estado predefinidos al sistema: Nuestra nueva tabla de estados contendr todos los mensajes de estado que se hayan ingresado alguna vez, sea un mensaje personalizado o predefinido. Nuestra tabla de eventos se vincula entonces con la tabla Estado para indicar qu mensaje de Estado utiliza el evento. Si un mensaje es predefinido entonces el campo ID_Usuario no se completar. Si el mensaje es un mensaje personalizado, entonces debe completarse el campo ID_Usuario, asociando el mensaje de estado con su autor para su posterior recuperacin (recuerda que una de las caractersticas que figurar en la lista ser la recuperacin de mensajes de estado personalizados viejos para su reutilizacin). Antes de poder decir que nuestra base de datos est en primera forma normal, hay otro ajuste que podemos hacer. En vez de guardar un indicador para Coordinador y otro distinto para Recepcionista, podemos combinar las dos columnas en una columna de Nivel Administrativo. Como los dos puestos son mutuamente excluyentes no tiene mucho sentido guardar los dos campos por separado ya que ningn usuario ser Coordinador Y Recepcionista a la misma vez para un mismo grupo. Como un usuario podra no tener privilegios de administrador sobre el grupo, puse el campo como no requerido. De esta forma, el campo puede completarse con NULL para indicar que el usuario no tiene privilegios de administrador. Segunda Forma Normal As como la Primera Forma Normal elimina la redundancia de datos a lo largo de una fila horizontal, la Segunda Forma Normal (o 2NF) elimina la redundancia de datos de columnas verticales (en las que el mismo dato aparece en varias columnas). Las formas normales son progresivas, por lo tanto, para alcanzar la Segunda Forma Normal las tablas ya deben estar en Primera Forma Normal. En este caso, los ttulos asignados a los niveles administrativos (recepcionista, coordinador) podran aparecer potencialmente en muchas filas, ya que una gran empresa podra tener muchos recepcionistas. Solucionaremos la redundancia vertical del mismo modo que la redundancia horizontal, agregando tablas a nuestro esquema:

Nuestra nueva tabla nos permitir cambiar el ttulo de un nivel administrativo (por ejemplo, Coordinador por Supervisor) sin tener que hacer el cambio para cada usuario que es coordinador, como sera el caso si tuvieras la palabra coordinador en cada fila que le corresponda. Esto facilita el mantenimiento. Asimismo, puede pasarnos que eventualmente necesitamos agregar ms datos acerca del nivel administrativo. Con este enfoque podemos agregar fcilmente indicadores a la tabla que representen los distintos privilegios que posee el usuario, luego permitir que los administradores creen nuevos niveles administrativos segn lo crean conveniente, dando varios permisos segn corresponda. Tercera Forma Normal En la Tercera Formal Normal buscamos datos en la tabla que no sean totalmente dependientes de la clave primaria pero dependientes de otro valor de la tabla. Toma una direccin como ejemplo: tu Ciudad y Estado no dependen de ti sino del cdigo postal. Entonces, crearamos una tabla aparte con Cdigo Postal, Ciudad y Estado y slo almacenaramos el cdigo postal en la tabla Usuario. Si bien este enfoque puede facilitar el mantenimiento, tambin puede introducir complejidad al tratar de armar una direccin. Por tal motivo, los datos deberan pasarse a tercera forma normal cuando sea necesario para lograr un buen mantenimiento de la informacin. En nuestro caso, no existe ninguna informacin en el esquema que requiera mayor normalizacin para llevarlo a tercera forma normal. Eleccin de los Tipos de Columnas y Armado de Sentencias CREATE TABLE Una sentencia CREATE TABLE es una consulta especial que le pasamos a MySQL para indicarle que cree una nueva tabla para almacenar nuestros datos. La sintaxis de CREATE TABLE puede encontrarse en el manual de referencia de MySQL en http://www.mysql.com/doc/en/CREATE_TABLE.html. Aunque la sintaxis parezca complicada, en realidad es bastante simple. Para crear tablas en MySQL, necesitamos bsicamente un nombre de tabla, nombres para las columnas y el tipo de datos que soportar cada columna. Veamos la tabla Usuario primero. El primer componente de nuestra consulta CREATE TABLE es la sentencia CREATE TABLE propiamente dicha, que indica el nombre de nuestra tabla:
CREATE TABLE Usuario (

El parntesis inicial indica que las lneas que siguen a continuacin definen las columnas de nuestra tabla. Cuando definamos los campos necesitaremos alguna que otra informacin: primero necesitamos el nombre del campo, que tomaremos directo del diagrama anterior. Segundo, necesitamos los tipos de datos de cada campo. Es en este punto donde determinamos si el campo guardar informacin numrica o alfanumrica, informacin sobre fecha y hora u otros tipos de datos especiales. La lista completa de tipos de datos est disponible en el manual de referencia de MySQL en http://www.mysql.com/doc/en/Column_types.html, y les recomiendo que se remitan a la

tabla de conversin de tipos de datos entre http://www.vbmysql.com/articles/visual-basic_mysql/datatypes.html.

VB/MySQL

en

Al elegir tipos de datos es importante mantener un equilibrio entre el tamao de fila y el aprovechamiento. Cada campo ocupar una cierta cantidad de espacio en la fila y tendr cierta capacidad para guardar informacin. Tomemos como ejemplo del ID_Usuario; nuestro campo ID_Usuario tendr un valor entero y en teora necesitamos uno por cada empleado de nuestra organizacin. Nuestras alternativas de tipos de datos incluyen TINYINT, SMALLINT, MEDIUMINT, INT y BIGINT. Los nmeros mximos que se pueden almacenar con estos distintos tipos de datos son 127, 32767, 8388607, 2147483647 y 9223372036854775807 respectivamente. En este caso podemos tomar el tipo TINYINT cuya capacidad es 127 y considerarlo demasiado pequeo para nuestro propsito. SMALLINT, cuya capacidad es 32767, debera ser ms adecuado, incluso para las organizaciones ms grandes. La razn por la que elegimos el tipo de datos ms pequeo posible para nuestros datos reside en que los tipos de datos mayores generan filas ms largas y las filas ms largas requieren mayor tiempo de bsqueda al realizar consultas. Por lo tanto, siempre ser conveniente hacer las filas lo ms pequeas posibles. Al elegir el tipo de datos SMALLINT de 16 bits en vez de, por ejemplo, el tipo de datos INT de 32 bits, nos hemos ahorrado casi 2 gigabytes de almacenamiento en ms de un milln de filas. Como consecuencia, otra ventaja de elegir tipos de datos ms pequeos es la mejor eficiencia de almacenamiento. Siempre podrs redefinir una columna a un tipo de datos ms grande en el futuro, incluso cuando el servidor ya est en funcionamiento. El resto de nuestra descripcin de filas se destina a informacin extra acerca del campo. Ante todo, cuando manejamos tipos de datos numricos, tenemos la opcin de especificar si el campo aceptar nmeros negativos. El rango real de nmeros que se pueden almacenar en un campo SMALLINT es de -32768 a 32767. En nuestra aplicacin particular no tiene sentido tener un ID_Usuario negativo. Por tal motivo, sera mejor declarar el campo como UNSIGNED (sin signo). Esto no slo evita la insercin de nmeros negativos en nuestra tabla sino que adems aumenta el valor mximo que podemos almacenar en nuestro campo a 65535 (esto se debe a que en formato binario el bit ms a la izquierda de un nmero se reserva para representar el signo del nmero. MySQL utilizar el bit ms a la izquierda para aumentar el tamao mximo del nmero cuando se especifique UNSIGNED). NOT NULL, DEFAULT, AUTO_INCREMENT y PRIMARY KEY Otras opciones que podemos definir para este campo es si el campo permite valores NULL o no. Como recordars, los campos definidos como requeridos en nuestro diseo deben tener un valor cuando se crea o actualiza una fila y NULL es una palabra clave que indica que el campo no tiene un valor asignado. Por eso, cualquier campo que hayamos definido como requerido tendr que tener las palabras claves NOT NULL agregadas. NOT NULL evitar la insercin de NULLs y har obligatorio el campo. Relacionada con NOT NULL aparece la palabra clave DEFAULT. El hecho de que un campo se defina como NOT NULL no significa que tenemos que especificar un valor al

insertar registros. Cualquier campo NOT NULL que no se especifique al insertar una fila tendr el valor predefinido por la palabra clave DEFAULT. A los valores numricos se les asignarn automticamente un valor de cero, mientras que los strings tendrn por defecto una cadena vaca (). Puedes utilizar la palabra clave DEFAULT para modificar este comportamiento. Existen otras dos palabras claves finales que se utilizan comnmente al crear tablas pero que slo pueden definirse una sola vez. Estas son las palabras claves AUTO_INCREMENT y PRIMARY KEY. AUTO_INCREMENT indica que si no se especifica el campo al insertar filas, la base de datos generar automticamente un valor automtico incremental y lo guardar en el campo definido como AUTO_INCREMENT. Esto es muy til cuando se utilizan enteros para identificar las filas, ya que el programador no tiene que preocuparse por crear un nico nmero para cada fila que agrega. La palabra clave PRIMARY KEY se utiliza para definir un campo como clave primaria de la tabla. Veamos la definicin de nuestra primera columna:
CREATE TABLE Usuario ( ID_Usuario INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,

CHAR vs. VARCHAR Ahora que ya hemos definido nuestra clave primaria, echemos un vistazo a nuestra tabla Usuario. Nuestros nombres de columna sern manejados como strings a los cuales se permite que contengan valores alfanumricos. Los dos campos bsicos para contener strings son CHAR y VARCHAR, los cuales se definen en trminos de la cadena de texto mxima que pueden almacenar (definida en caracteres, entre 1 y 255). La diferencia entre CHAR y VARCHAR radica en la manera en que manejan el espacio sin usar. Suponte que consideramos que la cadena ms larga para un apellido es de 40 caracteres y un usuario tiene el apellido Winstead (8 caracteres). En un campo CHAR, el campo an seguira siendo de 40 bytes de tamao (1 carcter = 1 byte) y los ltimos 32 caracteres seran espacios en blanco utilizados para rellenar la cadena a los 40 caracteres completos (los espacios sobrantes sern eliminados cuando recuperes el valor). Esto significa que no importa qu tan larga sea la cadena en realidad, siempre ocupar los 40 caracteres de espacio completos dentro de la tabla. VARHAR, por el contrario, almacenar slo los 8 caracteres y ocupar solamente 8 bytes de espacio en la tabla. Tu primer impulso sera elegir VARCHAR y sacar provecho del menor espacio de almacenamiento requerido en la tabla con el objetivo de aumentar la velocidad en las bsquedas tal como yo lo describ anteriormente pero VARCHAR es la excepcin a la regla. Cuando usas VARCHAR en una tabla (al igual que ciertas columnas creadas para grandes cantidades de texto y valores binarios) el ancho de cada fila se hace inconsistente. Una fila podra tener 40 bytes de longitud mientras que otra slo 8. MySQL puede manejar esto almacenando la longitud de la fila en su sistema de archivos pero el servidor debe leer la longitud de cada fila antes de buscarla y continuar con la siguiente fila, donde deber verificar la longitud otra vez, ad nauseam. Al definir campos de texto como CHAR ocuparemos ms espacio en el disco rgido pero habr un aumento en la velocidad ya que el

servidor sabr que cada una de las filas tiene exactamente el mismo tamao (por ejemplo 120 bytes), permitindole que busque entre las filas sin verificar su longitud primero. Por tal motivo, recomiendo que definas tus campos de texto como CHAR para mejorar la performance de las consultas, a menos que el espacio de almacenamiento sea una consideracin importante (y con los precios de los discos de hoy en da esta no es una gran preocupacin, principalmente con nuestra aplicacin). Echemos un vistazo a los nombres de las columnas:
CREATE TABLE Usuario ( ID_Usuario INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, Apellido CHAR(40) NOT NULL, Nombre CHAR(40) NOT NULL,

Como vers, cada campo ser un campo CHAR que contendr hasta 40 caracteres. Los campos se definen como NOT NULL para hacerlos obligatorios, con el uso del valor estndar de cadena vaca dado que no hemos definido lo contrario. Almacenamiento de Nmeros Telefnicos No existe una manera de almacenar un nmero telefnico ya que el tipo de datos a utilizar puede depender de lo que planeas hacer con tus nmeros de telfono. Si quieres hacer bsquedas basadas en los cdigos de rea quizs te convenga almacenar las distintas partes de un nmero telefnico en forma separada, con un campo para el cdigo de rea, un campo para los primeros tres dgitos, un campo para los cuatro dgitos y quizs algn campo opcional para la extensin. Esto facilitar las bsquedas y el ordenamiento de los nmeros de telfono. En nuestro caso, slo estamos almacenando el nmero para tener una referencia de los compaeros de trabajo de un usuario as que slo lo guardaremos en una columna CHAR.
CREATE TABLE Usuario ( ID_Usuario INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, Apellido CHAR(40) NOT NULL, Nombre CHAR(40) NOT NULL, Telefono CHAR(10) NOT NULL,

Nuestros campos NombreUsuario y Contrasea tambin sern declarados como columnas CHAR:
CREATE TABLE Usuario ( ID_Usuario INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, Apellido CHAR(40) NOT NULL, Nombre CHAR(40) NOT NULL, Telefono CHAR(10) NOT NULL, NombreUsuario CHAR(16) NOT NULL, Contrasea CHAR(40) BINARY NOT NULL,

El manejo de ingresos de usuarios al sistema ser discutido en un artculo futuro. La palabra clave BINARY utilizada en el campo Contrasea indica que queremos que todas las comparaciones en el campo Contrasea sean sensibles a maysculas y minsculas (de forma que ConTRaseA y contrasea se traten como cadenas distintas al validar usuarios). Las cadenas en MySQL se tratan de forma sensible a maysculas y minsculas a menos que se utilice la palabra clave BINARY. Columnas ENUM Para nuestro campo Administrador utilizaremos una columna ENUM. A una columna ENUM puede asignrsele un solo valor, elegido de una lista de valores predefinido que declaramos al crear el campo. ENUM es muy prctico para representar conjuntos de valores que no aumentarn su tamao a medida que crece la base de datos (por eso utilizaremos una tabla separada como con la tabla NivelesAdmin). En este caso, queremos representar un escenario que slo puede tener dos valores: verdadero o falso (o eres administrador o no). Asignar un ENUM implica crear un conjunto de strings separadas por comas formando una lista de todos los valores posibles (puedes definir hasta 65535 valores potenciales distintos para una columna ENUM, pero si necesitas ms de cinco o seis quizs sea mejor crear una tabla para guardar los valores):
CREATE TABLE Usuario ( ID_Usuario INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, Apellido CHAR(40) NOT NULL, Nombre CHAR(40) NOT NULL, Telefono CHAR(10) NOT NULL, NombreUsuario CHAR(16) NOT NULL, Contrasea CHAR(40) BINARY NOT NULL, Administrator ENUM('VERDADERO', 'FALSO') NOT NULL,

Columnas de Fecha Las ltimas dos columnas de nuestra tabla son los campos Creado y Eliminado. El campo Eliminado. El campo Eliminado es una vez ms una columna verdadero/falso y ser tratada igual que el campo Administrador. El campo Creado representa la fecha en la que se cre el registro. MySQL proporciona cuatro columnas para manejar informacin de fecha, cada una de las cuales es bastante descriptiva: DATE (fecha), TIME (hora), DATETIME (fecha y hora) e YEAR (ao) (existe una quinta columna TIMESTAMP (marca de tiempo) que discutiremos ms adelante). A la hora de elegir un tipo de datos a utilizar, considera qu clase de informacin necesitas. En su mayora, los formatos ms comnmente utilizados son DATE y DATETIME ya que no tiene mucho sentido guardar slo la hora del da o el ao al almacenar informacin (recuerda que la mayora de las personas no buscan informacin de hora sin tener en cuenta el da). Para nuestros propsitos, es apropiada la columna DATE ya que no es esencial saber la hora del da en que se cre la fila:

CREATE TABLE Usuario ( ID_Usuario INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, Apellido CHAR(40) NOT NULL, Nombre CHAR(40) NOT NULL, Telefono CHAR(10) NOT NULL, NombreUsuario CHAR(16) NOT NULL, Contrasea CHAR(40) BINARY NOT NULL, Administrator ENUM('VERDADERO', 'FALSO') NOT NULL, Eliminado ENUM('VERDADERO', 'FALSO') NOT NULL, Creado DATETIME NOT NULL )TYPE = MyISAM;

El parntesis final indica el fin de las definiciones de columnas. La palabra clave TYPE es opcional porque el tipo de tabla por defecto es MyISAM, pero podemos usar la palabra clave posteriormente para indicar que queremos utilizar algn otro manejador de tablas de MySQL, tales como InnoDB, HEAP o BDB por nombrar slo algunos. Puedes encontrar ms informacin sobre los manejadores de tablas en http://www.mysql.com/doc/en/Table_types.html, pero para los propsitos de este artculo nos quedaremos con el manejador de tablas por defecto MyISAM. El carcter punto y coma (;) le dice al servidor MySQL que hemos finalizado nuestra consulta y que puede proceder a ejecutarla. La ejecucin de consultas ser explicada en un tutorial futuro, por ahora slo prepararemos las consultas para uso posterior. Te recomiendo que armes tus consultas en un editor de texto como el Bloc de Notas y las guardes con un nombre de archivo tipo sentencias_creacin_tablas.sql. La extensin .sql indicar que el archivo contiene consultas SQL. Campos TIMESTAMP Un tipo de datos especial disponible en muchas bases de datos es TIMESTAMP. Una columna timestamp (marca de tiempo) es muy parecida al campo DATETIME (fecha y hora) pero tiene ciertas propiedades especiales. Si una tabla tiene una columna timestamp entonces MySQL llenar al campo automticamente con la hora actual cuando se inserte una fila sin especificar un valor para la columna timestamp (o si la columna timestamp se especifica como NULL). La columna timestamp tambin ser actualizada a la hora actual cuando se actualice una fila con nueva informacin (otra vez, siempre y cuando la columna no se especifique o se establezca a NULL). Una propiedad til de las columnas timestamp es su comportamiento cuando tienes ms de una columna timestamp en una tabla. Cuando tienes varias columnas timestamp en una tabla, a todos los campos timestamp se les asignar la hora actual cuando se inserte una nueva fila, pero slo la columna timestamp ms a la izquierda ser actualizada en las actualizaciones subsiguientes de la tabla. Esto significa que puedes poner dos campos timestamp en la tabla, con el de la derecha almacenando la fecha de creacin de la tabla y el de la izquierda registrando la ltima actualizacin de la fila. Nosotros utilizaremos el tipo de datos TIMESTAMP para guardar la hora de creacin de los eventos en nuestra tabla Evento, utilizando el nombre MarcaTiempo o Timestamp en ingls. Generalmente, no se puede utilizar un tipo de datos como nombre de columna porque es una palabra reservada,

pero el uso de la palabra Timestamp como nombre de columna es una excepcin en MySQL:
CREATE TABLE Evento ( ID_Evento MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, ID_Usuario SMALLINT UNSIGNED NOT NULL, ID_Mensaje MEDIUMINT UNSIGNED NOT NULL, MarcaTiempo TIMESTAMP, Estado ENUM('Entrada','Salida') NOT NULL, Creador SMALLINT UNSIGNED )TYPE = MyISAM;

Un par de cosas a tener en cuenta es que se cambi el nombre de la columna Entrada/Salida por Estado para reflejar mejor su significado (ya que Entrada/Salida dice qu se puede almacenar en la columna pero no qu significa). Adems, la columna Creador se cambi de requerido a no requerido. La razn por la que hacemos esto es que un creador NULL puede significar que el usuario descrito por el evento es su creador, lo que podra ser de ayuda en un futuro para determinar cada cunto se crean eventos por parte de usuarios distintos al especificado por el evento. Es importante destacar que el diseo puede ser un proceso iterativo y que cambios como ste se hacen frecuentemente. Lo importante es acordarse de actualizar tu documentacin al hacer cambios: Claves Primarias Compuestas En la tabla Usuario_Grupo tenemos una clave primaria compuesta. No podemos definir ambas columnas con la palabra clave PRIMARY KEY sino que debemos utilizar una sintaxis diferente:
CREATE TABLE Usuario_Grupo ( Nombre_Grupo CHAR(20) NOT NULL, ID_Usuario SMALLINT UNSIGNED NOT NULL, ID_Nivel TINYINT UNSIGNED, PRIMARY KEY (ID_Usuario, Nombre_Grupo) )TYPE = MyISAM;

Cuando definimos claves primarias compuestas, definimos la clave primaria luego de terminar de definir las columnas. Definicin de las Tablas Restantes Las tablas restantes de nuestra aplicacin siguen los mismos principios que hemos descrito hasta ahora:
CREATE TABLE Estado ( ID_Mensaje MEDIUMINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, ID_Usuario SMALLINT UNSIGNED, Mensaje CHAR(255) NOT NULL,

Eliminado ENUM('Verdadero','Falso') )TYPE = MyISAM;

CREATE TABLE Grupo ( Nombre_Grupo CHAR(20) NOT NULL PRIMARY KEY, Creado DATETIME NOT NULL, Ambito ENUM(Publico,'Privado), Eliminado ENUM(Verdadero,'Falso) )TYPE = MyISAM; CREATE TABLE NivelesAdmin ( ID_Nivel TINYINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, Titulo CHAR(20) NOT NULL )TYPE = MyISAM; El conjunto entero de definiciones de las tablas se encuentra disponible en http://www.vbmysql.com/download/vb-mysql-tutorial.sql. Fjate que en ingls una vez ms ha surgido el problema de las palabras reservadas ya que la tabla Group (Grupo) utilizaba una palabra reservada. Es posible usar una palabra reservada como nombre de columna o tabla encerrndola entre comillas simples (`Group`) cada vez que quieras usarla pero yo prefiero evitar el problema. En cambio, se renombrara la tabla por Groups (Grupos) (en general debe evitarse el uso de palabras plurales en los nombres de tabla). Debe observarse que al igual que usar el mismo nombre para una clave fornea y la clave primaria (usa ID_Usuario en todas las tablas en las que se haga referencia), tambin deberas asegurarte de usar el mismo tipo de datos. Por lo tanto, asegrate de que todos los campos ID_Usuario son SMALLINT UNSIGNED y que todos los campos Nombre_Grupo son CHAR(20). Asegrate de que todas las columnas CHAR y VARCHAR tengan el mismo ancho (en este caso 20 caracteres) ya que no querrs que una tabla pueda almacenar un nombre de grupo ms largo que otra. Conclusin Hemos creado una lista de funciones y requerimientos para nuestra aplicacin que no slo nos ayudar a determinar cundo estar completo nuestro proyecto sin que tambin nos ayudar a definir las entidades de nuestra aplicacin. Utilizaremos nuestro diseo de entidades para definir los objetos de nuestra aplicacin y tambin para disear las tablas de nuestra base de datos. Una ven que nuestras tablas han sido definidas y diseadas, podemos utilizar sentencias CREATE TABLE para crear las tablas en nuestro servidor MySQL. En mi prximo artculo explicar la instalacin del servidor MySQL bajo Windows y luego comentar lo bsico para crear una base de datos y las tablas que la componen.

Segunda Parte

1. Introduccin 2. Eleccin de una Versin de MySQL 3. Descarga e Instalacin de MySQL o El Asistente de Instalacin de MySQL o El Asistente de Configuracin de MySQL 4. Descarga e Instalacin de MySQL Query Browser o Instalacin de MySQL Query Browser 5. Creacin de la Base de Datos o Inicio de MySQL Query Browser o Creacin de una Base de Datos o Creacin de las Tablas 6. Creacin de un Usuario 7. Conclusin

Introduccin
En mi ltimo artculo, escrib cmo disear una base de datos de MySQL con el objetivo de almacenar datos para una aplicacin que se creara en Visual Basic.NET (VB.NET). Las definiciones de tablas completas pueden encontrarse en http://www.vbmysql.com/download/vb-mysql-tutorial.sql. En este tutorial voy a mostrarte como instalar MySQL en Windows, instalar MySQL Query Browser y cmo cargar las definiciones de tablas en MySQL utilizando la funcin Script Editor de MySQL Query Browser. Este tutorial dar por sentado que ests utilizando Microsoft Windows como sistema operativo principal tanto para el servidor MySQL como para MySQL Query Browser, y que tu copia de Windows es una versin reciente basada en Windows NT como Windows 2000 o Windows XP. Este tutorial tambin asumir que no tienes ninguna versin previa de MySQL instalada. Al finalizar este tutorial, deberas tener una instalacin funcional de MySQL que contenga tu base de datos y algunos datos de ejemplo, lo que te permitir comenzar a programar en VB.NET en el prximo tutorial. Al final de este tutorial encontrars un hipervnculo a un script MySQL que contiene todas las sentencias SQL utilizadas. El script puede utilizarse para generar un clon exacto de la base de datos que haremos en este artculo.

Eleccin de una Versin de MySQL


Actualmente existen tres versiones de MySQL disponibles para ser descargadas desde dev.mysql.com: MySQL 4.0, MySQL 4.1 y MySQL 5.0. Al momento de escribir este artculo, tanto MySQL 4.0 como 4.1 se encuentran catalogadas como de Disponibilidad General o productos finales. Esto significa que estas versiones han pasado por extensos procesos beta y se les han corregido todos los errores conocidos, sin nuevos informes de errores en un perodo determinado. Puedes encontrar las caractersticas incluidas en las

tantas versiones de MySQL en http://dev.mysql.com/doc/mysql/en/Roadmap.html. Generalmente se aconseja utilizar la ltima versin de MySQL que haya sido anunciada como producto final, en nuestro caso es la versin 4.1. Aunque MySQL 5 ofrezca un mayor conjunto de funciones comparada con MySQL 4.1, el hecho de que no haya sido lanzada como DG significa que ser difcil determinar si un error dado es causado por nuestro cdigo o un error en la versin alfa de MySQL.

Descarga e Instalacin de MySQL


MySQL 4.1 puede descargarse de http://dev.mysql.com/downloads/mysql/4.1.html. Existen tres versiones de la descarga para Windows: Windows Essentials, Windows, y Without installer (Sin instalador). En nuestro caso el paquete Windows Essentials ser el ms apropiado. Descarga el instalador a tu disco rgido y cuando finalice la descarga, haz doble clic en el archivo de instalacin para iniciar la instalacin (el archivo de instalacin se llamar algo as como mysql-4.1.7-essential-win.msi). El Asistente de Instalacin de MySQL Una vez que hayas hecho doble clic en el archivo de instalacin, se mostrar el Asistente de Instalacin. Habr tres tipos de instalacin distintos disponibles: Typical (Tpica), Complete (Completa), y Custom (Personalizada). En nuestro caso, la instalacin Tpica se ajustar a nuestros objetivos. Elige la opcin de instalacin Typical y haz clic en el botn Next (Siguiente). En la pantalla de confirmacin, haz clic en el botn Install (Instalar) para comenzar la instalacin. MySQL se instalar en la carpeta C:\Program Files\MySQL\MySQL Server 4.1 (o su equivalente C:\Archivos de Programa\MySQL\MySQL Server 4.1) y se te preguntar si quieres registrarte en el sitio de MySQL. La registracin es opcional pero resulta til si quieres utilizar los foros de forums.mysql.com o informar errores a bugs.mysql.com. La pantalla final del Asistente de Instalacin de MySQL te invita a inicial el Asistente de Configuracin de MySQL. Para ms informacin acerca de la utilizacin del Asistente de Instalacin de MySQL, dirgete a http://dev.mysql.com/doc/mysql/en/Windows_install_wizard.html. El Asistente de Configuracin de MySQL El Asistente de Configuracin de MySQL crear un archivo de configuracin my.ini por ti e instalar MySQL como servicio en tu sistema. La documentacin completa del Asistente de Configuracin de MySQL est disponible en http://dev.mysql.com/doc/mysql/en/Windows_config_wizard.html y es una buena referencia para configuraciones avanzadas. En este artculo explicar lo bsico para utilizar el Asistente de Configuracin de MySQL para el uso de un desarrollador de oficina.

La primera pantalla de dilogo del Asistente de Configuracin de MySQL te pedir que elijas entre Standard Configuration (Configuracin Estndar) y Detailed Configuration (Configuracin Detallada). La Configuracin Estndar es ideal para un desarrollador de oficina que ser el nico usuario que se conecte a MySQL, donde MySQL tendr que compartir recursos con el resto de tus aplicaciones de escritorio. Elige Standard Configuration y haz clic en el botn Next (Siguiente). La siguiente pantalla de dilogo visualizada te permite configurar un servicio de Windows para MySQL. Configurar MySQL como un servicio de Windows har que MySQL se inicie cuando se prenda la computadora y se recomienda para evitar el lo de tener que iniciar MySQL manualmente cada vez que necesites usarlo. Yo cambio generalmente el nombre del servicio por a la opcin MySQL41 para que encaje bien con otras copias de MySQL que tengo en mi escritorio, pero si vas a tener una nica instalacin de MySQL (que es lo ms probable), pueden utilizar el nombre de servicio por defecto de MySQL. Presiona Next (Siguiente) para avanzar al siguiente dilogo. Luego de configurar el servicio MySQL, necesitars establecer la contrasea del usuario root (el usuario raz) de tu servidor. Cada vez que tengas un producto servidor MySQL debes establecer la contrasea del usuario root para lograr seguridad. Si no estableces una contrasea para el usuario root, cualquiera que tenga acceso a tu servidor MySQL podr causar todo tipo de daos a tus base de datos. Si eres el nico usuario y el puerto al servidor est bloqueado por un firewall puedes optar por no establecer una contrasea del usuario root para simplificar el ingreso a MySQL, pero yo no lo recomiendo. Lo que s recomiendo es establecer una contrasea para el usuario root y tildar la opcin Root may only connect from localhost (Usuario root slo puede conectarse desde localhost) si ests instalando MySQL en tu escritorio. No marques la opcin Create An Anonymous Account (Crear una Cuenta Annima). Presiona el botn Next (Siguiente) para avanzar al dilogo de confirmacin. En la pantalla de confirmacin, presiona el botn Execute (Ejecutar) para iniciar el proceso de configuracin. El Asistente de Configuracin de MySQL crear un archivo de configuracin, iniciar el servidor MySQL y establecer la contrasea del usuario root que hayas especificado. Una vez que finalice el proceso de configuracin, presiona el botn Finish (Finalizar) para cerrar el asistente.

Descarga e Instalacin de MySQL Query Browser


MySQL Query Browser es una herramienta GUI de segunda generacin de MySQL AB. MySQL Query Browser es una gran herramienta que te permite crear y editar tablas y luego explorar los contenidos de la tabla, haciendo cambios en el acto. MySQL Query Browser es actualmente una versin beta pero ya se ha convertido en una herramienta muy til. La documentacin de MySQL Query Browser se encuentra en http://dev.mysql.com/doc/query-browser/en/index.html. Instalacin de MySQL Query Browser

MySQL Query Browser puede descargarse de http://dev.mysql.com/downloads/querybrowser/index.html. Evita elegir la versin Without Installer (Sin Instalador). Guarda el archivo de instalacin en tu disco rgido. El archivo de instalacin debera tener un nombre parecido a mysql-query-browser-1.1.1-gamma-win.msi. Una vez que hayas descargado el archivo de instalacin, haz doble clic para instalar MySQL Query Browser. El instalador es un asistente de instalacin estndar que no requiere ninguna explicacin. MySQL Query Browser se instalar en C:\Program Files\MySQL\MySQL Query Browser 1.0 (o su equivalente C:\Archivos de Programa\MySQL\MySQL Query Browser 1.0) a menos que hayas especificado una ruta distinta.

Creacin de la Base de Datos


Ahora que ya hemos instalado el servidor de base de datos MySQL y MySQL Query Browser, podemos comenzar con el proceso de creacin de nuestra base de datos. Para decirlo bien simple, una base de datos es una coleccin de datos almacenados en tablas compuestas por columnas y filas. Una base de datos funciona como un recipiente para las tablas que creamos en el primer tutorial. Inicio de MySQL Query Browser Una vez instalado MySQL Query Browser puedes empezar haciendo clic en Inicio > Programas > MySQL > MySQL Query Browser. Luego aparecer la pantalla de dilogo de conexin: Completa los campos con la informacin apropiada para tu instalacin de MySQL. Si instalaste el servidor MySQL y MySQL Query Browser en la misma mquina, utiliza 127.0.0.1 como hostname (nombre de host). El campo Schema (Esquema) corresponde a la base de datos por defecto que ser utilizada para resolver las consultas. Como todava no hemos creado una base de datos para nuestra aplicacin, se incluye la base de datos test que se instala por defecto en todas las bases de datos MySQL. Haz clic en el botn OK (Aceptar) para iniciar MySQL Query Browser. Creacin de una Base de Datos Una vez que MySQL Query Browser se haya iniciado correctamente, deberas ver una ventana como la siguiente: En el lado derecho puedes ver el navegador de la base de datos (Schemata). Este proporciona una lista de las bases de datos que residen actualmente en el servidor MySQL. La base de datos mysql controla toda la informacin de ingreso al servidor y los permisos que tienen los usuarios al acceder a MySQL. La base de datos test se presenta como un lugar para probar consultas y sentencias de creacin de tablas que est disponible para todos los usuarios. La base de datos test est marcada en negrita para indicar que es

actualmente la base de datos por defecto; cualquier consulta que se ingrese ser ejecutada por defecto en la base de datos test. Para crear la base de datos, haz clic con el botn derecho dentro de la lista de bases de datos y elige la opcin Create New Schema (Crear Nuevo Esquema). Se te pedir un nombre para tu base de datos. En esta instancia, nuestra aplicacin no tiene un nombre entonces tendremos que elegir alguno bastante descriptivo. Como nuestra aplicacin registrar esencialmente quin ha entrado y salido de la oficina, voy a llamar a la base de datos entrada_salida. El nombre no tiene letras en mayscula para evitar los problemas de diferencias entre maysculas y minsculas que puedan existir entre las versiones de MySQL de Windows y Linux (notars que he actualizado el script SQL del ltimo tutorial para adaptarlo a esta convencin de nombres). Puedes separar las palabras con un guin, guin bajo o simplemente con nada. Evita el uso de espacios en el nombre de tu base de datos y recuerda que queremos evitar el uso de palabras reservadas. En mi caso, separar las palabras con un guin bajo. Una vez creada la base de datos, haz clic con el botn derecho y elige la opcin Make Default Schema (Establecer Esquema por Defecto). La tabla entrada-salida es ahora la base de datos por defecto y nuestras prximas sentencias de creacin de tablas se aplicarn a esta base de datos. Creacin de las Tablas Cuando ya hayamos creado la base de datos y establecido por defecto, podemos cargar el script SQL con nuestras sentencias de creacin de tablas. Descarga el script de http://www.vbmysql.com/download/vb-mysql-tutorial.sql en tu disco rgido. Elige la opcin Open Script (Abrir Script ) del men File (Archivo) de MySQL Query Browser. Cuando se haya cargado el script, haz clic en el botn Execute (Ejecutar) para crear las tablas. Cuando termine la ejecucin (debera ser instantnea), puedes hacer clic en la flechita negra a la izquierda del nombre de la base de datos para ver las tablas. Presiona las flechitas negras al lado de los nombres de las tablas para ver la lista de columnas de la tabla: Suponiendo que no tuviste errores, tu base de datos debera haberse creado.

Creacin de un Usuario
Ahora que nuestras tablas estn en su lugar, tendremos que crear un usuario. Para crear una fila en una tabla con MySQL Query Browser, primero debes hacer doble clic en la tabla (en nuestro caso la tabla usuario). Esto crear una consulta SELECT * FROM usuario en el rea de consultas superior. Presiona el botn Execute (Ejecutar) para ejecutar la consulta y as crear una nueva solapa de resultados con un conjunto de filas vacas:

Presiona el botn Edit (Editar) de la parte inferior de la ventana para habilitar la edicin, luego haz doble clic en el campo apellido para iniciar la edicin. Puedes utilizar la tecla Tab para desplazarte al siguiente campo de la fila a medida que ingresas los datos. En mi caso, ingres lo siguiente: apellido: Hillyer nombre: Mike telefono: 4033806535 SIN GUIONES nombreusuario: mike contrasea: 12345 administrador: VERDADERO eliminado: FALSO creado: 2004-11-27 11:41:00 Lo ms importante es recordar qu es lo que espera la tabla en trminos de formato de los datos. Tu nombre y apellido no pueden superar los 40 caracteres. Tu nmero de telfono no puede ser mayor a 10 caracteres. Tu nombre de usuario no puede exceder los 16 caracteres y tu contrasea no puede tener ms de 20 caracteres. Los valores para los campos administrador y eliminado deben ser VERDADERO o FALSO y el campo creado debe tener el formato YYYY-MM-DD HH:MM:SS. Cuando hayas ingresado tus datos, presiona el botn Apply Changes (Aplicar Cambios) para crear la nueva fila. Tambin puedes hacer clic en el botn Edit (Editar) para desactivar la edicin.

Conclusin
Suponiendo que no has tenido errores, ya deberas tener una copia funcional de MySQL instalada, junto con MySQL Query Browser. Deberas haber podido crear la base de datos entrada_salida y llenarla con las tablas que habamos diseado en el tutorial anterior. Una vez que se crearon las tablas, deberas haber podido crear una nueva fila en la tabla usuario. Claro que tambin puedes hacer trampa y descargarte el script desde http://www.vbmysql.com/download/vb-mysql-tutorial-2.sql y ejecutarlo para crear una base de datos idntica a la que yo he creado. En mi prximo tutorial te ensear a descargar e instalar Visual Basic.NET Express Edition y el controlador de base de datos MySQL Connector/NET. Te mostrar cmo combinarlos para crear un sistema de acceso que permitir que los usuarios se autentiquen en tu base de datos MySQL.

Tercera Parte

1. Introduccin 2. Diseo de un Sistema de Acceso 3. Utilizar MySQL Administrator o Descarga e Instalacin MySQL Administrator o Conexin a MySQL Server o Agregar Un Usuario 4. Connector/NET o Descarga e Instalacin de Connector/NET 5. Visual Basic.NET o Descarga e Instalacin de Visual Basic.NET 2005 Express Edition o Inicio de Visual Basic.NET o La Ventana Principal de VB.NET o Asignar un Nombre al Formulario por Defecto o Agregar Referencias o Guardar el Proyecto 6. Diseo del Formulario de Acceso 7. Creacin de un Evento 8. Inicio de la Aplicacin 9. Importacin del Sistema de Nombres de Connector/NET 10. Agregar un Objeto MySqlConnection 11. Instanciacin del Objeto MySqlConnection 12. Armado del String de Conexin 13. Apertura de la Conexin 14. Utilizacin de un MessageBox 15. Cierre de la Conexin 16. Eliminacin del Objeto MySqlConnection 17. Captura de Errores 18. Prueba del Proyecto 19. Mejoras 20. Conclusin

Introduccin
Este artculo es la tercera parte de una serie de artculos realizados para documentar la creacin de aplicaciones de Windows utilizando Visual Basic.NET y MySQL. En los artculos anteriores, he descrito cmo disear una aplicacin y base de datos, instalar MySQL y MySQL Query Browser y cmo completar nuestra tabla utilizando la funcin Script Editor de MySQL Query Browser.

En este artculo, describir cmo instalar Microsoft Visual Basic 2005 Express Edition, MySQL Administrator y MySQL Connector/NET. Utilizaremos estas herramientas para crear un formulario de acceso al sistema para nuestra aplicacin de registro.

Diseo de un Sistema de Acceso


Existen varias opciones posibles al trabajar en un sistema de accesos pero generalmente se opta por una de dos opciones: 1. Crear tu propio sistema de acceso. Almacena nombres de usuarios y contraseas en una tabla de MySQL y utiliza una nica cuenta de usuario para todas las instancias de la aplicacin que se conecte a MySQL. Cada instancia de la aplicacin se conectar a una cuenta de servidor y luego validar el usuario utilizando las tablas que se han creado. 2. Utilizar las tablas de seguridad propias de MySQL. Crea usuarios MySQL para cada cuenta y deja que MySQL se encargue de la administracin de la autenticacin y los privilegios. Ambos enfoques tienen sus respectivas ventajas y desventajas. Cuando construyes un sistema de acceso, potencialmente tienen mayor control sobre los usuarios, grupos y privilegios. Tienes un manejo ms simple de los permisos porque se necesita un nico MySQL nativo. Por otra parte, existe una mayor probabilidad de que existan problemas de seguridad porque lo que crees no pasar por un proceso de revisin como el que tiene el servidor MySQL. Adems, tienes un punto dbil en cuanto a la seguridad ya que cada instalacin del cliente tiene una copia de la cuenta central de usuario para conectarse a MySQL y esa cuenta debe tener la mayor cantidad de permisos posible para un usuario administrativo. Estas consideraciones no son tan importantes al desarrollar una aplicacin web porque es ms fcil manejar una instancia web que una coleccin de aplicaciones de escritorio. Cuando uses las opciones de seguridad propias de MySQL, obtienes un sistema de administracin de privilegios robusto que ha sido minuciosamente revisado y probado. Puedes restringir los privilegios con gran detalle e incluso asignar distintos permisos basados en el host desde el cual se conecta un usuario. La desventaja tiene que ver con la complejidad: sacarle el mayor provecho a la autenticacin propia de MySQL es ms difcil que hacer una por tu cuenta y debers agregar un usuario al servidor MySQL cada vez que quieras agragar un nuevo usuario a tu aplicacin. Como esta no es una aplicacin basada en web, crearemos nuestra aplicacin utilizando el sistema de privilegios propio de MySQL. Para poder crear un usuario nativo en MySQL tendremos que instalar primero MySQL Administrator, una aplicacin GUI para la administracin de servidores.

Utilizar MySQL Administrator


MySQL Administrator es una herramienta GUI lanzada por MySQL AB para administrar tu servidor MySQL. MySQL Administrator puede utilizarse para administrar usuarios, cambiar la configuracin del servidor, manipular las bases de datos del servidor y monitorear el estado del servidor. Descarga e Instalacin de MySQL Administrator MySQL Administrator puede descargarse desde http://dev.mysql.com/downloads/administrator/1.0.html. En nuestro caso, necesitamos la versin de Windows que incluye el instalador, evita tomar la versin Without Installer (Sin Instalador). Guarda el instalador en tu disco y haz doble clic en el icono del instalador para comenzar la instalacin. El instalador es un instalador estndar de Windows y no debera requerir ninguna accin especial. Conexin a MySQL Server Luego de que finalice la instalacin, debera aparecer un icono de MySQL Administrator en tu escritorio. Haz doble clic en el icono de MySQL Administrator para ver el formulario de acceso. Tambin puedes iniciar MySQL Administrator haciendo clic en Inicio > Programas > MySQL > MySQL Administrator. El formulario de acceso de MySQL Administrator es casi idntico al formulario de acceso a MySQL Query Browser, con la diferencia de que MySQL Administrator no requiere que se le especifique un esquema por defecto. Ingresa tu informacin de acceso como usuario root y presiona el botn OK (Aceptar) para abrir MySQL Administrator. Agregar Un Usuario Haz clic en la opcin User Administration (Administracin de Usuarios) del panel de menes de la izquierda para ver la pantalla de administracin de usuarios. Presiona el botn New User (Nuevo Usuario) para crear una cuenta como nuevo usuario. En la opcin MySQL User (Usuario de MySQL) utiliza el valor de username (nombre de usuario) que estableciste en tu fila de usuario en el tutorial anterior. Agrega una contrasea y establece cualquier Informacin Adicional que quieras especificar (toda la informacin de la seccin Additional Information es opcional). Cuando ya hayas puesto un nombre de usuario y contrasea, presiona la solapa Schema Privileges (Privilegios del Esquema). Haz clic sobre la base de datos entrada_salida y luego sobre el botn para asignarle a tu usuario todos los privilegios disponibles para la base de datos (refinaremos la lista de privilegios en el futuro). Presiona el botn Apply Changes (Aplicar Cambios) para crear el nuevo usuario. Ahora puedes cerrar MySQL Administrator.

Connector/NET
A principios de 2004 MySQL AB contrat a Reggie Burnett de ByteFX y adquiri su proveedor de datos ByteFX .NET para MySQL. El proveedor se renombr por Connector/NET y no slo se provee gratis bajo los trminos de la GNU Public License, sino que es uno de las ms completos y mejores proveedores de .NET para MySQL disponibles en la actualidad. Connector/NET fue escrito en C# y es un cdigo completamente manipulable, permitiendo su portabilidad a cualquier plataforma que soporte .NET, incluso Mono. Una ventaja que ofrece Connector/NET por sobre otras soluciones es su uso del protocolo MySQL nativo: muchas otras soluciones envuelven la librera de cliente C de MySQL y sufren una prdida de performance como consecuencia. Descarga e Instalacin de Connector/NET MySQL Connector/NET puede ser descargado desde http://dev.mysql.com/downloads/connector/net/. Descarga la versin que incluye el instalador a tu disco rgido local y descomprime el archivo Zip. Haz doble clic sobre el archivo de instalacin para comenzar el proceso de instalacin. Realiza una instalacin completa en el directorio por defecto.

Visual Basic.NET
Visual Basic.NET es la nueva versin de Visual Basic. Si bien comparte el nombre Visual Basic, existen diferencias significativas entre Visual Basic 6 y Visual Basic.NET. VB.NET ya est entrando en su tercera versin. La primera versin fue Visual Basic.NET, la segunda fue Visual Basic.NET 2003 y la nueva versin es Visual Basic.NET 2005. Visual Basic.NET 2005 est actualmente en su fase de prueba beta y adems esta versin presenta una nueva versin Express que utilizaremos en este tutorial. La versin Express de Visual Basic.NET es bsicamente una versin pelada que conserva toda las funciones necesarias para producir aplicaciones bsicas (no quise lograr ningn juego de palabras). Descarga e Instalacin de Visual Basic.NET 2005 Express Edition VB.NET 2005 Express Edition puede descargarse desde http://lab.msdn.microsoft.com/express/vbasic/default.aspx. Busca algn hipervnculo de descarga para la Community Technical Preview (Adelanto para la Comunidad Tcnica) o algn hipervnculo tipo Download Now (Descargue Ahora). Cuando hayas descargado el instalador, hazle doble clic para comenzar el proceso de instalacin. Las opciones de la instalacin por defecto deberan ser suficientes. Inicio de Visual Basic.NET

Cuando ya hayas instalado VB.NET 2005, busca un acceso dentro de la seccin Programas de tu men Inicio que diga Visual Basic 2005 Express Edition Beta. Inicia VB.NET y presiona Ctrl + N para crear un nuevo proyecto. Ingresa un nombre para el proyecto y elige la plantilla Windows Application (Aplicacin para Windows). Presiona el botn OK (Aceptar) para crear el proyecto. La Ventana Principal de VB.NET Window Cuando se cree tu proyecto, deberas ver una ventana parecida a esta: A la izquierda se encuentra la barra de herramientas. Puedes arrastrar elementos de la barra de herramientas para agregarlos a tu aplicacin. En el centro tenemos el espacio de trabajo, el cual nos muestra el primer formulario en la vista Diseo. A la derecha est el Solution Explorer (Explorador de Soluciones), que muestra todos los archivos involucrados en nuestro proyecto. Asignar un Nombre al Formulario por Defecto Primero haz clic en el objeto Form1.vb del Solution Explorer y elige la opcin Properties (Propiedades). Esto te mostrar una ventana de dilogo de propiedades donde podremos renombrar el archivo. La herramienta Propiedades se utiliza para establecer varias propiedades de los objetos que manejaremos a medida que trabajemos en nuestro proyecto. En este caso, queremos cambiar la propiedad File Name (Nombre de Archivo) para reflejar ms apropiadamente el propsito del formulario. Agregar el prefijo frm a los nombres de los formularios. No cambies la extensin del archivo del formulario. Cuando hayas cambiado el nombre del archivo, haz clic en el formulario dentro del espacio de trabajo. La herramienta Propiedades cambiar para reflejar las propiedades del formulario. Desplzate hacia abajo hasta que encuentres la propiedad Text (Texto) y ponle algo apropiado. En mi caso, le puse Entrada-Salida Acceso. La propiedad Text determina lo que aparece como ttulo del formulario y puedes ver esto reflejado en el espacio de trabajo. Agregar Referencias Antes de comenzar a utilizar Connector/NET con Visual Basic, necesitamos agregar una referencia a nuestro proyecto. Al agregar una referencia, le estamos diciendo a VB.NET dnde debe buscar MySQL Connector/NET para poder acceder a los objetos y mtodos de Connector/NET. Para agregar una referencia, elige la opcin Add Reference (Agregar Referencia) del men Project (Proyecto). Elige la solapa Browse (Examinar) y localiza la instalacin de Connector/NET, generalmente ubicada en C:\Program Files\MySQL\MySQL Connector

Net 1.0.2\bin\.NET 1.1 (o su equivalente C:\Archivos de Programa\MySQL\MySQL Connector Net 1.0.2\bin\.NET 1.1) (La ruta puede variar dependiendo del nmero de versin de Connector/NET). Elige el archivo MySql.Data.dll y connector/NET se agregar a tu proyecto. Guardar el Proyecto Ahora que ya hemos configurado algunas opciones de nuestro proyecto, deberamos guardar el proyecto antes de continuar. Elige la opcin Save All (Guardar Todo) del men File (Archivo). Como esta es la primera vez que guardamos el proyecto, aparece la siguiente pantalla de dilogo: Estas opciones deberan aceptarse generalmente, guardando el proyecto en una nueva carpeta dentro de la carpeta Mis Documentos/Visual Studio/Projects (en mi caso utilizo una ruta personalizada a Mis Documentos). Presiona el botn Save (Guardar) para guardar tu proyecto.

Diseo del Formulario de Acceso


Para disear el formulario de acceso, arrastra los objetos desde la barra de herramientas hasta el formulario. En nuestra primera versin necesitaremos pedirles a los usuarios un nombre de servidor, nombre de usuario y contrasea. Haz clic en el objeto TextBox de la barra de herramientas y arrstralo hasta el formulario. Una vez que se ubique dentro del formulario, lo puedes estirar, mover y generalmente mejorar su tamao y posicin. Cuando ests contento con la ubicacin del cuadro de texto, ve a la herramienta Propiedades y busca la propiedad Name (Nombre). Cambia el nombre para reflejar mejor el uso del cuadro de texto (en mi caso le puse txtServidor). Agrega dos cuadros de texto adicionales y llmalos txtUsuario y txtContrasea. Aunque nos parezca obvio cul es el propsito de cada cuadro de texto, el usuario final probablemente necesite algo de ayuda. Utilizaremos objetos Label (Etiquetas) como indicios para el usuario que le indicarn para qu se utiliza cada cuado de texto. Arrastra el objeto etiqueta hasta el formulario y ubcala en la misma lnea que el primer cuadro de texto. Una vez que est ubicada, busca la propiedad Text (Texto) en la herramienta Propiedades y ponle algo como Servidor:. Repite este proceso dos veces ms para los objetos TextBox restantes. Como no utilizaremos las etiquetas en el cdigo verdadero de la apliacin, no hay necesidad de cambiar los nombres por defecto de las etiquetas. El elemento final que debe agregarse a nuestro formulario ser un par de botones; uno para iniciar el proceso de acceso y el otro para cancelar. Arrastra los botones al formulario y establece la propiedad Name (Nombre) a cmdIngresar y cmdCancelar. Cambia la propiedad Text (Texto) a Ingresar y Cancelar, respectivamente. Cuando hayas terminado este proceso, tu formulario debera verse as:

Creacin de un Evento

Voy a empezar creando un evento para el botn Cancelar. Un evento es algo que dispara la ejecucin de cdigo dentro de VB.NET. En este caso, el evento en cuestin ser el haber presionado el botn Cancelar. La forma ms simple de crear un evento de clic de botn es hacer doble clic en el botn del formulario. Cuando haces doble clic en el botn cancelar, se mostrar la vista Cdigo del formulario y podrs ver el siguiente cdigo:
Public Class frmAcceso Private Sub cmdCancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCancelar.Click End Sub End Class

La lnea Public Class indica que esta clase describe nuestro formulario y la lnea Private Sub muestra que esta es una subfuncin que maneja el evento Click del objeto cmdCancelar. Las dos lneas End muestran dnde termina el cdigo de cada una de estas secciones. Agregaremos una nica lnea a la subfuncin para cerrar la aplicacin cuando se haga clic en el botn:
Application.Exit()

Esta lnea le indica a la aplicacin que debe cerrarse y ser ejecutada cuando hagamos clic en el botn Cancelar. Ahora, tu cdigo debera verse as:
Public Class frmAcceso Private Sub cmdCancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCancelar.Click Application.Exit() End Sub End Class

Inicio de la Apliacin
Una vez que hayas ingresado el cdigo, guarda el proyecto y presiona la tecla F5 para probar la aplicacin. Tambin puedes elegir la opcin Start (Iniciar) desde el men Debug (Depuracin) hacer clic en el icono verde de la barra de herramientas. Tu formulario debera mostrarse y si haces clic en el botn Cancelar, el formulario debera desaparecer para cerrar la aplicacin. Si presionas el botn Ingresar, no suceder nada ya que no hemos creado ningn cdigo para el evento de presionar el botn Ingresar.

Importacin del Sistema de Nombres de Connector/NET


Los objetos de VB.NET se organizan en sistemas de nombres. Los sistemas de nombres son agrupaciones lgicas de objetos que se utilizan para facilitar la organizacin los distintos objetos disponibles en VB.NET.

Para utilizar un objeto Connection necesitas definirlo como MySql.Data.MySqlClient.MySqlConnection (hablaremos ms sobre este objeto luego). Por supuesto que esto es muy largo para escribirlo seguido por lo que podemos utilizar la sentencia Imports para acortarlo. Si agregamos Imports MySql.Data.MySqlClient al principio del archivo fuente, nos podemos referir al objeto Connector/NET como MySqlConnection.

Agregar un Objeto MySqlConnection


MySQL Connector/NET es bsicamente una coleccin de objetos utilizados para acceder a una base de datos MySQL. El primer objeto que utilizaremos es el objeto MySqlConnection. El objeto de conexin funciona como un intermediario entre los dems objetos contenidos dentro de Connector/NET y el servidor MySQL. El objeto de conexin maneja el proceso de acceso y es el objeto que utilizaremos para verificar que la informacin de acceso de un usuario es correcta. Existen dos pasos para crear un objeto. Primero, declaramos el objeto, luego lo instanciamos. Cuando declaramos un objeto, le asignamos un nombre que usaremos para referirnos a l y tambin indicamos el alcance del objeto, o en otras palabras, qu funciones y procedimientos puede acceder el objeto. En nuestro caso, tenemos que asegurarnos de que cualquier funcin o procedimiento dentro del formulario tenga acceso al objeto de conexin, por lo tanto declararemos el objeto de conexin en primer lugar dentro de la clase:
Imports MySql.Data.MySqlClient Public Class frmAcceso Dim con As MySqlConnection Private Sub cmdCancelar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdCancelar.Click Application.Exit() End Sub End Class

La palabra clave Dim se utiliza al declarar objetos y variables. Yo utilic con como nombre para mi objeto de conexin. La palabra clave As se usa para indicar qu estamos declarando (un objeto, una variable, etc). Finalmente, MySqlConnection es el objeto que estamos declarando.

Instanciacin del Objeto MySqlConnection


Ahora que ya hemos declarado el objeto de conexin, debemos instanciarlo. Hasta que no hayamos instanciado un objeto, no estar disponible para ser utilizado. Instanciaremos el objeto dentro de la subfuncin que maneja el evento click del botn Ingresar. Haz doble clic en el botn Ingresar en la vista Diseo para crear la subfuncin. Para instanciar el objeto utilizaremos la palabra clave New:

Private Sub cmdIngresar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdIngresar.Click con = New MySqlConnection() End Sub

Armado del String de Conexin


El objeto MySqlConnection utiliza un string de conexin para conocer a qu servidor debe conectarse, qu base de datos acceder y qu nombre de usuario y contrasea utilizar para autenticarse. Las distintas propiedades se separan con punto y coma. Este es un ejemplo de un string de conexin:
server=localhost; user id=mike; password=12345; database=entrada_salida

Obviamente, necesitamos que el string de conexin refleje la informacin que el usuario ingrese en el formulario. Para hacer esto utilizaremos el carcter & para unir los distintos strings y el valor .Text de los objetos TextBox. Adicionalmente, utilizar el carcter _ para separar el cdigo en varias lneas:
Private Sub cmdIngresar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdIngresar.Click con = New MySqlConnection() con.ConnectionString = "server=" & txtServidor.Text& ";" _ & "user id=" & txtUsuario.Text& ";" _ & "password=" & txtContrasea.Text& ";" _ & "database=entrada_salida" End Sub

Apertura de la Conexin
Lo ltimo que nos queda por hacer es indicarle al objeto de conexin que abra la conexin con el servidor MySQL mediante el mtodo .Open() del objeto de conexin:
Private Sub cmdIngresar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdIngresar.Click con = New MySqlConnection() con.ConnectionString = "server=" & txtServidor.Text& ";" _ & "user id=" & txtUsuario.Text& ";" _ & "password=" & txtContrasea.Text& ";" _ & "database=entrada_salida" con.Open() End Sub

Utilizacin de un MessageBox
Cuando hayamos abierto la conexin con xito, querremos que el usuario sepa si su nombre de usuario y contrasea eran correctos. Podemos lograr esto con el objeto MessageBox. En

su forma ms simple, el objeto MessageBox (cuadro de mensaje) le mostrar un mensaje al usuario con un botn Aceptar. Esta es una simple lnea de cdigo para mostrar un MessageBox:
MessageBox.Show("Conexin Abierta Con xito!")

Cierre de la Conexin
Cuando hayamos terminado con el objeto de conexin tendremos que cerrarlo. Al cerrar la conexin liberamos los recursos necesarios para mantener la conexin activa. Es una buena prctica cerrar las conexiones ni bien hayas terminado de utilizarlas. Una conexin se cierra con el mtodo .Close().
con.Close()

Eliminacin del Objeto MySqlConnection


Cada vez que hayamos terminado de trabajar por completo con un objeto es una buena prctica eliminarlo, reduciendo as el consumo de recursos de nuestra aplicacin. Cuando eliminamos un objeto, los recursos que ocupaba se liberan y el objeto deja de existir. Eliminamos un objeto llamando a su mtodo .Dispose().
con.Dispose()

Captura de Errores
Actualmente, nuestro cdigo es apropiado para una situacin ideal. Si no podemos conectarnos al servidor o si ingresamos un nombre de usuario o contrasea equivocada el objeto de conexin devolver un error, tambin conocido como excepcin. Para manejar errores, VB.NET tiene una sintaxis especial de TRY CATCH FINALLY. Ponemos el cdigo con los errores potenciales despus de la palabra clave TRY pero antes de la palabra clave CATCH. LA palabra CATCH se utiliza para indicar qu clase de error nos podemos encontrar (en nuestro caso, el error devuelto ser un objeto Connector/NET MySqlException). Todo el cdigo ubicado a continuacin de la palabra clave FINALLY ser ejecutado haya o no un error. Si ocurre una excepcin, el cdigo restante de la seccin TRY no ser ejecutado. Este es el cdigo final que maneja la conexin:
Private Sub cmdIngresar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdIngresar.Click con = New MySqlConnection() con.ConnectionString = "server=" & txtServidor.Text& ";" _ & "user id=" & txtUsuario.Text& ";" _ & "password=" & txtContrasea.Text& ";" _ & "database=entrada_salida" Try

con.Open() MessageBox.Show("Conexin Abierta Con xito") con.Close() Catch mierror As MySqlException MessageBox.Show("Error de Conexin a la Base de Datos: " & mierror.Message) Finally con.Dispose() End Try End Sub

Esto combina todo el cdigo de conexin y permite manejar errores sin que la aplicacin se cierre por operaciones invlidas. Instanciamos el objeto de conexin y le asignamos un string de conexin. Dentro de un bloque TRY CATCH de manejo de errores, intentamos abrir la conexin al servidor y, si se realiza con xito, le mostramos un MessageBox al usuario indicando el xito y luego cerramos la conexin. Si ocurre un error al conectarse, se ejecutar el cdigo del bloque CATCH. En este caso le mostraremos al usuario un MessageBox con la propiedad .Message del objeto MySQLException, que contiene el mensaje asociado al error comprensible para los humanos. En el bloque FINALLY eliminamos el objeto de conexin. Hacemos esto en el bloque FINALLY porque haya o no tenido xito la conexin, querremos eliminar el objeto.

Prueba del Proyecto


Cuando el cdigo est en su lugar, guarda el proyecto y presiona la tecla F5 para iniciar la aplicacin en modo depuracin. Prueba la verdadera direccin del servidor, nombre de usuario y contrasea, luego prueba usar una direccin de servidor equivocada y luego prueba una contrasea errnea. Notars distintos mensajes de error al utilizar una direccin errnea que al utilizar una contrasea errnea. El mensaje de error al utilizar un nombre de usuario errneo es el mismo que al utilizar una contrasea errnea, ya que un mensaje de error separado constituira una amenaza a la seguridad ya que un potencial intruso podra saber si un nombre de usuario es correcto o no.

Mejoras
Hay algunas mejoras que debern hacerse a nuestro formulario de acceso. En primer lugar, nuestro usuario no debera tener que ingresar la direccin del servidor cada vez que deseen usar la aplicacin y en un futuro veremos cmo guardar la direccin del servidor en un archivo de configuracin. La segunda mejora es con respecto al manejo de errores. Mostrar el mensaje de error de MySQL est bien durante la etapa de desarrollo pero la versin final de nuestra aplicacin no debera mostrar los errores de la base de datos directamente. Podemos utilizar la propiedad .Number del objeto MySqlException para determinar qu clase de error estamos tratando y luego crear un mensaje de error personalizado.

Para finalizar, obviamente necesitaramos lograr que una conexin exitosa nos lleve a un nuevo formulario en nuestra aplicacin. Si nuestra aplicacin consistiera en formulario de acceso y nada ms, seguramente no ser muy popular.

Conclusin
En este tutorial hemos explicado la instalacin de MySQL Administrator y la creacin de una nueva cuenta de usuario MySQL. Luego instalamos VB.NET y MySQL Connector/NET. Finalmente utilizamos VB.NET para crear un formulario de acceso para nuestra aplicacin que nos conecta al servidor MySQL (suponiendo que ingresamos la direccin de servidor y el nombre de usuario y contrasea correcta). El formulario se configur para manejar errores durante la conexin mediante el uso de la sintaxis TRY CATCH FINALLY. El archivo del proyecto creado en este tutorial est disponible en el hipervnculo de abajo. Los archivos del proyecto son para Visual Basic 2005 Express Edition. En el prximo tutorial crearemos nuestro primer evento y haremos un formulario para mostrar el estado actual de nuestros usuarios. Cdigo de Ejemplo #1 Descargar Cdigo de Ejemplo Adjunto Ejemplo de cmo conectarse a una Base de Datos MySQL utilizando VB.NET y Connector/NET.
Private Sub cmdIngresar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdIngresar.Click con = New MySqlConnection() con.ConnectionString = "server=" & txtServidor.Text& ";" _ & "user id=" & txtUsuario.Text& ";" _ & "password=" & txtContrasea.Text& ";" _ & "database=entrada_salida" Try con.Open() MessageBox.Show("Conexin Abierta Con xito") con.Close() Catch mierror As MySqlException MessageBox.Show("Error de Conexin a la Base de Datos: " & mierror.Message) Finally con.Dispose() End Try End Sub

Potrebbero piacerti anche