¿Cuál es la mejor manera de modelar las relaciones jerárquicas de usuario definidos en una base de datos?
-
05-09-2019 - |
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?
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.