Estoy trabajando en un diseño de base de datos para la jerarquía de grupos utilizada como base de un sistema más grande. Cada grupo puede contener otros grupos, y también 'dispositivos' como objetos de hoja (nada pasa debajo del dispositivo).Esquema de base de datos para grupos jerárquicos
La base de datos que se utiliza es MS SQL 2005. (Aunque trabajar en MS SQL 2000 sería una ventaja, una solución que requiere MS SQL 2008 lamentablemente no es posible en este momento).
Existen diferentes tipos de grupos, que deben ser dinámicos y definibles en tiempo de ejecución por los usuarios. Por ejemplo, los tipos de grupo pueden ser "cliente", "cuenta", "ciudad" o "edificio", "piso", y cada tipo va a tener un conjunto diferente de atributos, definibles por el usuario. También se aplicarán reglas comerciales, por ejemplo, un "piso" solo puede estar contenido debajo de un grupo "de construcción", y nuevamente, estos son definibles en tiempo de ejecución.
Gran parte de la funcionalidad de la aplicación proviene de ejecutar informes basados en estos grupos, por lo que debe haber una forma relativamente rápida de obtener una lista de todos los dispositivos contenidos en un determinado grupo (y todos los subgrupos).
El almacenamiento de grupos usando la técnica modified pre-order tree traversal tiene la ventaja de ser rápido, pero la desventaja es que es bastante complejo y frágil: si los usuarios/aplicaciones externos modifican la base de datos, existe la posibilidad de que se rompa por completo. También estamos implementando una capa ORM, y este método parece complicar el uso de las relaciones en la mayoría de las bibliotecas ORM.
El uso de common table expressions y una relación "estándar" de id/parentid groups parecen ser una forma poderosa de evitar ejecutar múltiples consultas recursivas. ¿Hay algún inconveniente en este método?
En cuanto a los atributos, ¿cuál es la mejor manera de almacenarlos? ¿Una mesa larga y estrecha que se relaciona con el grupo? ¿Debería almacenarse un atributo común, como "nombre" en una tabla de grupos, en lugar de la tabla de atributos (muchas veces, el nombre será todo lo que se requiere para mostrar)?
¿Habrá problemas de rendimiento con este método (supongamos un promedio alto de 2000 grupos con un promedio de 6 atributos cada uno y un promedio de 10 usuarios simultáneos en un hardware razonable, por ejemplo, quad-core Xeon 2 Ghz, 4GB ram, descontando cualquier otro proceso)?
Siéntase libre de sugerir un esquema completamente diferente al que he descrito aquí. Solo estaba tratando de ilustrar los problemas que me preocupan.
Cuando al delinear la carga esperada, mencionó la cantidad de grupos y atributos, pero no la cantidad de elementos esperados en cada grupo. –
¿Qué tasa de transacción tienes que mantener? –