jueves, diciembre 01, 2005

No se torture haciendo confesar los datos: Estándares para el diseño de bases de datos

En búsqueda de un modelo estándar de diseño de Bases de Datos

Siempre he sido criticado por mantener mi posición neutral en cuanto al diseño, selección de modelos, patrones, estilos y prototipos de todo lo que refiere a la programación y a las bases de datos.
Pero en esta ocasión voy a romper un poco el hielo proponiendo un "estándar" para el modelado de bases de datos.
No es el objetivo en este momento de seleccionar una base de datos, los cual haré en una próxima ocasión.

Pero antes supondré que ya posee unos conocimientos básicos de bases de datos, especialmente en cuanto a normalización refiere, y que al menos se ha trabajado una base de datos.

Es probable que alguien se haya preguntado el porqué del título; si se lleva una gran bagaje en el mundo de las bases de datos, posiblemente se identifique la siguiente cita:

Datamining: El arte de torturar los datos hasta hacerlos confesar

Pero, ¿cómo se podría hacer "confesar" unos datos mal organizados y estructurados? Una tarea casi imposible.
Luego de haber experimentado con varias de las propuestas de diferentes autores, modelos y "estándares", me aventuro a presentar una propuesta un tanto arriesgada y atrevida, y para muchos contraproducente y abusiva, queriendo aclarar que no es mi objetivo decir que es la panacea o una declaración que deba ser asumida de inmediato, es sencillamente una propuesta que cada uno pondrá en práctica según lo considere.
A medida que se desarrollan las diferentes entidades o tablas, con el principal problema al cual me he enfrentado al hacerles manteniemiento es es cuanto a la asignación de los nombres a las tablas y sus respectivos campos.
Existen diversas propuestas para designar nombres a las tablas y sus campos, los cuales pienso enumerar a continuación, además de presentar los pros y contras de cada uno.
Notación 1:
Reglas:
  • El nombre de la tabla debe tener máximo 12 caracteres y todas sus letras deben estar en mayúsculas. (Ej: ESTUDIANTE)
  • Las tres primeras letras de cada campo, deben hacer referencia a la tabla, seguido por un guión de piso o de suelo (_) y luego tres caracteres que indiquen el contenido del campo, y todos sus caracteres deben estar en mayúsculas. (Ej.: EST_COD, EST_NOM, EST_APE, EST_DIR)
Ventajas:
Para su tiempo la principal ventaja que ofrececía era que debido a la limitación que poseía el MS-DOS y similares de solo poder archivos de máximo 8 caracteres, garantizaba que el nombre siempre iba a ser válido. Esto nunca aplicó a bases de datos sobre Unix o similares.
Código SQL muy breve y relativamente fácil de modificar
Desventajas:
Puede presentarse el caso que dos campos puedan tener nombres MUY similares y complicar el mantenimiento de las tablas
Notación 2:
Reglas:
  • Todos los nombres de campos y tablas son en mayúsculas
  • El nombre de la tabla debe ser de la menor cantidad posible de caracteres y para esto se suprimen todas las vocales. Sólo existen dos excepciones a esta regla. La primera si la palabra inicia en vocal, y la segunda, cuando las vocales de la última sílaba son significativas o pueden aclarar la palabra (Ej: ESTDNTE)
  • Los nombres de los campos deben iniciar con tres caracteres, correspondientes a la tabla a donde pertenecen o, en el caso de los campos foráneos, el nombre de la tabla maestra (Ej: EST_CDGO, EST_NMBRE, EST_APLLDO CIU_NCMNTO)
Ventajas:
Tablas y campos organizados, donde se puede definir el origen de los datos en el caso de los campos foráneos.
Desventajas:
Código SQL resultante supremamente complejo y confuso, debido a la posible similitud entre palabras, éstas al no contener vocales dificulta la lectura y así un mantenimiento adecuado a la base de datos
Básicamente, éstas son las notaciones más usadas o quizás las que han sido la base para muchas otras, las cuales requieren todo un tratado para explicarse y exponerse de la manera adecuada.
A continuación expondré dos propuestas las cuales son muy similares pero mutuamente excluyentes, como lo podrán notar más adelante, pero tienen como propósito presentar una alternativa a los estándares actuales de diseño, formulación y desarrollo de bases de datos.

