Blog de Javier Smaldone

Todos los días se aprende algo viejo

Comentarios recientes

  • Mar en Fibertel, una porquería
  • Lucia en Fibertel, una porquería
  • anita en Sobre dictadores, genocidas y ladrones
  • pedro en Cómo funciona el DNS
  • Cintia en Fibertel, una porquería

15 comentarios

Ale dijo:
25 de Junio de 2008 a las 8:24  

Muy bueno Javier! Una pregunta, esta empresa MSA es conocida, tiene trayectoria? Porque por lo que contás, parecería que fue algo que se armó a las apuradas, seguramente en connivencia con algún miembro de la junta electoral que se llevó una tajada.
Es evidente que esta aplicación fue armada de un día para otro, y diseñada y programada por principiantes, lo que no es coherente ni con el precio cobrado ni con la importancia que tiene un sistema de esta naturaleza.

pablok dijo:
25 de Junio de 2008 a las 9:35  

Fantástico! Siempre hacen falta ejemplos de pésimo diseño para ejemplificar a los alumnos de primer año en tópicos centrales (y elementales) como la integridad referencial. Sólo necesitaría que consiguieses el código fuente y tengo para una clase perfecta.

25 de Junio de 2008 a las 10:40  

Javier,

Quiero “echar LUZ” al tema de base de datos. Se usa para “representar arboles” en una sola tabla. No violenta ninguna regla de Base de Datos. Solo el del sentido común: usar algo, con un destino para el cual no fué diseñado. Por ejemplo, algo asi como: “usar un clavo para martillar”.

Respecto del “Truco” de Usar ÁRBOLES en la tabla ubicaciones. Conozco el truco en el peor sistema de contabilidad que he visto, en COBOL. El truco es usado, para cuentas contables, para determinar en una muy limitada representación de una estructura de “árbol” la relación Padre, hijo o Madre, hija en un “ilimitado” manejo de subniveles en el plan de cuentas y todo en una sola tabla. El truco es ingenioso. Pero totalmente inapropiado.

Saludos,
gab

25 de Junio de 2008 a las 10:51  

Javier,

La nota no es muy buena. Es EXCELENTE!.

Tengo que felicitar tu vocación de educarnos a todos. Tu nota me educa, me anoto en primera fila.

Tu BLOG en general es de una CALIDAD envidiable. Es casi Perfecto.

Pero lo que quiero decir algo que NO ESTA QUEDANDO CLARO para el público en general, y lo digo, porque al principio yo tampoco lo tenía claro, con tu nota de ayer y mas con la de hoy se me aclaró por completo, pero que no podía entender debido a la tremenda incoherencia de lo sucedido, y eso es:

El sistema de Escrutinio de 352 MESAS, es un sistema que tiene menor complejidad que un sistema completo para un KIOSCO, que nunca superaría los, digamos 3000 pesos?. Bueno, el punto es, que uno piensa en los 110.000 votantes, pero esos votantes, no son ninguna complicación, ni medida del volumen de datos a manejar, ya que podrían ser 10 veces mas votantes, y sin embargo no complicar el sistema en el mismo grado. El volumen de datos mas importante, son esas 352 MESAS, nada mas.
Sólo los 352 registros son los que estarán en la tabla más GRANDE de todo el sistema. o sea NADA, la complejidad de ese sistema se puede resolver en el VISICALC corriendo en la Apple II, ambos de 1982, que tenía la capacidad para 1024 registros. En ese sistema, quedo demostrado, la operación mas complicada a realizar es la SUMA.

Saludos,
gab

Silvina dijo:
25 de Junio de 2008 a las 13:43  

