Minha formação é mais em programação da Web do que em administração de banco de dados; portanto, corrija-me se estiver usando a terminologia errada aqui. Estou tentando descobrir a melhor maneira de projetar o banco de dados para um aplicativo que codificarei.
A situação: eu tenho relatórios em uma tabela e recomendações em outra tabela. Cada relatório pode ter muitas recomendações. Eu também tenho uma tabela separada para palavras-chave (para implementar a marcação). No entanto, quero ter apenas um conjunto de palavras-chave que sejam aplicadas aos Relatórios e às Recomendações, para que a pesquisa em palavras-chave forneça Relatórios e Recomendações como resultados.
Aqui está a estrutura com a qual comecei:
Reports
----------
ReportID
ReportName
Recommendations
----------
RecommendationID
RecommendationName
ReportID (foreign key)
Keywords
----------
KeywordID
KeywordName
ObjectKeywords
----------
KeywordID (foreign key)
ReportID (foreign key)
RecommendationID (foreign key)
Instintivamente, acho que isso não é o ideal e que meus objetos taggable sejam herdados de um pai comum e que esse pai de comentário seja marcado, o que daria a seguinte estrutura:
BaseObjects
----------
ObjectID (primary key)
ObjectType
Reports
----------
ObjectID_Report (foreign key)
ReportName
Recommendations
----------
ObjectID_Recommendation (foreign key)
RecommendationName
ObjectID_Report (foreign key)
Keywords
----------
KeywordID (primary key)
KeywordName
ObjectKeywords
----------
ObjectID (foreign key)
KeywordID (foreign key)
Devo ir com esta segunda estrutura? Estou perdendo alguma preocupação importante aqui? Além disso, se eu for com o segundo, o que devo usar como um nome não genérico para substituir "Objeto"?
Atualizar:
Estou usando o SQL Server para este projeto. É um aplicativo interno com um pequeno número de usuários não concorrentes, por isso não prevejo uma carga alta. Em termos de uso, as palavras-chave provavelmente serão usadas com moderação. É basicamente apenas para fins de relatórios estatísticos. Nesse sentido, qualquer solução que eu escolher provavelmente afetará apenas os desenvolvedores que precisarão manter esse sistema abaixo da linha ... mas achei que seria bom implementar boas práticas sempre que possível. Obrigado por toda a visão!