Inicio con la base común para ambas propuestas:

Propuesta de diseño y convenciones para bases de datos:

  • Los nombres tanto de entidades como de atributos (tablas y campos) deben estar escritos en mayúscula. Podrán ser usados los caracteres [A-Z][a-z][_][0-9]: Esto se hace debido a las diferentes limitaciones de las bases de datos especialmente antiguas, así que debería evitarse el uso de caracteres especiales por cuestiones de compatibilidad, pero si se dispone de una base de datos con soporte para las diferentes codificaciones existentes, de las cuales personalmente recomiendo la UTF-8, ya que es la universal y se rige por el estándar UNICODE., recomiendo que se usen los caracteres especiales, ya que estos facilitarían en gran manera la lectura de cada una de las sentencias, pero hay que tener en cuenta cada una las limitaciones de las bases de datos y los cambios especialmente en sentencias SQL que esto generaría; por lo tanto, úsese pero teniendo en cuenta que esto exige pequeños cambios en la generación y creación especialmente de las consultas SQL.
  • El nombre de una entidad o de un campo no puede empezar con número: Aunque en la actualidad sí es posible, no se debería, incluso creo que no se presenta ningún caso en el cual se requiera, si existe, me encantaría conocerlo, pero mientras eso sucede, no se debería hacer.
  • El nombre de la entidad o del campo, en el caso que esté compuesto por dos o más palabras, éstas deben ser separadas por el signo de subrayado (ej: personal_departamento)
  • Un nombre de entidad puede llegar a estar compuesto de dos partes: un prefijo de algunos caracteres que indica el ámbito de utilización de la entidad o su pertenencia principal, ya sea un tema o módulo y un nombre de que representa la identificación de la entidad, unidos por un signo de subrayado
  • Para cualquier caso los nombres de los campos o de las entidades, se debe procurar que no sean excesivamente extensos, sin dejar a un lado la expresividad y claridad en los nombres
  • Los nombres de entidades y campos deben estar escritos en singular y evitar para ellos la utilización de verbos
  • Los campos que sean claves primarias de una entidad se deben denotar con el prefijo o sufijo ID, y el nombre de la entidad sin prefijo (si lo tuviese) unidos por un signo de subrayado preferiblemente.
  • Los campos de clave foránea y las claves principales con las que se relacionan deben ser de igual nombre, salvo cuando una entidad disponga de mas de una clave foránea a la misma clave primaria. En este caso se dará un nombre adecuado que represente la relación.
  • Los campos de tipo booleano aunque deberían evitarse por medio de listas, en el caso de existir, deben estar en participio en el caso de verbos o usar algún prefijo o sufijo que los identifique como tal, separados por el signo de subrayado

Pero independientemente de cualquier teoría, estándar o norma, la regla general para el desarrollo, diseño e implementación de bases de datos radica en una primitiva bastante sencilla.

Si cualquier persona que vea el diseño puede definir el funcionamiento, lógica y significado de cada una de las entidades y sus relaciones, se puede considerar que el trabajo ha sido realizado correctamente

jueves, octubre 13, 2005

Dispárate en un pie y te volarás la cabeza: ¿Qué lenguaje usar?

El dilema de la elección de un lenguaje de programación

Justo antes de iniciar este blog estaba pensando en esa famosa frase que describe a C++:

C te facilita dispararte en el pie. C++ lo hace más difícil, pero cuando lo haces, te vuela la pierna entera. (Bjarne Stroustrup)

Esto a su vez me recuerda un correo electrónico que alguna vez recibí de algún amigo refieriéndose a esta dura decisión, el cual deseo compartir con todos los internautas.

