Estoy trabajando en un SaaS, donde cualquier inquilino puede tener varias listas de contactos, cada lista puede tener cualquier cantidad de Los contactos de los campos personalizados de esta lista pueden almacenar y cualquier cantidad de grupos que puedan incluir los contactos de la lista (los grupos se utilizan para segmentar los contactos de la lista). Cada contacto tiene uno de los campos obligatorios: dirección_de_email y cualquier cantidad de campos definidos por el usuario que estén definidos para la lista en la que se encuentra, como mencioné anteriormente. Debemos ser capaces de encontrar contactos de las listas basadas en los grupos en los que se encuentran y los valores de los valores definidos por el usuario. Debemos provisionar hasta 30 campos definidos por el usuario. ahora veo tres formas de resolver este problema:Cómo implementar campos definidos por el usuario y agrupamiento para la aplicación multi-tenant: EAV, patrón de tablas fijas, NoSQL
Usando tipo de EAV (tratamos de hacerlo de esta manera), pero parece bastante complejo. Tenemos una tabla de listas (listas de inquilinos), tablas relacionadas custom_fields, una tabla relacionada de suscriptores que almacenan email_addreses de suscriptores de la lista, tabla subscribers_custom_data que está relacionada con los suscriptores y custom_fields tablas (valores almacenados de los campos personalizados de los suscriptores).
Patrón de tablas de campo. Las descripciones de esto están aquí http://blog.springsource.com/arjen/archives/2008/01/24/storing-custom-fields-in-the-database/. En este caso, usaríamos un campo relacionado con campos personalizados, que almacenaría en columnas todos los campos personalizados, por ejemplo, 30 columnas para almacenar los valores de cada campo personalizado y una tabla que guardara la asignación del nombre y nombre de la columna del usuario campo definido Parece complejo también. Tendríamos que tener al menos 30 índices al menos para buscar por los valores de los campos personalizados, también hay otros problemas,
Para usar algún tipo de base de datos NoSQL al menos para almacenar campos definidos por el usuario y quizás grupos de la lista. ¿Cree que estas bases de datos pueden ser útiles aquí y, en caso afirmativo, cómo diseñar para almacenar campos y grupos personalizados? Intento ver diferentes tipos de NoSQL, por ejemplo, documento orientado como MongoDb, pero de inmediato no veo cómo puede ayudar a resolver este problema. Aquí podemos almacenar atributos arbitrarios, pero para buscar los valores de los campos personalizados necesitamos indexarlos con anticipación, así que tenemos que saber qué campos personalizados tendremos.
Gracias por cualquier información al respecto.
Con mi uso, podré conocer los campos indexables (pero solo en tiempo de ejecución). Los inquilinos pueden definir su propio conjunto de campos (seleccionando entre un conjunto de predefinidos y/o agregando sus propios descriptores de campo). Entonces, en ese momento agregan un nuevo campo, debería poder disparar una creación de índice (dispersa). Entonces, para este escenario en particular, ¿sería mejor una tienda orientada a documentos? –
Sí, una tienda de documentos podría funcionar en esta situación. Ver mi edición arriba. –
En cuanto a usar blob, no está claro cómo eliminar/editar campos personalizados. Por ejemplo, el usuario puede eliminar un campo en su contenedor y el campo debe eliminarse en todas las entidades de este contenedor. ¿Puede decirme cómo eliminar/editar campos personalizados y reflejarlos en todas las entidades? Además de, por ejemplo, agregar/eliminar campos personalizados mediante el uso, debe hacerlo disponible usando y filtrando. En caso de que se elimine la cascada de EAV, El tamaño de un campo es limitado y es difícil predecir cuál será el límite de tamaño del blob. Pero es difícil decir si nosql puede brindar algún beneficio. – Oleg