Pregunta

Siento que este es probablemente un problema común, pero de mi búsqueda en Google no puedo encontrar una solución tan específica para mi problema.

Tengo una lista de Organizaciones (tabla) en mi base de datos y necesito poder ejecutar consultas basadas en su jerarquía. Por ejemplo, si consulta la Organización más alta, me gustaría devolver los Id de todas las Organizaciones enumeradas en esa Organización. Además, si consulto un tipo de organización de rango medio, solo quiero los ID de la organización que figuran en esa Organización.

¿Cuál es la mejor manera de a) configurar el esquema de la base de datos yb) consultar? Solo quiero enviar el ID de la organización superior y luego obtener los ID de esa organización.

Creo que tiene sentido, pero puedo aclarar si es necesario.

¿Fue útil?

Solución

Una forma simple es almacenar la filiación de la organización en un campo de texto, como:

VENTAS-EUROPA-NORTE

Para buscar todas las organizaciones de ventas, puede consultar SALES-%. Para cada organización de ventas europea, consulte SALES-EUROPE-%.

Si cambia el nombre de una organización, tenga cuidado de actualizar también sus organizaciones secundarias.

Esto lo mantiene simple, sin recurrencia, a costa de cierta flexibilidad.

Otros consejos

Como prometí en mi comentario, desenterré un artículo sobre cómo almacenar jerarquías en una base de datos que permite la recuperación en tiempo constante de subárboles arbitrarios. Creo que satisfará sus necesidades mucho mejor que la respuesta actualmente marcada como aceptada, tanto en facilidad de uso como en velocidad de acceso. Podría jurar que vi este mismo concepto en Wikipedia originalmente, pero no puedo encontrarlo ahora. Aparentemente se llama un `` recorrido de árbol de preorden modificado ''. La esencia de esto es que numeras cada nodo en el árbol dos veces, mientras haces un recorrido en profundidad primero, una vez hacia abajo y otra vez hacia arriba (es decir, cuando desenrollas la pila, en una implementación recursiva) . Esto significa que los hijos de un nodo dado tienen todos sus números entre los dos números de ese nodo. Agregue un índice en esas columnas y obtendrá búsquedas muy rápidas. Estoy seguro de que es una explicación terrible, así que lea el artículo, que profundiza más e incluye imágenes.

La manera fácil es tener una columna ParentID, que es una clave foránea para la columna ID en la misma tabla, NULL para los nodos raíz. Pero este método tiene algunos inconvenientes.

Los conjuntos anidados son una forma eficiente de almacenar árboles en una base de datos relacional.

Puede hacer que una organización tenga una identificación PK y una referencia FK principal a la identificación. Luego, para la consulta, use (si el backend de su base de datos las admite) consultas recursivas, también conocidas como Expresiones de tabla comunes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top