Utilizamos 3 tablas para esto por tabla donde tenemos que admitir campos definidos por el usuario. Así, por ejemplo, si se quiere aplicar esto a su mesa de encuesta, se podría crear:
SURVEY_ATTRIBUTE
- SurveyAttributeId
- SurveyAttributeName
- SurveyAttributeType
SURVEY_ATTRIBUTE_CHOICE
- SurveyAttributeChoiceId
- SurveyAttributeChoice
- SurveyAttributeId
SURVEY_ATTRIBUTE_VALUE
- SurveyAttributeValueId
- SurveyId
- SurveyAttributeValue
El SURVEY_ATTRIBUTE tabla almacena un registro por atributo personalizado. La tabla SURVEY_ATTRIBUTE_VALUE almacena los atributos que están realmente asignados a las encuestas. Entonces, si un atributo no se aplica a un servey, nada se almacena. La tabla SURVEY_ATTRIBUTE_CHOICE almacena todas las opciones permitidas para los atributos de tipo 'LIST'.
El campo SurveyAttributeType en la tabla SURVEY_ATTRIBUTE se utiliza para describir el tipo del atributo. Solo usamos una pequeña cantidad de tipos permitidos como CHAR, DATE, NUMBER, LIST. Dependiendo de ese valor, nuestra aplicación sabe qué hacer con el valor almacenado en el campo SurveyAttributeValue. Por supuesto, puede formalizar esto más para permitir un rango más amplio, especificar las longitudes máximas de campo, etc., todo depende del nivel de libertad que desee darle a su usuario final. Tratamos de mantenerlo lo más simple posible porque nuestra audiencia objetivo no son los administradores de la base de datos sino los usuarios finales, por lo general no se preocupan por las longitudes de campo y demás.
También puede optar por omitir la tabla SURVEY_ATTRIBUTE_CHOICE y almacenar los valores permitidos en una cadena XML en el campo SURVEY_ATTRIBUTE. Eso dependerá de la forma en que va a implementar en su aplicación.
'Se espera que una búsqueda rápida para' 'modelo EAV' 'incluya la recomendación de que se debe evitar a menos que no haya alternativa, es muy flexible, pero no escala bien y puede ser difícil de consultar. Aquí hay un enlace a un estudio de caso: http://www.simple-talk.com/opinion/opinion-pieces/bad-carma/ –