Como faço para criar um (tipo, id) (também conhecido como 'polimórfico')- coluna de chave estrangeira no acesso ao MS?
Pergunta
Em Ruby-on-Rails, isso é chamado de "Associação Polimórfica".
Tenho vários Commentable
As coisas na minha aplicação, as tabelas para cada uma estão abaixo:
Post
id | title | text | author (FK:Person.id) | ...
Person
id | name | ...
Photo
id | title | owner (FK:Person.id) | path | ...
Eu gostaria de adicionar um Comments
Tabela da seguinte forma:
Comments
id | commentable_type | commentable_id | text | author (FK:Person.id)
Entendo que perco a integridade referencial do banco de dados dessa maneira, mas a única outra opção é ter múltiplo Comments
mesas: PostComments
, PersonComments
, PhotoComments
, ...
E agora para a pergunta:
Como posso construir um formulário que irá fazer a pesquisa, primeiro obtendo o nome da tabela Comments.commentable_type
E então o ID de Comments.commentable_id
?
Solução
Essa técnica é conhecida coloquialmente no mundo do SQL como 'subclassificação'. Para um exemplo trabalhado (sintaxe do servidor SQL, mas é facilmente adaptado para o Access MS), consulte Blog de David Porta..
No seu cenário, os itens de dados comuns a todos os comentários estariam na sua tabela de comentários; Qualquer coisa específica para cada tipo seria em tabelas especializadas, como fotocomamentos, etc. Observe que o FK deve ser o composto de duas colunas do ID mais o tipo, algo que geralmente é esquecido, mas é essencial para a integridade referencial aqui, por exemplo, você não Deseja algo digitado como um comentário fotográfico que aparece na tabela de conquomentos de pessoa.
Outras dicas
Eu acredito que muitas pessoas fazem meta-mesas para esse tipo de coisa. Praticamente exatamente como você descreveu.