Ha surgido un nuevo requisito en una antigua base de código, que básicamente permite la comunicación directa (interna) entre dos clases de usuarios que anteriormente no estaban directamente relacionadas (almacenadas en tablas diferentes con un esquema completamente diferente y, lamentablemente, el código apenas es consciente de OO, mucho menos diseñado, por lo que no hay clase principal). Dado que estamos dispuestos a colgar una bolsa en esta configuración anterior que nunca consideró esta funcionalidad, no hay garantía de que no haya colisiones PK; dado el conjunto de datos en uso, está prácticamente garantizado que HAY.
Entonces, la solución parece obvia: mátala con fuego y reescribe todo el desorden de una tabla de mapeo. Obtuve dos instrucciones sobre las posibles formas de implementar el mapa, pero no soy un DBA, por lo que no estoy seguro de si hay algunos pros y contras que me haya perdido.
En aras de aclarar la abstracción, considere tres grupos de datos de usuarios dispares: profesores, administración, estudiantes (No, esta no es una tarea. ¡Promesa!)
Mapeo 1
(professor_id, admin_id y student_id son claves foráneas para sus tablas respectivas)
| mailing_id (KEY) | professor_id | admin_id | student_id |
-------------------------------------------------------
| 1001 | NULL | 87 | NULL |
| 1002 | 123 | NULL | NULL |
| 1003 | NULL | NULL | 123 |
El +/- a este enfoque parece bastante pesado en los contras:
- Dos campos "desperdiciados" por fila
- Viola 2NF
- Vulnerable para insertar / actualizar anomalías (una fila con solo 0-1 conjunto de campos NULL, por ejemplo)
Sin embargo, los profesionales no carecen de sus propios méritos:
- El mapeo se puede lograr con una sola búsqueda
- Determine fácilmente los datos de "fuente" para un usuario determinado desde el mailing_id
A decir verdad, en mi interior, no me gusta esta idea en absoluto.
Mapeo 2
(suponga que MSG_ * son constantes definidas, tipos de enumeración u otro identificador adecuado)
| mailing_id (KEY) | user_type (UNIQUE1) | internal_id (UNIQUE2)|
------------------------------------------------------------------
| 1001 | MSG_ADMIN | 87 |
| 1002 | MSG_PROF | 123 |
| 1003 | MSG_STUDENT | 123 |
Con esta configuración, y un índice compuesto único de {user_type, internal_id} las cosas se vuelven mucho más limpias, se mantiene 3NF y el código de la aplicación no tiene que verificar las anomalías de E / S.
En el lado negativo, hay una pequeña pérdida de transparencia al determinar las tablas de origen del usuario que deben manejarse fuera de la base de datos, lo que básicamente equivale a una asignación a nivel de aplicación de los valores de tipo de usuario a las tablas. En este momento, me estoy inclinando (bastante fuerte) hacia este segundo mapeo, ya que la desventaja es bastante menor.
PERO soy dolorosamente consciente de mis propias limitaciones, y estoy seguro de que probablemente haya perdido ventajas o tropiezos en ambas direcciones, así que recurro a mentes más sabias que las mías.