Supertipo / Subtipo que decide entre categorías: disyunción completa o superposición incompleta

11

Estoy construyendo una base de datos de inventario que almacena hardware de TI, como computadoras de escritorio, computadoras portátiles, conmutadores, enrutadores, teléfonos móviles, etc. Estoy usando un patrón de supertipo / subtipo, donde todos los dispositivos se almacenan en una sola tabla e información específica se pone en tablas de subtipo. Mi dilema es elegir entre los siguientes dos diseños:

ingrese la descripción de la imagen aquí

En el diagrama superior, todos los dispositivos comparten subtipos comunes. Por ejemplo, las computadoras de escritorio y las computadoras portátiles tendrían registros en las siguientes tablas: Dispositivo, Dispositivo de red. Un conmutador tendría registros en: Dispositivo, Dispositivo de red. Un enrutador tendría registros en: Dispositivo, Dispositivo de red, WANDevice. Cualquier dispositivo para el que rastreemos la ubicación tendrá un registro en Ubicación. Algunos pros y contras que pensé para esta configuración:

  • Pro: SELECCIONAR registros basados ​​en un campo común, como Hostname o LocationID es más fácil.
  • Pro: sin campos nulos.
  • Con: las tablas que deben incluirse en las operaciones CRUD para un dispositivo en particular no son obvias y pueden confundir futuros DBA.

En el diagrama inferior, todos los dispositivos tienen su propio subtipo (hay más clases de dispositivos que no se muestran aquí). En esta situación, es obvio desde qué tablas se insertan o seleccionan los registros. Las computadoras de escritorio y las computadoras portátiles van en Computadora, etc. Algunas ventajas y desventajas que pensé para esta configuración:

  • Pro: es inmediatamente obvio qué tablas usar para operaciones CRUD para subtipos.
  • Pro: solo tiene que usar una tabla para operaciones CRUD.
  • Con: la SELECCIÓN de registros basada en campos de subtipo comunes requiere que todas las tablas se combinen, por ejemplo, buscar por Nombre de host o LocationID.

En ambas situaciones, el campo ClassDiscriminator se coloca en tablas de subtipos para usar con una restricción CHECK para controlar qué tipos se pueden insertar.

¿Hay alguna recomendación para qué diseño es mejor, o es completamente una cuestión de opinión y depende del propósito previsto de la base de datos?

EDITAR: Una pregunta específica que tengo sobre la naturaleza superpuesta de la tabla "NetworkDevice". Esta tabla está destinada a contener información de red para cualquier dispositivo con un nombre de host y / o dirección IP, ya sea una computadora, conmutador o enrutador. ¿Es la naturaleza superpuesta de esta tabla algo que podría causar problemas, o está bien implementarla de esta manera?

Gracias de antemano por cualquier aportación proporcionada. Por favor pregunte si se necesita información adicional.

TheSecretSquad
fuente
Ver dba.stackexchange.com/questions/15199/… para una pregunta similar que fue respondida
Stephen Senkomago Musoke

Respuestas:

15

La implementación física del subtipo en una base de datos es un problema complejo. A menos que tenga una situación en la que ofrezca ventajas convincentes (consulte a continuación uno o dos ejemplos), agrega complejidad a la implementación y proporciona un valor relativamente pequeño.

Habiendo hecho esto con un subtipo realmente complejo (solicitudes y sentencias en un sistema de gestión de casos judiciales, estructuras de contrato de seguro comercial de riesgo combinado dispares) Creo que tengo algunas observaciones al respecto. Algunos casos importantes de esquina son:

  • Si el número total de campos de la base de datos en los subtipos es relativamente bajo (digamos: menos de 100) o hay una coincidencia significativa entre los subtipos, entonces dividir los subtipos en tablas físicas separadas probablemente sea de poco valor. Agregará una sobrecarga significativa a las consultas y búsquedas de informes. En la mayoría de los casos, es mejor tener una sola tabla y administrar su subtipo dentro de la aplicación. (Probablemente el más cercano a tu problema)

  • Si su subtipo es muy disjunto, y diferentes subtipos tienen estructuras de datos dependientes del tipo que cuelgan de ellas (es decir, tablas secundarias o estructuras más complejas), entonces las tablas de subtipos tienen sentido. En este caso, cada subtipo probablemente tenga relativamente pocos elementos comunes dentro de la aplicación (es decir, probablemente haya un subsistema completo dentro de la aplicación dedicado a ese subtipo). La mayoría de los informes y consultas probablemente ocurrirán dentro de un subtipo dado, con consultas cruzadas principalmente restringidas a un puñado de campos comunes. (Sistema de gestión de casos judiciales)

  • Si tiene una gran cantidad de subtipos con atributos dispares y / o un requisito para hacer esto configurable, entonces una estructura genérica y metadatos complementarios pueden ser más apropiados. Vea esta publicación SO para ver un resumen de algunos enfoques posibles. (Sistema de administración de pólizas de seguros)

  • Si tiene un número muy grande de campos con poca similitud entre sus subtipos y pocos requisitos para consultar en tablas de subtipos (es decir, nada en el camino de las uniones externas de múltiples vías contra sus tablas de subtipos), entonces sub- las tablas de tipos pueden ayudar a gestionar la expansión de la columna. (Versión patológicamente compleja de su problema)

  • Es posible que algunos mapeadores de O / R solo admitan un enfoque particular para administrar subclases.

