En varios proyectos de aplicaciones web de los que he formado parte, el cliente solicita poder crear sus propios formularios. Surge la pregunta sobre cómo almacenar sus definiciones de formulario y cómo almacenar los valores ingresados por el usuario en esos formularios personalizados.¿Cuál es la mejor implementación de formularios web modificables y creables por el cliente en una base de datos relacional?
lo he visto hacer de dos formas:
Suponiendo que el cliente sólo define la forma en muchos campos, y qué etiquetas están asociados con esos campos; podemos llegar a una solución que involucra cuatro tablas.
FormDefinition
,FormFieldDefinition
,FormInstances
,FormFieldValues
. El cliente realiza cambios enFormDefinition
yFormFieldDefinition
, y la aplicación web utiliza esa información para generar un formulario web HTML, en el que el visitante del sitio web (usuario final) enviará el formulario, en el que se creará una nueva fila enFormInstances
y los valores serán guardado en la tablaFormFieldValues
.filas en
FormDefinition
define la forma, es decirform definition ID = 2, form title = 'Car Registration Form'
. Filas enFormFieldDefinition
define campos de un formulario enFormDefinition
, es decir,field definition ID = 7, field label = 'Car Model', field type = 'varchar(50)'
. Filas enFormInstance
es una instancia de cada formulario completado por un usuario, es decir,definition id = 2, date_entered = '2008-09-24'
. Y las filas enFormFieldValues
son entradas del usuario, es decir,field definition = 7, value = 'Tiburon'
.Desafortunadamente, esto significa la columna de valor en
FormFieldValues
debe ser un tipo char del mayor tamaño posible que su cliente podría especificar en un formulario web ... y cuando cambian las definiciones de formulario, la gestión de los datos de edad se convierte en dudoso. Pero las entradas de usuario son consultables (escribí un quick query que enumera las entradas de usuario con un ID de formulario, que es similar a another pivot question).Una alternativa al uso de cuatro tablas sería serializar las definiciones de formulario y las entradas de formulario del usuario en XML (o YAML o algo similar) y almacenar eso como texto. Lo bueno es que los formularios son legibles por humanos en la base de datos. La desventaja es que habrá más sobrecarga de aplicaciones al analizar XML, y la base de datos se vuelve mucho menos consultable desde un punto de vista SQL.
Mi verdadera pregunta es, ¿cómo se llama este modelo de base de datos? (Así que puedo buscar en Google este problema.) Pero me gustaría conformarme con una respuesta a: ¿cuál es la mejor implementación o hay mejores implementaciones (o tan buenas) por ahí?
Estoy interesado en las mejores prácticas para algo como esto también. Además de agregar datos personalizados (meta) a formularios/registros existentes. He encontrado mis propias soluciones en el pasado, pero es agradable escuchar lo que otros han hecho. – mattlant