[pyar] Campo Primario Web2py
Mariano Reingart
reingart en gmail.com
Vie Feb 11 13:26:26 ART 2011
2011/2/5 Mariano Mara <mariano.mara en gmail.com>:
> En realidad no creo que tener un sistema blindado como vos decís sea
> a veces lo más práctico. Vos tenes que poner la validación en el lugar que tenga más
> sentido (que te asegure que ese control siempre anda con la menor cantidad de
> código posible).
> Tomando el ejemplo que mencionás de IS_NOT_IN_DB: tu base para que
> inserción de registro que hagas está haciendo dos cosas (me gusta pensar
> que hay bases lo suficientemente inteligentes para anular uno de los dos
> pasos al detectar que son redundantes):
> * agregando una clausula "not in" en el criterio del query
> * cuando efectivamente se inserta, revisando que la columna con un
> constraint unique no esté repetida
No, ninguna de las dos te asegura efectivamente que no haya duplicados.
Hasta donde entiendo, las bases no bloquean por predicado, y se
complica aún más al usar niveles de aislamiento "rapidos" que no
serializan las consultas y permiten transacciones simultáneas, asique
la unica forma de asegurarte que no haya duplicados es agregar una
constraint unique (o bloquear la tabla...).
Igualmente, lo que hace IS_NOT_IN_DB es validar el formulario (con un
query antes de actualizar los datos en la base), no interfiere a nivel
de base de datos, para eso estan las restricciones unique y notnull de
la base de datos (por eso web2py soporta ambas, aunque parezca algo
redundante, no lo es).
> Quiero dejar constancia que la verdad es que no tengo ni idea que hace
> el IS_NOT_IN_DB de web2py: muy posiblemente también se de cuenta de la
> redundancia y no aplique el filtro. Lo mío -como dije anteriormente- es
> framework agnostic, son más bien consideraciones generales.
Lo de framework agnostic esta bien, pero tambien hay que mencionar que
no todas las bases de datos soportan las restricciones y/o dominios de
datos, y web2py y otros frameworks tratan de abstraer un poco el
manejo de estos temas.
> Poniendo la misma validación en varias capas del sistema te
> exponés a las siguientes situaciones:
> 1- estás trabajando de más.
No necesariamente, son cosas distintas, en un framework web necesitas
mostrarle a un usuario de manera amigable un error en el formulario, o
que arme un combo con la lista de valores posibles, o poner un widget
de calendario, etc.
Eso hacen los validadores de web2py.
> 2- corrés el riesgo que alguna de las validaciones quede desactualizada
> (por ejemplo por un cambio en las reglas del negocio).
No necesariamente, en web2py, las reglas de negocio pueden estar en el
modelo (un unico lugar), y como dije anteriormente, podes tener las
restriciones de la base de datos, validación de los formularios y
representación de datos en un mismo lugar, que se aplicará a todos los
controladores y demás.
> 3- haciendo que todo tarde más (en un sistema con poca concurrencia por
> ahí esto no te importa pero si tenés más de 10000 usuarios intentando
> insertar al mismo tiempo, ahí puede que sea interesante considerarlo).
Depende, un simple select puede ser menos costoso que una
actualización fallida, teniendo que deshacer una transacción y manejar
un error a nivel de bd.
Igualmente, la optimización prematura es la madre de todos los males ;-)
> Claro que todo no es blanco o negro y llegado el momento antes de poner
> una validación tenes que hacer la relación costo beneficio de lo que
> estás por hacer:
> a- ponés solo un unique constraint pero en la rutina de inserción de
> datos tener que agregar más código para atajar la excepción.
> b- usando IS_NOT_IN_DB el framework automaticamente te entrega un
> hermoso drop-down que no tuviste que codear vos
>
> ahí podés decir que te bancas la doble validación porque te ahorraste
> tiempo de desarrollo si no lo hubieras hecho. Y llegado el caso que
> estemos hablando de una tabla crítica del sistema y estés en la duda,
> siempre podés hacer un poco de stress (con alguna herramienta simple
> tipo JMeter por ejemplo) y comparar cuanto te cuesta tener más de una
> validación, tener una sola o no tener ninguna.
>
La hora de programador es muchisimo mas cara que la hora de procesamiento :-)
Igualmente llegado el caso, uno puede en web2py deshabilitar los
validadores o hacer los inserts a mano controlando el error de la db,
con un par de lineas.
Sds
Mariano Reingart
http://www.sistemasagiles.com.ar
http://reingart.blogspot.com
More information about the pyar
mailing list