2010-10-11 7 views
8

He intentado responder a un complejo problema de estructura de datos Mysql para campos personalizados para una aplicación en línea. Soy bastante nuevo en Mysql, así que cualquier comentario es apreciado.¿Matriz, EAV, LOB serializado para campos personalizados?

La base de datos actual es una base de datos relacional y cada usuario del servicio compartirá la misma base de datos y tablas.

Aquí hay un ejemplo de lo que intento hacer.

Digamos que estoy tratando de crear una lista. Esta lista puede contener hasta 30 campos personalizados. El usuario puede elegir entre 12 elementos únicos y cada elemento puede tener hasta 15 atributos definidos por el usuario.

Cada lista puede ser única dentro de una cuenta y también entre cuentas. Las cuentas pueden tener numerosas listas y cada lista podría tener diferentes cantidades de elementos, así como diferentes atributos por elemento.

Un elemento puede ser muchas cosas, por ejemplo: opción múltiple, botón de radio, campo de teléfono, dirección, números de texto de una sola línea, texto multilínea, etc.

Un ejemplo de atributos para una selección múltiple (casilla) el elemento podría ser: rojo, verde, azul, naranja, blanco, negro

Un ejemplo de elemento de texto de una sola línea podría ser: Nombre del campo de entrada.

Cada elemento también debe tener un campo de título y un campo de etiqueta definidos por el usuario que se pueden referenciar y utilizar en otras características de la aplicación.

La segmentación es muy importante también. Un usuario debe ser capaz de segmentar una lista en función de cualquier elemento. Por ejemplo, un usuario puede querer segmentar la lista "ABC" en base a todos los registros donde "rojo" está presente en el elemento de opción múltiple n. ° 1 (puede tener más de un elemento de opción múltiple para una lista).

En este ejemplo, supongo que las matrices, EAV, Serialized LOB funcionarían bien. Sin embargo, no estoy seguro de cuál sería la mejor estructura para mis necesidades en mi escala.

En realidad, lo más probable es que haya hasta 50,000 registros por lista y hay una posibilidad real de más de 20,000 cuentas, cada una con numerosas listas. Por lo tanto, estoy buscando la estructura más eficiente y flexible.

Para complicar aún más las cosas, también necesito asegurar una forma eficiente de agregar/eliminar elementos a cualquier lista en particular en un momento dado. Por ejemplo, si un usuario crea una lista con el número máximo permitido de campos personalizados (30) y luego tres meses después decide que quiere eliminar un campo, necesito una forma de encontrar esa lista y todos los valores asociados para ese campo personalizado y luego borre todos los valores, el tipo de elemento y sus atributos. El usuario podría agregar un nuevo elemento a esta lista.

He revisado muchas de las publicaciones de EAV en este sitio, así como este http://www.martinfowler.com/eaaCatalog/serializedLOB.html No parece que EAV sería muy eficiente para mis necesidades debido a las desventajas de recuperación de datos.

También me preguntaba qué tan bien funcionaría una matriz multidimensional a esta escala. Creo que wordpress usa esto para sus campos personalizados.

Cualquier entrada sería muy apreciada en cuanto a la mejor manera de estructurar la base de datos para esta situación. ¡Gracias!

+0

También estoy enfrentando el mismo desafío: ¿con qué solución llegaste? Estaría muy interesado en tus experiencias. – philwilks

Respuesta

0

Puede usar codificación y codificación de json (supongo que está utilizando PHP) para almacenar la información de entrada en una tabla con una columna para almacenar el usuario y otra para almacenar esta información como texto. Las respuestas deben almacenarse en otra tabla (con un FK para usar CASCADE ON DELETE).

Si puede especificar el tamaño máximo de la especificación de entrada, use un campo varchar.

Esto no puede ser el mejor resultado (necesita algunas pruebas de perfil para asegurarse de que sea lo suficientemente robusto), pero puede ser seguro.

1

Usted puede leer acerca de cómo implementa FriendFeed campos personalizados: http://bret.appspot.com/entry/how-friendfeed-uses-mysql

utilizan una combinación de Serializado LOB, con mesas adicionales que contienen índices invertidos. No necesita una tabla adicional para cada atributo posible en su LOB, solo los que desea buscar con ayuda de un índice.

+0

http://bret.appspot.com/entry/how-friendfeed-uses-mysql no se encuentra –

+0

@wangyiran, no es sorprendente, ese blog tiene más de 6 años. Describo la misma técnica de indexación invertida en mi presentación aquí: http://www.slideshare.net/billkarwin/extensible-data-modeling. –

Cuestiones relacionadas