Я планирую схему базы данных и столкнулся с ситуацией, когда не знаю, как лучше поступить. Я действительно ищу список плюсов и минусов для каждого из предложенных мной решений, возможно, сопровождаемый рекомендацией, которая будет соответствовать передовой практике баз данных.
Итак, проблема в том, что у меня есть два объекта с множественными отношениями "многие ко многим" между ними. Две таблицы — «Команды» и «Люди»; Команда состоит из многих Людей, и Человек может иметь одну или несколько ролей в Команде. Роли включают в себя лидера команды, члена команды, последователя команды и т. д. У человека может быть более одной роли для конкретной команды, но в идеале подмножество этих ролей являются взаимоисключающими, а остальные — нет.
Вот решения, которые я рассмотрел:
1) Создайте отдельную соединительную таблицу для каждой роли. Наличие строки в каждой таблице означает, что один человек принадлежит к одной команде, а конкретная таблица указывает роль человека в команде. Взаимоисключающие роли должны быть реализованы на уровне приложений.
2) Создайте единую соединительную таблицу и сохраните перечисление в этой таблице, чтобы указать, какую роль играет человек. У данной комбинации человек-команда может быть несколько строк в этой таблице, по одной для каждой роли, которую человек играет в команде. Взаимная исключительность определенных ролей должна быть обеспечена на уровне приложений.
3) Создайте единую соединительную таблицу и сохраните в ней список логических флагов, по одному для каждой роли. Каждая комбинация человек-команда имеет одну строку в таблице, а флаги определяют роли пользователя в этой команде. Взаимная исключительность может быть реализована на уровне базы данных, поскольку все взаимоисключающие роли могут совместно использовать одно перечисляемое поле в таблице.
4) Создайте две соединительные таблицы. Это своего рода комбинация (2) и (1), которая позволяет обеспечить взаимную исключительность на уровне базы данных. Будет одна соединительная таблица с перечислением взаимоисключающих ролей, а другая соединительная таблица (с перечислением) будет обрабатывать все неисключающие роли.
Я что-то забыл? Какой вариант кажется наиболее естественным?
Спасибо