Я больше занимаюсь веб-программированием, чем администрированием баз данных, поэтому, пожалуйста, исправьте меня, если я здесь использую неправильную терминологию. Я пытаюсь найти лучший способ создать базу данных для приложения, которое я буду кодировать.
Ситуация: у меня есть отчеты в одной таблице и рекомендации в другой таблице. Каждый отчет может иметь много рекомендаций. У меня также есть отдельная таблица для ключевых слов (для реализации тегов). Однако я хочу иметь только один набор ключевых слов, который будет применяться как к отчетам, так и к рекомендациям, чтобы поиск по ключевым словам давал вам отчеты и рекомендации в качестве результатов.
Вот структура, с которой я начал:
Reports
----------
ReportID
ReportName
Recommendations
----------
RecommendationID
RecommendationName
ReportID (foreign key)
Keywords
----------
KeywordID
KeywordName
ObjectKeywords
----------
KeywordID (foreign key)
ReportID (foreign key)
RecommendationID (foreign key)
Инстинктивно, я чувствую, что это не оптимально, и мне нужно, чтобы мои тегируемые объекты наследовали от общего родителя, и чтобы этот родительский комментарий был помечен, что дало бы следующую структуру:
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)
Должен ли я пойти с этой второй структурой? Я пропускаю какие-то важные проблемы здесь? Кроме того, если я пойду со вторым, что я должен использовать в качестве неуниверсального имени вместо «Объект»?
Обновить:
Я использую SQL Server для этого проекта. Это внутреннее приложение с небольшим количеством не одновременно работающих пользователей, поэтому я не ожидаю высокой нагрузки. С точки зрения использования ключевые слова, вероятно, будут использоваться экономно. Это в основном только для целей статистической отчетности. В этом смысле, какое бы решение я ни использовал, оно, вероятно, повлияет только на разработчиков, которым необходимо поддерживать эту систему на низком уровне ... но я подумал, что это хорошо, когда я могу внедрять хорошие практики. Спасибо за все понимание!