En la mayoría de los casos, las tablas de subtipos físicos en un esquema de base de datos son un poco una solución en busca de un problema, ya que potencialmente tienen efectos secundarios indeseables.

En su caso, supongo que tiene un número relativamente modesto de subtipos y un número manejable de atributos. Su diagrama y pregunta no indican ninguna intención de colgar las tablas secundarias de los registros. Le sugiero que considere ir con la primera opción sugerida anteriormente y mantener una tabla y administrar el subtipo dentro de su aplicación.

Preocupado por TunbridgeWells
fuente
Gracias por tu respuesta detallada. Originalmente quería mantener todo en una tabla, pero ciertos campos para dispositivos no se aplican a otros y terminaría con un montón de campos nulos. Por ejemplo, todos los registros de inventario tendrían campos para el tipo de circuito y el proveedor de servicios que son específicos de los enrutadores. Todos los registros también tendrían un campo de número de teléfono que no tiene sentido a menos que el dispositivo sea un teléfono. ¿Alguna sugerencia sobre cómo lidiar con esto?
TheSecretSquad
2
@reallythecrash: la sobrecarga para los campos anulables es de aproximadamente un byte por campo, por lo que, en términos de uso de recursos, es mucho menos sobrecarga que unirse a tablas de subclase. Realmente el único inconveniente es que la tabla se verá un poco desordenada con muchos nulos.
Preocupado por
3
@reallythecrash: si realmente desea (y su DBMS lo admite, no ha especificado lo que está utilizando), puede configurar restricciones de verificación basadas en el discriminador de tipos que imponen nulo / no nulo en los campos apropiados para el clase.
Preocupado por
3

Considere primero desarrollar un modelo de datos lógico sólido utilizando las reglas de jerarquía de clasificación de modelado de datos que se encuentran en Enterprise Model Patterns , un libro de David Hay. Al crear una jerarquía de clasificación, cada aparición (fila) debe ser de un solo subtipo. Esto significa que los subtipos son mutuamente excluyentes. La clasificación debe basarse en una característica única, fundamental e inmutable. El uso de esta regla básica proporcionará mucha claridad a su modelo. En el modelo que tiene, la característica única para clasificar es el propósito del dispositivo: un teléfono, un conmutador de red, una computadora, un enrutador, etc. Cada dispositivo debe ser de uno, y solo uno, de estos tipos. Entonces, por ejemplo, la ubicación no sería un subtipo. Los atributos como la dirección IP pertenecen al supertipo.

Creo que encontrará que la cantidad de tipos de dispositivos será lo suficientemente grande como para garantizar un patrón EAV como se menciona en otra respuesta. El libro de David Hay al que me refiero cubre este patrón de manera muy efectiva. Sin embargo, si el número de subtipos es pequeño, puede ser una regla general para decidir implementar solo una tabla de supertipo con muchas columnas anulables, solo tablas de subtipo con columnas duplicadas, o ambas. Si cada subtipo varía mucho en sus atributos y no tiene relaciones en el nivel de supertipo, puede elegir solo tablas de subtipo. Si lo contrario es cierto, puede elegir solo tablas de supertipo. Si hay una mezcla, entonces implemente ambos.

Finalmente, tenga en cuenta que siempre puede implementar un patrón EAV como un esquema de tabla base y luego crear una capa de abstracción de vista que presente los datos a la aplicación como tablas de super y subtipos. Esto le brinda flexibilidad en la capa de almacenamiento pero capacidad de comprensión en la capa de vista de la aplicación.

