Eu tenho um aplicativo onde os usuários estão rastreando um fluxo de trabalho em torno da produção de um trabalho derivado de um livro existente. O trabalho derivado, que chamaremos de "BookDerivative", deve ter um livro relacionado a partir de uma perspectiva de modelo de dados. O sistema existente que armazena as informações do livro (Título, Autor, etc) deve ser considerado um sistema de "terceiro opcional" que pode ser trocado por outro sistema no futuro (que abstraí via IBookService).
Meu aplicativo deve fornecer duas opções para os usuários quando eles criam um BookDerivative:
- Selecione um livro existente do provedor IBookService (via pesquisa); OU
- Crie uma entrada de "formato livre" para o livro que NÃO seria vinculada ao provedor IBookService. Isso permite que o usuário crie um BookDerivative para um título de livro não encontrado pela pesquisa IBookService.
Minha solução para suportar isso é incluir as colunas necessárias de Book em minha tabela/entidade BookDerivative (BookTitle, BookAuthor, BookId) onde BookId só estará presente SE o livro vier do sistema de terceiros. Dessa forma, se o livro for de "forma livre", eu preencheria apenas BookTitle e BookAuthor.
Acessos futuros do BookDerivative não precisam consultar o IBookService. As informações essenciais do livro nunca (ou raramente) devem ser alteradas no sistema de terceiros e estou preparado para aceitar o fato de que é teoricamente possível que as informações estejam fora de sincronia.
Não haverá integridade de dados entre os dois sistemas e nenhum FK. Meu aplicativo não pode assumir o modelo de dados subjacente do sistema Book, mas deve depender de um modelo definido e da pesquisa IBookService.
Minha pergunta permanece, esta é uma boa maneira de resolver este problema? Que recomendações ou armadilhas podem existir? Eu acho que este é um requisito comum, você já usou uma solução diferente ou melhor no passado?
Com base nos detalhes que você forneceu, eu diria que parece bom.
Coisas que podem ou não ser um problema com base em mais informações.
(1) Mesmo que você diga que não há relação entre os dois sistemas e nenhuma chave estrangeira, se você trocasse sistemas de terceiros, ficaria com um monte de ids sem sentido para livros que foram adicionados do sistema de terceira parte anterior . Tudo bem? Caso contrário, pode ser necessário adicionar uma tabela de pesquisa de sistemas de terceiros que podem ser relacionados aos IDs na tabela Book para que você possa saber posteriormente de qual sistema eles vieram.
(2) Se a única razão para os IDs do sistema de terceiros estarem lá é verificar sua existência, talvez uma coluna booleana simplesmente IsFrom3rdParty ou IsFreeForm seja suficiente. Parece atender a todos os requisitos que você estabeleceu aqui e seria mais simples de implementar do que o ID e transmitiria melhor as informações reais que você possui (que é simplesmente que veio de um sistema de terceiros. Você não pode garantir que o ID se relacionará com qualquer coisa, especialmente se o sistema de back-end foi alterado)
Caso contrário, sim, soa bem.