У меня есть сомнения по поводу структуры моей таблицы, и мне интересно, есть ли лучший подход.
У меня есть небольшая база данных для репозиториев контроля версий (например, SVN), пакетов (например, RPM Linux), созданных из них, и их версий (например, 1.2.3-4). Данный репозиторий может не создавать ни одного пакета, или нескольких, но если для данного репозитория их несколько, то конкретная версия для этого репозитория будет указывать один «тег» кодовой базы.
Конкретная версия "строка" может использоваться для маркировки версии исходного кода в более чем одном репозитории, но между "1.0" для двух разных репозиториев может отсутствовать связь. Таким образом, если пакеты P и Q оба получены из репо R, то P 1.0 и Q 1.0 оба созданы из тега 1.0 репо R. Но если пакет X происходит из репо Y, то X 1.0 не имеет отношения к P 1.0.
В моей (упрощенной) модели у меня есть следующие таблицы (столбцы x_id представляют собой автоматически инкрементные суррогатные ключи; вы можете притвориться, что я использую другой первичный ключ, если вы хотите, это не очень важно):
repository
- repository_id
- repository_name (unique)
...
version
- version_id
- version_string (unique for a particular repository)
- repository_id
...
package
- package_id
- package_name (unique)
- repository_id
...
Это позволяет мне, например, увидеть, какие допустимые версии данного пакета: я могу присоединиться к таблице версий, используя repository_id. Однако предположим, что я хотел бы добавить некоторую информацию в эту базу данных, например, чтобы указать, какие версии пакетов были утверждены для выпуска. Мне, конечно, нужна новая таблица:
package_version
- version_id
- package_id
- package_version_released
...
Опять же, природа ключей, которые я использую, на самом деле не важна для моей проблемы, и вы можете представить, что столбец данных имеет значение «Продвижение_уровня» или что-то в этом роде, если это помогает.
Мои сомнения возникают, когда я понимаю, что действительно существует очень тесная связь между version_id и package_id в моей новой таблице ... они должны использовать один и тот же repository_id. Допустимо только небольшое подмножество комбинаций пакет / версия. Поэтому у меня должно быть какое-то ограничение на эти столбцы, обеспечивающее это ...
... Я не знаю, это просто как-то нехорошо. Как будто я включаю как-то больше информации, чем мне действительно нужно? Я не знаю, как объяснить мою нерешительность здесь. Я не могу понять, какую (если есть) нормальную форму я нарушаю, но я также не могу найти пример схемы с такой структурой ... не являясь администратором по профессии, я не уверен, где смотреть.
Итак, я спрашиваю: я просто слишком чувствителен?