2009-06-07 20 views
5

Necesito permitir que los usuarios agreguen nuevos campos a un registro, p. si hay un registro de contacto, un usuario puede querer agregar un campo numérico "SSN" y un campo de fecha/calendario "Fecha de nacimiento". Lo harían a través de la interfaz de usuario, por supuesto.¿Cómo crearía y almacenaría campos personalizados definidos por el usuario en una base de datos SQL?

Esos campos deberían estar disponibles para la entrada de todos los registros de contacto.

Considerando que mi aplicación se ejecuta simultáneamente para muchos usuarios (no una implementación de una compañía, etc.) y teóricamente todos podrían agregar sus propios campos personalizados, ¿cuál sería la mejor práctica para almacenar esta información en una base de datos, especialmente cuando necesita ser buscable?

+1

Francamente, creo que' Estamos pidiendo problemas preguntando a los usuarios individuales sus requisitos sobre la marcha. Por ejemplo, si tienes 10 personas que necesitan la misma información pero la nombran de 10 formas diferentes, vas a tener mucha complejidad con muy poco beneficio. Puede ser mejor reunirse con los usuarios y llegar a un consenso en lugar de hacer cosas ad-hoc. –

+0

Estás 100% en lo cierto. Tengo que cargar con ese requisito aunque :( – Alex

+0

Tengo lograr esto, en muchas aplicaciones, Al implementar este tipo de requisito, es muy difícil, pero esto le dará más flexibilidad para el usuario para añadir campos personalizados –

Respuesta

1

Nos añadir casi en nuestras todas las aplicaciones/productos de apoyo atributo/campo adicional para determinada flexibilidad para el usuario
Al igual que tenemos una categoría de producto, en la categoría, el cliente puede definir atributo adicional de cualquier producto
lo que estamos haciendo en el nivel de base de datos es:
La tabla de categorías tiene alguna columna adicional como: Text1Att, Text2Att ... para soporte de valores de texto, Num1Att, Num2Att ... para soporte de valor numérico, Date1Att, Date2Att ... para soporte de valores de fecha y hora, ID1Att , ID2Att ... soporte para identificación de otra tabla como puede agregar menú desplegable, listbox, ...
aquí toda la columna tiene tipo de datos String.
lo almacenamos aquí es

almacenaremos información meta aquí, como por Text1Att meta es
SSN; cuadro de texto; 50; cierto, falso; Nulo;
Título del campo; Tipo de control; Longitud máxima; campo Necesario; es necesaria la validación personalizada; Mensaje de Validación personalizada;
lugar de nacimiento; cuadro de texto; 100; verdadero; verdadero; Valor no válido;
Lo mismo para el campo numérico ...
para la fecha meta-información se parecerá a la fecha
nacimiento; control de calendario; cierto, cierto; fecha no válida;
Título del campo; Control de calendario o puede ser otro; es obligatorio; es Validación personalizada; Mensaje de Validación personalizada;


Lo que están haciendo en la tabla producto es añadir mismo número de columna de tipo de datos y tienen text1Att, .. es VARCHAR, num1Att tener numérico, date1Att tiene fecha y hora, ID1Att tiene int

Lo que estamos haciendo lateral interfaz gráfica de usuario es: En la página de definición de categorías, agregue estos atributos y compile metainformación en tiempo de ejecución y almacene en la tabla de categorías
Por otro lado, cuando definimos producto en categoría, la metainformación será leída y atravesada de la tabla de categorías y poblada en la página de definición de producto como otros campos .


si necesitas más ayuda, se lo puede proporcionar imágenes de modo que usted comprender mejor cómo se puede hacer esto.
que son experiencia y analizar, esto es mucho más flexible de enfoque

+1

A pesar de que la solución parece "feo", que es mucho mejor en términos de capacidad de búsqueda. Hacerlo de la manera descrita en la respuesta aceptada hace que sea muy costoso (en términos de rendimiento) buscar muchos campos. –

+0

Sí, Images/& Pseudocode sería realmente útil. ¡Gracias! – Alex

10

Tienen una tabla que almacena los nombres y tipos de campos.

field_ID  INT 
field_name VARCHAR 
field_type ENUM('int','float','text','richtext') 

tiene una tabla que almacena un enlace a una entrada en la tabla de registros, un enlace a una entrada en la tabla de campos, y el valor del campo.

fieldvalue_fieldID INT 
fieldvalue_recordID INT 
fieldvalue_value  BLOB 

Por lo que es investigable es otro desafío - que se necesita para grabar cualquier contenido de búsqueda de ese fieldvalue_value y el índice de eso. Esto sería específico de la base de datos. En MySQL puede hacer que ese valor sea TEXTO y agregarle un índice MySQL FULLTEXT.

+0

Dadas sus necesidades, esto es probablemente la forma más sencilla de hacer las cosas. Buena suerte. –

+1

Ah sí, el patrón anti-EAV. –

+1

Más info [aquí] (http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2 % 80% 93value_model) y [aquí] (http://programmers.stackexchange.com/questions/93124/eav-is-it-really-bad-in-all-scenarios) – thomasrutter

1

Sus mejores opciones son:

  1. Permitir al usuario modificar su propio esquema de base, tal vez mediante la carga de un módulo o ejecutar un script.

  2. utilizar un campo XML, y una base de datos que soporta índices y consulta sobre el contenido de ese campo

Estos son recomendados por Martin Fowler, aquí: http://martinfowler.com/bliki/UserDefinedField.html

Cuestiones relacionadas