Agradecería algunas opiniones sobre una preocupación que tengo.Pregunta de diseño de base de datos
Tengo una tabla [usuario] en mi base de datos, con las cosas básicas que cabría esperar, como nombre de usuario, contraseña, etc ...
Esta aplicación requiere que el seguimiento de un gran número de atributos para cada usuario. Tanto es así, que probablemente me queden sin columnas (espacio de almacenamiento de fila).
Tengo la tentación de agregar una tabla UserProperties con las columnas UserID, PropertyKey y PropertyValue. Este enfoque se ajusta bien a los requisitos.
Mi preocupación es que si cada usuario tiene decir 100 propiedades, cuando la base de datos tiene un millón de usuarios en ella, tendremos 100,000,000 filas de propiedades.
Creo que con un índice agrupado en el UserID, ese acceso seguirá gritando rápido, y realmente está almacenando la misma cantidad de datos que con el enfoque de megacolumnas.
¿Alguna idea o idea sobre las preocupaciones de rendimiento? Ideas para un mejor diseño de DB?
Gracias!
ACTUALIZACIÓN:
En primer lugar, muchas gracias por todas las grandes respuestas!
He estado jugando con las posibilidades, y una cosa sigue molestándome. Necesito consultar sobre algunos de estos atributos con bastante frecuencia y, lo que es peor, estas consultas podrían incluir la búsqueda de todos los usuarios que coinciden con los criterios en hasta 10 de estos atributos al mismo tiempo.
Como resultado, me estoy inclinando ahora hacia el enfoque de megacolumnas, pero posiblemente dividiendo los datos en una (o más) tablas separadas, formando una relación de uno a uno en el ID de usuario.
Estoy usando LinqToSql, y si bien creo que las tablas con muchas columnas son poco elegantes, creo que teniendo en cuenta todos los desafíos y compensaciones, probablemente sea la correcta, pero todavía estoy ansioso por escuchar otras opiniones.
No podría estar más de acuerdo. El modelo Entidad-Relacional es poderoso una vez que lo manejas. Siento por el pobre tipo que hereda una base de datos con entidades aplanadas en pares de nombre/valor y tiene que hacer cara o cruz. –