Прежде всего, я не программист, и я впервые работаю с созданием базы данных, и эта реализация является частью потребности, которая была выявлена во время стажировки, которую я сейчас прохожу.
В настоящее время я разрабатываю базу данных MS Access, которая будет использоваться для управления рабочими контрактами со спортивными тренерами. Реализация направлена на миграцию ряда данных, которые всегда хранились в неструктурированных базах данных Excel.
Прямо сейчас у меня возникла проблема с тем, как реализовать функциональность, необходимую для выполнения некоторых поисков.
Table A
имеет около 200 тренеров, каждый из которых идентифицируется своим идентификационным номером и своим именем, которое используется для управления отношениями с другими таблицами (такими как социальное обеспечение, номера телефонов, адрес и т. д.). ID
это ключ. Как показано в примере, он состоит из трех полей.
[Trainer_ID] [Name] [Last_Name]
1 Pedro Pérez
2 María Gómez
3 Hollman Vivas
Table B
— это список (в настоящее время 20) видов спорта, на которые мы заключаем контракты. Он имеет поле автонумерации в качестве ключа и название каждого вида спорта в виде короткого текста (например, с использованием только строчных букв). Список может быть дополнен другими видами спорта в зависимости от спроса и набора тренеров.
[Sport_ID] [Sport_Name]
a Soccer
b Basketball
c Tennis
Наконец, Table C
хранит конкретные сертификаты, которые есть у каждого тренера, с идентификатором тренера в качестве ключа. В версии Excel он имеет четыре поля.
[Trainer_ID] [Sport1] [Sport2] [Sport3] [Sport4)
1 Soccer
2 Tennis Soccer
3 Tennis Basketball Soccer
Все данные в Table C
зашифрованы таким образом.
Как видите, у каждого тренера есть один или несколько сертификатов, которые позволяют использовать почти бесконечные комбинации (например, 1abc
2c
3ac
). Не говоря уже о том, что в конечном итоге у нас может быть тренер с пятью или более сертификатами, а база данных не предназначена для этого.
Мне нужно найти способ разобраться в этих данных в среде базы данных MS Access, но я не могу придумать лучший способ сделать это,
учитывая, что из-за огромного объема информации, которую мы обрабатываем, нам необходимо, чтобы данные можно было легко обновлять путем массовой загрузки из файлов .csv
, а также обновлять с помощью форм, которые используются для ручной проверки.
Его необходимо использовать в запросах для поиска конкретных компетенций, когда это необходимо.
Первое, что я попытался сделать, это оставить данные как есть (с четырьмя спортивными площадками), но оказалось, что с этим сложно справиться.
Затем многозначные поля, которые через 10 минут были очищены, потому что мои исследования на эту тему показывают, что это нестандартная реализация и не может быть обновлена массовыми загрузками в базу.
Дальнейшие исследования привели меня к объединенным таблицам, но я до сих пор не понял, как это структурировать, учитывая, что большинство примеров в Интернете основаны на двух таблицах, а не на трех.
Я думал о том, чтобы иметь таблицу сертификатов (Table C
) без ключевых полей и просто хранить фрагментированную информацию с повторным использованием [Trainer_ID]
, но боюсь, что это отсутствие нормализации может привести к проблемам в будущем.
Как я уже говорил, база данных должна иметь возможность хранить, отображать и обновлять квалификации каждого тренера согласованным образом, независимо от того, сколько у них сертификатов.
Нет ничего плохого в вашей идее использовать таблицу сертификатов с повторяющимися идентификаторами тренера. Это не избыточные данные, потому что у вас также будет Certification_ID в таблице, который будет действовать как первичный ключ. Ваши два других поля будут внешними ключами из двух других таблиц.
Промежуточные (Junction-tables) таблицы ОЧЕНЬ распространены в крупномасштабных базах данных, в которых работают многомиллиардные корпорации, поэтому не о чем беспокоиться.