¿Cuál es la mejor manera de modelar las relaciones jerárquicas de usuario definidos en una base de datos?

StackOverflow https://stackoverflow.com/questions/728137

Pregunta

En esencia, quiero que el usuario sea capaz de definir un modelo jerárquico, pero luego tengo que permitirá al usuario almacenar datos dentro de su modelo definido. ¿Esto tiene sentido? Por lo que los usuarios serán capaces de crear nuevos "tipos de unidad" para ser organizados de manera jerárquica y decidir cómo se permiten unidades de este tipo que se organicen. Un ejemplo sencillo: en mi interfaz hipotética un usuario crea tres tipos de unidades, tronco, ramas y hojas. Entonces, el usuario define las relaciones entre ellos. Una hoja puede existir en cualquier punto de la jerarquía, una rama debe tener un tronco como padre. El usuario puede entonces crea instancias de estos tipos de unidades (como unidades) y puede organizarlos según las reglas definidas en su modelo ... ¿hay una buena manera de hacer esto en la base de datos?

¿Fue útil?

Solución

Esta es una pregunta muy amplia, pero esto le puede apuntar en la dirección correcta. En cuenta que sólo vas a ser capaz de almacenar las reglas de las relaciones en la base de datos. Hacerlas cumplir será hasta su código de cliente. Pruebe esto en el tamaño ..

unit:
    unit id,
    name,

unit relationship:
    unit id,
    foreign unit id

A continuación, puede utilizar la tabla de relaciones de unidad de la siguiente manera ..

unit id se refiere a la unidad se está describiendo. foreign unit id debe ser anulable.

A unit sin registros de relación sólo puede existir en la raíz de la jerarquía. Un unit con un null foreign unit id puede tener cualquier otra unit como su padre. De lo contrario, un unit debe tener otro unit como su padre, y es el tipo debe ser uno de los definidos en sus registros de relación.

Como para el almacenamiento de los mismos casos, que debería ser sencillo ..

instance:
    instance id,
    unit id,
    parent instance_id

Estoy seguro de que habría otros campos que usted necesitaría (nombre, por ejemplo), pero supongo que consigue la deriva.

Otros consejos

Es necesario implementar tres conceptos:

  • los "tipos de unidades" y sus asociaciones permitidos
  • la jerarquía
  • las unidades reales

Estos conceptos pueden coexistir más o menos independiente en el modelo, pero trabajar juntos.

create table unittype
(
    id int;
    name varchar(20);
)

create table unitrelationship
(
    id int;
    parent_id int;
)

Se puede modelar la jerarquía como tabla de referencia a sí misma:

create table hierarchy
(
    id int;
    parent_id int;
    unit_type_id int;
    unit_id int;
)

A continuación, puede tener sus instancias unitarias en una o más tablas y hacer con ellas lo que usted describe.

create table unit
{
    id int;
    ....
}

La buena noticia es que se están limitando únicamente los tipos de padres permitidos, los cuales pueden ser aplicadas fácilmente en una interfaz de usuario, por ejemplo, al recoger el padre de una lista de todas las unidades existentes del tipo permitido.

Estoy trabajando en un problema similar, aunque tengo que admitir varias jerarquías (un juego de niños, múltiples vistas jerárquicas). He encontrado Joe Celko "Árboles y jerarquías en SQL para Smarties" (ISBN: 1558609202) útil. Todavía estoy trabajando en el problema pero viene tan a menudo cuando se habla de este tema que parecía apropiado mencionar.

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