Sql - clave externa indirecta

Tengo algunas preguntas sobre el diseño de bases de datos.

¿Hay un nombre para esto?¿Es buena práctica?¿Alguna consideración de rendimiento?

Tengo una estructura de tabla genérica utilizada para almacenar relaciones.

Recientemente he refaccionado algunas cosas para usar esta estructura genérica en lugar de columnas Fk directas, pero ahora no estoy seguro de si esa fue realmente la mejor idea.

Esquema original:

 +------------------+       +---------------------+    +----------------------+
 | Book             |       | Note                |    | MetaParent           |
 |------------------|       |---------------------|    |----------------------|
 | Id               |       | Id                  |    | Id                   |
 | NoteId           |       | MetaParentId:(Null) |    | MetaTableId          |
 |                  +-------+                     +----+ KeyValue             |
 |                  |       |                     |    |                      |
 |                  |       |                     |    |                      |
 |                  |       |                     |    |                      |
 |                  |       |                     |    |                      |
 |                  |       |                     |    |                      |
 +------------------+       +---------------------+    +----------------------+

Nuevo esquema

 +------------------+       +---------------------+    +----------------------+
 | Book             |       | Note                |    | MetaParent           |
 |------------------|       |---------------------|    |----------------------|
 | Id               |       | Id                  |    | Id                   |
 |                  |       | MetaParentId:(Null) |    | MetaTableId          |
 |                  +       +                     +----+ KeyValue             |
 |                  |       |                     |    |                      |
 |                  |       |                     |    |                      |
 |                  |       |                     |    |                      |
 |                  |       |                     |    |                      |
 |                  |       |                     |    |                      |
 +------------------+       +---------------------+    +----------------------+

Básicamente, en lugar de tener una relación Fk directa entre Libro y Nota, tenemos una relación indirecta a través de la tabla MetaParent usando las columnas MetaTableId / KeyValue.

Actualmente, la tabla MetaParent tiene alrededor de 500k registros y las cosas se ejecutan de manera aceptable. Pero sí reconstruimos los índices cada noche.

Mis preocupaciones son que ahora la relación entre Libro y Nota no es obvia. Debes saber que existe una y usar la tabla MetaParent.

También en cuanto al rendimiento, no estoy seguro de en qué momento nos encontramos con problemas con las combinaciones contra MetaTableId / KeyValue que se ejecutan demasiado lento. Parece que cuanto más agregue a esta tabla, más lentas serán las consultas.

Respuestas a la pregunta(1)

Su respuesta a la pregunta