Tarea a Realizar
Dispararse en el pie
LenguajeDescripción
C Te disparas en el pie.
C++ Creas accidentalmente unas docenas de operadores a ti mismo y todos te disparan en el pie.
FORTRAN Te disparas en cada dedo de los pies iterativamente hasta que se te acaben los dedos, entonces READ el NEXT pie y REPEAT. Si se te acabaran las balas, debes continuar con los intentos de disparo, ya que no hay capacidad de manipulación de excepciones.
Pascal El compilador no te permite dispararte en el pie.
Ada: Después empaquetar correctamente el pie, intentas cargar al mismo tiempo el revólver, apretar el gatillo, apuntar y disparate en el pie. Cuando lo intentas descubres que no puedes porque tu pie es del tipo equivocado.
COBOL USING un COLT 45, apunta REVOLVER en PIERNA.PIE, ENTONCES pon BRAZO.MANO.DEDO en COLT.GATILLO, APRIETA y DISPARA. THEN RETURN COLT a CARTUCHERA. CHECK ZAPATO.CORDON si necesita ser atado.
LISP (Te disparas en el apéndice que mantiene el revólver con que ((te disparas en el apéndice que mantiene el revólver con que (((te disparas en el apéndice que mantiene el revólver con que ((((te disparas en el apéndice que mantiene el revólver con que (((((te disparas en el apéndice que mantiene el revólver con que ((((((te disparas en el apéndice (...) ))))))
FORTH El pie se dispara a sí mismo.
Prolog Le dices a tu programa que quieres dispararte en el pie. El programa razona cómo lo hace, pero no entiendes la sintaxis.
BASIC: Dispárate en el pie con una pistola de agua. En sistemas grandes, continúa hasta que el agua cubra el cuerpo entero.
Visual Basic: En realidad sólo parece que te has disparado en el pie, pero te has divertido tanto que realmente no importa si has disparado o no.
Hypertalk: Pon la primera bala de revólver en el pie de la pierna izquierda. Responde el resultado.
Motif Te pasas días escribiendo una descripción UIL de tu pie, de la bala, de su trayectoria y los intrincados dibujos de las cachas de marfil del revólver. Pero cuando te dispones a apretar el gatillo, se atasca el revólver.
APL Te disparas en el pie, pero te pasas todo el día arrepentido pensando que podías haberlo con menos caracteres.
SNOBOL Si tuvieras éxito, dispárate en el pie izquierdo. Si fallara, dispárate en el pie derecho.
Unix % ls pie.c pie.h dedo.o dedo.c dedo.o % rm * .o rm:.o

No existe tal fichero o directorio % ls %

Concurrent Euclid Te disparas sobre cualquier miembro en vez del pie.
370 JCL Debes bajar el pie un MIS e incluir un documento de 400 páginas detallando exactamente cómo lo quieres disparar. Tres años después, tu pie regresa absolutamente frito.
Paradox No solamente puedes dispararte en el pie, tus usuarios también lo hacen.
ACCESS Intentas apuntar el revólver en tu pie, pero terminas por disparar en los agujeros de todos los diskettes de distribución de Borland.
Ensamblador Intentas dispararte en el pie solamente para descubrir que antes debes inventar el revólver, la bala, el gatillo y el pie.
Modula2 Después de comprender que es imposible hacerlo con este lenguaje, te disparas en la cabeza

A pesar de ser un texto burlesco y un tanto jocoso, presenta de manera divertida la realidad de los diferentes lenguajes de programación existentes. Pero entremos a analizar los pros y contras de cada uno de los lenguajes más importantes de la actualidad.

Lenguaje Características
C El lenguaje más poderoso en toda la historia, considerado un lenguaje de no muy alto nivel, y esto mismo le otorga gran parte de la potencia que posee. Es ideal para el desarrollo de programas a bajo nivel, tales como Sistemas Operativos, BIOS, y otros compiladores, ya que los binarios generados son bastante reducidos y optimizados (depende del programador). Además, en teoría, puede interactuar con prácticamente cualquier otro lenguaje de programación, compilador o programa.
C++ Posee toda la potencia del C pero con un valor agregado, la POO, la cual nos permite darle una mayor organización al software, lo que lo convierrte en un excelente lenguaje para el desarrollo de software de alto nivel.
FORTRAN Aunque debo aceptar que no soy un gurú de este lenguaje, cabe decir que este poderoso lenguaje ya casi en desuso, es el ideal para el desarrollo de sistemas científicos, pues toda su estructuración y filosofía lo permiten.
Pascal Mi favorito. Como rezaba alguna una campaña publicitaria de Borland:
Toda la facilidad de BASIC con la potencia de C++

Es un lenguaje altamente didáctico e ideal para la enseñanza, pues es bastante ordenado. Aunque para algunos es una ventaja que este lenguaje tenga tipos de datos estrictos, para esto es bastante molesto, pero no viene al caso debatir sobre este asunto, que puede ser expuesto en otro tema más adelante. Excelente para casi todo.
BASIC Es un lenguaje poco estructurado, poco práctico para el desarrollo de software. No lo recomiendo, y de hecho es prácticamente extinto como tal. Actualmente existen versiones y adaptaciones tales como VisualBASIC en sus diferentes sabores.
VB Como diría alguna vez:
Visual BASIC hace convierte al programador principiante en un verdadero experto y al experto en un completo inútil.
Es muy práctico para el rápido desarrollo de aplicaciones gráficos con interfaces sencillas. Aunque se pueden contruir sistemas bastante "robustos", no es práctico para el desarrollo de aplicaciones realmente potentes, posee demasiadas dependencias que convierten a la aplicación en una máquina para consumir recursos del PC.
Ensamblador El lenguaje más poderoso de todos, poco usado por los programadores en la actualidad, así por el contrario los electrónicos, ya que este lenguaje nos permite manejar el PC al más bajo nivel posible, manipular toda su estructura y programación.
Este lenguaje puede llegar a ser peligroso si no se sabe usar o por el contrario se conoce muy bien. Un ejemplo de esto son los "verdaderos virus", o quién no recuerda al legendario NATAS-BOOT, virus que eran una verdadera obra de arte, gracias a los avanzados conocimientos de este lenguaje que poseía el programador.
Ideal (entiéndase, necesario) para la programación de Sistemas Operativos y compiladores que requieran acceso al PC a bajo nivel.

Aunque habrá podido notar que no he mencionado varios de los lenguajes existentes, lo hago pues estos tal vez son los más conocidos y comerciales. Las diferencias radican en detalles que no vale la pena exponer por ahora.
Pero al final de cuentas, ¿cuál es el mejor lenguaje?.
R./ No hay mejor lenguaje.
¡Pero cómo es posible que no haya uno que sea el mejor!, senciallamente, porque cada lenguaje fue diseñado con un propósito en específico, y aunque en la actualidad muchos lenguajes como Delphi, C#, y VisualBASIC.Net ofrecen grandes facilidades para el desarrollo de sistemas cada uno tiene sus características que lo hace único, además cabe anotar que esto va de acuerdo al estilo de programación que se use.
No quiero inclinar a usar equis o ye lenguaje, pues no es mi propósito, pero para los que desean saber qué lenguaje uso, temo decir que varía según la necesidad, aunque como expuse anteriormente Pascal es mi favorito, debo aceptar que actualmente no lo uso. Por el contrario uso versiones derivadas de éste, como son: Delphi, Kylix, FreePascal, Lazarus, etc. y aun a pesar de todo, ninguno de los anteriores uso a menudo, pues también uso VB en su diferentes presentaciones, según sea la necesidad, Ensamblador, C/C++/C# y otros los cuales no vale la pena mencionar. Así que igualmente le invito a hacer lo mismo, que de seguro le traerá muchas satisfacciones.