Todd Everett
fuente
Gracias por la información Todd. Una de las preguntas que tengo es sobre la tabla "Dispositivo de red". Esa tabla está destinada a contener registros para cualquier dispositivo que tenga un nombre de host y una dirección IP. Esto significa que los conmutadores, las computadoras y los enrutadores tendrían sus datos relacionados con la red almacenados en esa tabla. Por lo que he estado leyendo, esto se llama un subtipo superpuesto donde la tabla de subtipos contiene datos relacionados para más de un tipo. ¿Sabes si esto es algo que debería evitarse, o si estoy bien implementando de esta manera?
TheSecretSquad
Todd, con respecto a su declaración "cree una capa de abstracción de vista que presente los datos a la aplicación ...". Suena como una buena idea. Pensé en usar las vistas exactamente como lo describiste, pero tenía algunas preguntas al respecto. Sé que está bien usar vistas para consultar y mostrar los datos en mi aplicación, pero ¿es una práctica común usar vistas para inserciones y actualizaciones? Sé que hay algunas restricciones sobre cómo deben estructurarse sus consultas (sin orden por cláusula, etc.) para insertar / actualizar mediante una vista. Si la consulta está estructurada correctamente, ¿es aconsejable usar la vista para inserciones y actualizaciones?
TheSecretSquad
En mi experiencia, los subtipos superpuestos confunden las cosas a un nivel lógico, por eso estaba recomendando volver a desarrollar un modelo lógico completo primero. Puede usar el LDM para aclarar el alcance y la comprensión antes de ocuparse del almacenamiento. En el modelo actual presentado, existe cierta confusión de comprensión entre la naturaleza fundamental de una cosa, un dispositivo, y dónde vive ese dispositivo en el espacio. Aclarar eso en el LDM. Evite también el subtipo superpuesto en la base de datos física, a menos que lo esté utilizando para dividir columnas verticalmente, en cuyo caso no está escribiendo en absoluto.
Todd Everett
Con respecto a la capa de abstracción, puede usar un activador "en lugar de" para hacer que una vista sea actualizable. Las restricciones que menciona (sin ordenar) son restricciones en la vista SQL en sí y no en su uso. Para insertar / actualizar no hay pedidos de todos modos. Otras opciones que tiene son escribir un módulo para manejar los detalles de la inserción / actualización, o escribir un procedimiento almacenado para manejarlo. No veo ningún problema al usar ninguno de estos métodos ya que el rendimiento es aceptable. Para escrituras de tipo singleton, debería estar bien. Las actualizaciones masivas pueden ser un problema.
Todd Everett
2

Un producto no es inventario. El inventario y los productos son distintos.

Un producto es realmente una especificación de un producto, no una cosa física.

Lo físico es un activo que la empresa posee (o almacena). Puede tener activos que rastrea por número de serie (activos discretos) o activos que rastrea solo por cantidad (activos de inventario).

Vería el Libro de recursos del modelo de datos de Silverston, Vol. 1. Tiene un buen esquema para orgullosos, características, precios, inventario. Esto le ahorrará mucho tiempo.

Neil McGuigan
fuente
1
+1 punto por mencionar el Libro de recursos del modelo de datos de Silverston. Echó un vistazo y fue esclarecedor. Espero leer más en detalle, ya que creo que cualquier persona con preguntas de modelado de datos debería Gracias.
TheSecretSquad
0

Una de las preguntas que haría es por qué está rastreando los diversos atributos de sus artículos de inventario - O, más específicamente, ¿qué estás haciendo con esta información de atributo?

Si tiene muchos informes o formularios que tienen un sentido específico de atributos particulares, entonces necesita usar el enfoque recomendado por ConcernedOfTunbridgeWell. Si, por otro lado, estos atributos se registran con el fin de enumerarlos, o posiblemente de compararlos con atributos similares de dispositivos similares, entonces es posible que tenga una buena excusa (rara) para usar EAV. Sé que "EAV es pura maldad" por muchas razones, excepto en casos muy raros cuando esas razones no son importantes para una aplicación específica. La suya podría ser una aplicación de este tipo.

Eche un vistazo a esta respuesta con respecto al diseño de un sistema de inventario de dispositivos y esta respuesta con respecto al diseño de un sistema de catálogo de productos para ver cómo un enfoque EAV podría simplificar su aplicación junto con una discusión sobre cuáles son exactamente los riesgos de EAV y cómo juzgue si esos riesgos pueden no aplicarse a su aplicación específica.

Joel Brown
fuente
Gracias por su aporte. Pensé en EAV, pero pensé que podría lograr un modelo lo suficientemente bueno sin tener que recurrir a las complejidades involucradas con EAV.
TheSecretSquad