Qué es eso!??! .Qué manera de complicarse no solo con las entidades lugares y ubicaciones, sino con la entidad configuraciones!
Vaya a saber que tipo de normalización tienen las tablas!
Nunca tendrán consistencia los datos con una base de datos así, y menos obtener resultados correctos. Me asombra.
Ni siquiera esta implementada para manipular datos con algún fin. Qué peligroso seria el voto electrónico con gente así. :(

Fernando dijo:
25 de Junio de 2008 a las 16:39  

Muy bien explicado todo… En su día tuve que programar una aplicación web para gestionar unas elecciones municipales con PHP+MySQL y pasé un montón de horas revisando las tablas y sus relaciones.

Respecto al tema de las mesas electorales lo suyo es una tabla para distritos (o circuitos) electorales, otra para colegios y otra para las mesas. Como bien dices se puede utilizar una estructura en árbol, pero este tipo de soluciones es para casos en los que es imposible determinar un número de hijos o ramificaciones (como puede ser un foro o unas news, que no se puede determinar ni limitar el número de respuestas que va a tener un hilo). Además, en el caso concreto de unas elecciones, estamos hablando de como mucho unas 7 tablas para determinar la localización de una mesa: Estado o Comunidad Autónoma, Provincia, Localidad, Distrito, Colegio y Mesa. Lo que aunque parece mucho simplifica mucho la lógica de la aplicación.

Para mi el utilizar un sistema de árbol o el utilizado en el caso que comentas es un error muy gordo: simplifica la base de datos, si, pero a un precio muy alto al complicar excesivamente la logica de la aplicación.

26 de Junio de 2008 a las 9:55  

Buenas Javier,

Mi nombre es Gabriel, y trabajé en MSA durante casi doce años, hasta Julio del 2007. Mi intención no es ser el abogado de la empresa, porque supongo que si quieren escribir alguna replica lo van a hacer, sino defender el trabajo de los que participamos alguna vez en este tipo de proyectos.

En cuanto a lo que describiste en el post anterior, no puedo escribir demasiado porque ya no trabajo en la empresa y por lo tanto no participé de este proceso en particular. Tampoco puedo hablar de los temas de cuanto se pago, que se dio a cambio, con que se quedó el municipio, etc, ya que nunca estuve en el área comercial.

Vamos a lo técnico…

A menos que alguien le haya hecho algún retoque, me parece que ese DER lo hice yo, y no es precisamente la documentación del proyecto sino que fue el bosquejo de lo que deberíamos hacer para uno de los últimos proyectos en los que participé. Seguramente se coló de un documento a otro y llegó a ustedes… pero bueno, por eso algunas inconsistencias en cuanto a la realidad.
En cuanto al idioma, no me molesta documentar y leer en inglés (afortunadamente no tengo ningún problema con el idioma), pero no veo la razón para documentar en inglés si todos los desarrolladores eramos argentinos. Sinceramente, prefiero que documenten en español antes que tiren un comentario en inglés ofuscado, o no hagan ningún comentario por miedo al idioma.

Veo que se armo mucho revuelo con el tema de las claves primarias y principalmente sobre la tabla ubicaciones y su id un tanto extraño. En el equipo teníamos un DBA de Oracle (antes usábamos esa BD) sumamente competente, que seguramente se encargaba de optimizar tipos de datos, etc, por lo que solo nos dedicábamos a diseñar la solución al problema. Es lo bueno de trabajar en equipo, vos haces tu parte y el que sabe se encarga de lo suyo. Si bien los ids alfabéticos no son lo mejor, en este caso eran necesarios, y como la performance estaba dentro de lo establecido, lo mantuvimos así. (bueno, supongo que lo del varchar en una clave SI fue un descuido)

En cuanto a la tabla ubicaciones; si, podríamos haber separado en país, provincia, circuito, escuela, mesa, etc. El tema es que no todas las provincias siguen el mismo esquema ni nomenclatura. En algunas es distrito, en otras circuito, en otras usan departamentos, municipios, distritos escolares, y a veces el orden o cantidad de niveles es levemente diferente. En este caso, poner todo en una sola tabla es la solución mas practica (que encontramos) si queríamos reutilizar algo del diseño en diferentes proyectos.

El código de ubicaciones, como menciona Gabriel Medina, esta basado en el modelo jerárquico o de arboles que comúnmente se utiliza en sistemas contables, pero no por esto hay que despreciarlos, el objetivo de estos códigos es minimizar consultas por un lado y facilitar la totalización de datos por el otro.

Podríamos haber representado la misma estructura usando ids enteros, y guardando un id de referencia al padre (esto sería lo primero que se le viene a uno a la mente), pero el problema sería el siguiente: dado un id en particular, para obtener todos sus ancestros tendrías que hacer n-1 queries, siendo n el nivel actual. En cambio, utilizando este tipo de códigos tenés a todos tus ids ancestros a tu disposición en todo momento, incluso podes saltar directamente al primer nivel, o al tercero, sin pasar por los otros. Seguramente esto no se visualiza a nivel intendencia como es el caso que estas mostrando, pero agregale al menos dos niveles mas (país + provincia) para unas elecciones nacionales, y ahí empieza a tener sentido.

Por otro lado, cuando se guardan los datos obtenidos de las planillas, se relacionan solo con las hojas del árbol, con el nivel mas bajo (seguramente, mesa). De esta forma es muy simple totalizar para una elección nacional o provincial (de nuevo, esto no se visualiza bien con los datos actuales).

Voy a tratar de poner un ejemplo sin extenderme demasiado:

Supongamos el escenario de una elección nacional, donde hay que mostrar totales por nación (presidente), por provincia (diputados, senadores, gobernador, presidente), por municipio/distrito/departamento/etc (intendente, concejales, + los de prov)
El código tendría al menos 5 niveles (simplificando la cosa): país + provincia + distrito + escuela + mesa, y los códigos de las hojas serian algo así: ARBA010101, ARRN010101, ARCB020533, etc

Al registrar los datos de las planillas relacionados con estos códigos se simplifica mucho las queries para totalizar. Por ejemplo, si queremos hacer la consulta de presidente a nivel nacional, haces un “sum(votos) where ubicación like ‘AR%’ ” (en pseudo sql) y ya totalizaste. Si queres sabes como va para el mismo cargo, pero en Río Negro, cambias AR por ARRN: “sum(votos) where ubicación like ‘ARRN%’ “, y así para todos los niveles. ¿Se entiende la idea? Te aseguro que lo probamos bastante con bases mucho más grandes que la de Río Cuarto, y no hay problemas de performance que no pueda manejar un DBA.

Sobre los tipos de datos, no me voy a meter en el laburo del equipo actual sobre como definieron o no los constraints, pero simplemente quiero comentar que para el caso de los estados, usar un string en vez de un int como id te permite visualizar mucho más rápido el estado de las planillas: no hace falta que hagas un join, etc. Es simplemente por comodidad. Seguro que ocupa más que usar un entero, pero no eramos partidarios de optimizar por el simple hecho de optimizar. Si había una idea interesante (aunque no estuviera en los libros) se ponía a prueba. Si el resultado era el esperado, y la performance estaba dentro de los limites establecidos, adelante, sino a buscar otra cosa. Ah.. otro detalle, el sexo nunca sería boolean, porque a veces se usa para indicar mesas de extranjeros, mesas especiales, etc, y no por el sistema, sino porque viene definido así por el juzgado electoral.

Como verás, hubo algún trabajo de planificación del diseño, y te puedo asegurar que hubieron muchas pruebas, y este diseño fue mutando durante varios años en los hicimos este tipo de proyectos.

Bueno, me parece que me extendí demasiado, simplemente quería dar la opinión del otro lado, pero repito: ya no trabajo en la empresa así que no la represento, simplemente hablo desde lo técnico. Teníamos nuestros motivos para hacer las cosas de tal o cual forma, seguramente no fue puntualmente la de los libros, pero vamos… no es un poco aburrido vivir siempre apegado a los libros? ;)

