que esquema entre diferencia datos create database-design hierarchical-data user-defined

database design - esquema - ¿Cuál es la mejor manera de modelar las relaciones jerárquicas definidas por el usuario en una base de datos?



que es un esquema en base de datos (3)

Debe implementar tres conceptos:

  • los "tipos de unidades" y sus asociaciones permitidas
  • La jerarquía
  • las unidades reales

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

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

Puede modelar la jerarquía como tabla de autorreferencia:

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

Luego puede tener las instancias de su unidad en una o más tablas y hacer con ellas lo que describió.

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

La buena noticia es que solo está restringiendo los tipos principales permitidos, que se pueden aplicar fácilmente en una interfaz de usuario, por ejemplo, eligiendo el padre de una lista de todas las unidades existentes del tipo permitido.

Básicamente, quiero que el usuario pueda definir un modelo jerárquico, pero luego debo permitir que el usuario almacene datos dentro de su modelo definido. ¿Esto tiene sentido? Por lo tanto, los usuarios podrán crear nuevos "tipos de unidades" para organizarlos de forma jerárquica y decidir cómo se pueden organizar las unidades de estos tipos. Un ejemplo simple: en mi interfaz hipotética, un usuario crea tres tipos de unidades, tronco, rama y hoja. El usuario luego 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 crear instancias de estos tipos de unidades (como unidades) y puede organizarlos de acuerdo con las reglas definidas en su modelo ... ¿hay una buena forma de hacerlo en la base de datos?


Esta es una pregunta extremadamente amplia, pero esto puede apuntarle en la dirección correcta. Tenga en cuenta que solo podrá almacenar las reglas de relación en la base de datos. Hacerlos valer dependerá de tu código de cliente. Prueba esto por tamaño ...

unit: unit id, name, unit relationship: unit id, foreign unit id

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

unit id de la unidad se relaciona con la unidad que está describiendo. foreign unit id debe ser anulable.

Una unit sin registros de relación solo puede existir en la raíz de la jerarquía. Una unit con un foreign unit id null foreign unit id puede tener cualquier otra unit como su principal. De lo contrario, una unit debe tener otra unit como su principal, y su tipo debe ser uno de los definidos en sus registros de relación.

En cuanto a almacenar las instancias, eso debería ser sencillo ...

instance: instance id, unit id, parent instance_id

Estoy seguro de que habría otros campos que necesitarías (nombre, por ejemplo), pero supongo que entiendes.


Estoy trabajando en un problema similar, aunque necesito admitir varias jerarquías (un conjunto de elementos secundarios, múltiples vistas jerárquicas). Encontré útil los "Árboles y jerarquías en SQL para Smarties" de Joe Celko (ISBN: 1558609202). Todavía estoy trabajando en el problema, pero aparece con tanta frecuencia cuando hablo de este tema que me pareció apropiado mencionarlo.