Невозможно применять такие правила, используя только ограничения FOREIGN KEY
.
1) Один из способов - разрешить циклические ссылки между таблицами (столбец «по умолчанию», рекомендуется jug). Это приводит к проблемам курицы и яйца, которыми трудно управлять, вам придется использовать отложенные ограничения. Кроме того, эта опция просто недоступна в некоторых СУБД. Другим недостатком является то, что для футбольной команды вам придется добавить 11 столбцов «по умолчанию» (и вам придется решать проблему курицы и 11 яиц)!
2) Другой вариант - использовать триггеры.
3) Другой вариант - использовать ограничение уровня базы данных между двумя таблицами. Не уверен, что существует какая-либо СУБД, обладающая такой функциональностью Помимо типичных ограничений UNIQUE
, PRIMARY
и FOREIGN KEY
, большинство СУБД имеют только ограничения на уровне строк и с ограничениями (без подзапросов и т. Д.).
4) Другой вариант заключается в применении таких правил путем создания соответствующих процедур INSERT, UPDATE и DELETE, которые могут обращаться только к двум связанным таблицам и обеспечивать целостность в соответствии с этими правилами. Это лучший подход (на мой взгляд).
5) Еще один вариант, который проще реализовать, - это использовать стандартные ограничения внешнего ключа, обеспечивающие отношение 1-ко-многим, и иметь представление, отображающее те команды, в которых на самом деле есть 11 или более игроков. Это, конечно, означает, что вы на самом деле не соблюдаете правила, о которых просите. Но возможно (и я могу сказать вероятное), что вы можете себе позволить не слишком. Например, если футболисты погибают в результате несчастного случая, команда больше не может играть в турнирах, но это все-таки команда. Таким образом, вы можете определить две сущности: Team (базовая таблица) и ProperTeam (View), которые могут играть в игры. Пример:
CREATE VIEW AS ProperTeam
( SELECT *
FROM Team
WHERE ( SELECT COUNT(*)
FROM Player
WHERE Player.TeamId = Team.TeamId
) >= 11
)
Варианты 1 и 2 выглядят довольно "грязно", но это только личное мнение, многим людям нравятся триггеры.
Я бы выбрал вариант 4, если только я не могу ("обмануть" и) фактически не применять ограничение с помощью варианта 5.