Sql - chave estrangeira indireta

Eu tenho algumas perguntas sobre o design do banco de dados.

Existe um nome para isso?É uma boa prática?Alguma consideração de desempenho?

Eu tenho uma estrutura de tabela genérica usada para armazenar relacionamentos.

Recentemente refatorei algumas coisas para usar essa estrutura genérica em vez de colunas Fk diretas, mas agora não tenho certeza se essa foi realmente a melhor ideia.

Esquema original:

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

Novo esquema

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

Então, basicamente, em vez de termos um relacionamento Fk direto entre Book e Note, temos um relacionamento indireto via tabela MetaParent usando as colunas MetaTableId / KeyValue.

Atualmente, a tabela MetaParent possui cerca de 500k registros e as coisas estão funcionando de forma aceitável. Mas reconstruímos os índices nele todas as noites.

Minha preocupação é que agora o relacionamento entre Book e Note não seja óbvio. Você precisa saber se existe e usar a tabela MetaParent.

Além do desempenho, não tenho certeza em que ponto teríamos problemas com junções no MetaTableId / KeyValue que estavam rodando muito devagar. Parece que quanto mais você adiciona a essa tabela as consultas mais lentas ficam.

questionAnswers(1)

yourAnswerToTheQuestion