Bromas aparte, me parecieron muy interesantes tus dos posts sobre el tema, y me parece que ganaste un lector. Si queres hacer alguna pregunta sobre este tema o cualquier otro, no dudes en hacerlo, estoy a tu disposición para lo que se pueda, pero repito que no soy el representante de la empresa, soy solo un colega de mas o menos la misma edad.

Javier dijo:
27 de Junio de 2008 a las 11:33  

Gabriel (Patiño):

Agradezco mucho tu respuesta. Me encanta este tipo de discusiones, que aunque puedan ponerse muy acalorada, son racionales y con fundamentos técnicos.

Lamentablemente, por estos días estoy bastante saturado de trabajo, pero me prometo tomarme un tiempo para hacer algunas pruebas y responder a tu mensaje, para aclarar algunos puntos en los que no coincido contigo (y también resaltar aquellos en que sí coincido).

¡Muchas gracias por tu opinión!

30 de Junio de 2008 a las 17:05  

Gabriel Patiño,

Me gusto tu participación, creo que respondiste con mucho cuidado y personalmente agradezco tu aporte, me gusta que se escuchen varias campanas, y que no haya enojos inútiles.

Con respecto a los descuidos, no deberían tomarse tan livianamente. Pero, lamentablemente muchas veces llegamos a soluciones muy sub-óptimas por tiempos, presupuesto u otras razones muy lejos de lo técnico.

