Ver Mensaje Individual
  #4 (permalink)  
Antiguo 20/08/2015, 09:16
Avatar de NSD
NSD
Colaborador
 
Fecha de Ingreso: mayo-2012
Ubicación: Somewhere
Mensajes: 1.332
Antigüedad: 12 años
Puntos: 320
Respuesta: Corregir/mejorar mi código

Hay dos escenarios posibles:
1- El desarrollador conoce la estructura completa de la base de datos y bindea en funcion de lo que la base de datos espera recibir.
2- El desarrollador no conoce (o no le interesa) la estructura completa de la base de datos y bindea en funcion de los datos que tiene.

La contra de la primer opción es que se produce un doble modelado, el primero es un modelado interno en la base de datos y el segundo el modelado de la metadata para hacer los bindeos, ambos modelos deben ser consistentes entre si y cualquier cambio en uno debe ser replicado en el otro.
Se puede usar ingeniería reversa, pero es una carga adicional.
Se puede hacer modificaciones automáticas de uno en base al otro pero es mas complicado todavía.

En el segundo caso, es la base de datos la que se encarga de saber si lo que le viene le sirve o no, y no es una carga adicional, en SQL se permite una sentencia de este tipo:
Código SQL:
Ver original
  1. INSERT INTO usuarios (edad) VALUES ('2015'), (2015), (NOW());
Siendo el campo edad entero, los 3 valores anteriores insertados seran un 2015 entero, por lo tanto como se menciona en el manual (de mysql en particular, pero aplica a otros motores también con algunas diferencias) es la base de datos la que se encarga de realizar una gestión de tipos de datos.
Cita:
sugieren que la gestión de los tipos de datos es algo que concierne a la base de datos, cuando en realidad, es un problema que va desde los sistemas de almacenamiento, al código javascript ejecutado en el cliente.
Yo lo afirmo, no lo sugiero. En particular, en el modelo relacional, la gestion de tipos de datos es algo que concierne explicitamente a las bases de datos desde la definicion teorica de las mismas y se denomina "Integridad de dominio", es uno de los 4 items principales de la integridad de datos y ningun motor puede considerarse estable o seguro si no implementa robustamente estas validaciones. (Ref1, Ref2, Ref3, Ref4, Ref5)

Supongamos que tienes en Mysql un campo del tipo "ENUM" donde los datos permitidos son el conjunto ("SI", "NO", "TAL VEZ", 1, 2, 2015) ¿Como se bindea un valor a insertar? Con el tipo que tenga el valor en ese momento, pues no se sabe de antemano.
Pero mysql es un mal ejemplo porque su soporte es muy precario, pensemos mejor en Firebird por ejemplo, en Firebird puedes crear dominios propios:
Código SQL:
Ver original
  1. CREATE DOMAIN db_enum
  2. AS VARCHAR(20) CHECK (VALUE IS NULL OR VALUE IN ('Firebird','MySQL','MSSQL', 1, 2, 3));
Como se puede ver, el dominio db_enum es un string, pero es la base de datos la que se encarga de gestionar su tipo y que su valor sea valido.
Validaciones de minimo, maximo, forma, etc son restricciones de dominio, son parte de SQL estándar y por ejemplo en firebird se implementan asi.

No confundamos limitaciones con responsabilidades, la gestion de tipos de datos e integridad de dominio (que son casi casi la misma cosa) es responsabilidad de la base de datos, que algunas implementaciones como mysql no lo hagan no quiere decir que no le concierna.

Solo aclarar tambien que javascript nada tiene que ver (salvo que uses node.js o similar para conectarte directamete) puesto que a php se lo puede usar desde la consola y es en general Apache o el servidor de turno el que modifica los tipos de datos al llegar la petición, por eso json es una buena herramienta para mitigar ese inconveniente.
__________________
Maratón de desafíos PHP Junio - Agosto 2015 en FDW | Reglamento - Desafios