Considere un modelo para hacer coincidir clientes y servicios. Los clientes pueden ser proveedores y consumidores de servicios en varias ocasiones. Los clientes pueden ser individuos o grupos (empresas), estos últimos tienen contactos múltiples. Los contactos pueden tener varias direcciones, teléfonos, correos electrónicos. Algunas de estas relaciones serán individuales (por ejemplo, servicio al proveedor), pero la mayoría serán de uno a muchos o de muchos a muchos (los contactos múltiples en una empresa tendrían la misma dirección).tabla asociativa "maestra"?
En este modelo se suele existir varias tablas asociativas, por ejemplo, client_contact, contract_addr, contact_phone, contact_email, service_provider, service_consumer, etc.
Digamos que emite una consulta simple a la información de contacto para los consumidores de un determinado servicio. Además de las seis tablas de entidades que contienen los datos, las uniones harían referencia a cinco tablas asociativas. Nada particularmente interesante sobre este tipo de consulta, por supuesto, lo hacemos todos los días.
Sin embargo, se me ocurrió: ¿por qué no tener una sola tabla asociativa "maestra" que contenga todas las asociaciones? Se requeriría que esta tabla maestra tenga un "tipo de asociación" además de las dos PK, y que todas las PK sean del mismo tipo (entradas, GUID, etc.).
Por un lado, las consultas se volverían más complicadas porque cada unión necesitaría especificar el tipo y PK. Por otro lado, todas las uniones tendrían acceso a la misma tabla, y con el indexado apropiado y el rendimiento del almacenamiento en caché podría mejorar dramáticamente.
Supuse que podría haber un patrón (o antipatrón) que describa este enfoque, pero que no haya encontrado nada en línea. ¿Alguien lo ha intentado? Si es así, ¿se escala?
Cualquier referencia que pueda proporcionar sería apreciada.
Favorito y votado a favor, ya que tengo un presentimiento de que esta es una muy mala idea, pero realmente no puedo precisar el motivo exacto (técnico). Uno podría argumentar que es muy, MUY vulnerable a problemas de bloqueo con esta configuración, y realmente no puede agregar metadatos a sus relaciones de muchos a muchos si es necesario. Además, asumiría que un RDBMS adecuado está optimizado para tratar situaciones que usted menciona en su caso. –
Eso fue lo que pensé, y es por eso que me sorprendió no encontrarlo documentado como una muy mala idea, al menos donde habría mucho CRUD. Sospecho que con volúmenes bajos de TX, y donde las consultas podrían vivir con un aislamiento bajo, podría ser viable. Supuse que la única tabla "principal" podría arrojar mejores optimizaciones, pero eso podría depender del RDBMS específico. Comparar los planes (con "maestro" vs. reguar assoc) sería instructivo. – djhill8262
Estoy pensando que el tipo se convertiría en la parte de mayor orden de la clave o índices, por lo que las uniones serían algo así como: en Tipo = 'Tipo1' Y PK1 = PK2? ¿El rendimiento realmente será mejor en este caso? –