De nuevo, me gusta y felicito tu participación, y estar apegado a las normas es poco creativo y a veces aburrido.

Saludos,
gab

Natalia dijo:
30 de Junio de 2008 a las 18:47  

Te molesto por una razon, me comentaron que desde el moden de fibertel se puede sacar un cable y conectar la tv, es cierto? y si es asi como se hace?
Yo lo quise conectar, pero se ven muy pocos canales, solo los del 60 en adelante, nose si es que estoy haciendo algo mal, o que?
Espero tu respuesta, desde ya mil disculpas.
Hasta luego.

Carlos Garraza dijo:
30 de Junio de 2008 a las 21:12  

PARA CONTESTAR A NATALIA SE USA UN DERIVADOR QUE SE COMPRA EN LAS CASAS DE ELECTRONICA Y PREGUNTA DE ESTA MANERA QUE BUSCAS UN DERIVADOR CON SALIDA PARA MODEM Y TV ENTONCES CONECTAS LA ENTRADA AL DERIVADOR Y TENES LAS 2 SALIDAS QUE BUSCAS UNA PARA TV Y OTRA PARA MODEM

teskmon dijo:
2 de Julio de 2008 a las 8:01  

Creo que actualmente un SGBD debería ser capaz de tener en cuenta las optimizaciones pertinentes para que no hubiera (casi) diferencia en el uso de claves primarias numéricas o alfanúmericas. Considero que es una tarea de bajo nivel propia del SGBD. Por eso no veo mal el planteamiento aunque luego según la tecnología utilizada se realicen optimizaciones manuales.

Además el uso de cadenas como claves permite dotarlas de contenido semántico evitando en algunos casos joins que de la otra forma quedan como obligatorios.

Por otra parte, me gustaría cuando tuvieses tiempo, extendieras tu explicación (dieras tus razones) sobre por qué usar el inglés para poner nombres.

Un saludo.

Ale dijo:
2 de Julio de 2008 a las 13:27  

Supongo que la respuesta de Javier será similar a la mía. Todos los nombres y comentarios en el código fuente de un sistema deberían estar en inglés, porque nunca se sabe donde va a terminar el sistema. Y si mañana vienen de China, o de Hungría, porque quieren usar el sistema para las elecciones de allí? Te vas a perder un excelente negocio por haber escrito todo en español, y hacerlo incomprensible para la mayoría de la gente de países de habla no hispana? Qué harías si te pasan un código fuente para que lo revises, y los nombres y comentarios estuvieran todos en Checo?
De acuerdo, llegado el caso podrías traducir todo, pero sería un trabajo bastante denso que podría haber estado resuelto desde el principio.
Guste o no, el inglés es el idioma universal de este mundo globalizado, siempre hay alguien que lo entiende en cualquier lugar del mundo. Y cualquier persona que trabaje en el ámbito de la informática, debería tener al menos un conocimiento medio de inglés, quienes no lo tienen ven como se les cierran muchas puertas en la cara.

Pingback & Trackback
mygif
25 de Junio de 2008 a las 6:10  

[...] La base de datos del sistema de escrutinio de MSA [...]

mygif
25 de Junio de 2008 a las 11:06  

[...] brindado por la empresa superó los $500.000 y así mismo hubo caídas importantes, software ilegal, base de datos con problemas y [...]

Artículo al azar

Deja tu comentario: