[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