Bom dia pessoal.
Estou começando um novo projeto que tem um requisito desafiador: custom fields (ou campos definidos pelo usuário).
Basicamente, o usuário poderá (através de API) registrar eventos, com propriedades definidas por ele e depois gerar relatórios e gráficos em um interface web. Pois bem, vem a questão: como armazenar essas propriedades, visto que, é impossível saber de antemão qual são as propriedades e os tipos das mesmas. Algumas propriedades são fixas para controle interno da aplicação.
A idéia é ter muitos usuários e consequentemente muitas “tabelas” de eventos totalmente distintas.
Encontrei diversas formas:
- Usar um banco NoSQL de documento (MongoDB por exemplo): simplesmente inserir os documentos (as propriedades fixas + as definidas pelos usuários) em uma única coleção de documentos.
- Usar um banco NoSQL de documento (MongoDB por exemplo): inserir os dados gerais em uma coleção e ter uma coleção para cada “tabela” de eventos definida pelo usuário. Dessa forma, faria sentido usar uma solução dessas pela facilidade de adicionar novas propriedades.
- BD relacional, uma tabela no banco para cada “tabela” definida pelo usuário. Similar à opção 2.
- BD relacional, com uma tabela com dados gerais e com uma tabela chave / valor (/tipo?) para as propriedades. Seriam então (basicamente) duas tabelas compartilhadas entre todos os usuários.
- NoSQL ou BD relacional: um banco por usuário.
- BD relacional: uma tabela com colunas extras (string1, string2, string3, stringN, inteiro1, inteiro2, inteiroN, etc)
Alguns requisitos: os usuários irão realizar consultas, 99% do tempo, de agregação, ou seja, somando, definindo máximos, desvio padrão, etc, podendo ser filtradas todas por todas as propriedades definidas pelo usuário. Outra questão é o volume de dados, portanto a performance é importante. Meu ideal é agregar em torno de 3Mi de registros em menos de 1 segundo. Sei que para isto é necessário mais que deixar tudo na mão do banco, mas o mesmo é um componente crucial.
Gostaria da opinião de vocês que já utilizaram uma ou mais dessas alternativas que listei, e caso tenham utilizado outra solução, será bem vinda.
Muito obrigado.