Любой вид «матрицы» по сути является отношением M: N, только в этом случае обе «оси» матрицы представляют одну и ту же вещь («группы проектирования»). Отношение M: N таблицы к себе может быть смоделировано следующим образом:
Предполагая, что отношения являются двунаправленными, вы также должны добавить: CHECK(GROUP_ID1 < GROUP_ID2)
в таблицу СОВМЕСТИМОСТИ. Это, например, позволило бы (1, 4), но не позволило бы (4, 1) находиться в таблице.
Пример из вашего вопроса будет представлен следующими данными в базе данных:
GROUP:
GROUP_ID
--------
1
2
3
4
СОВМЕСТИМОСТЬ:
GROUP_ID1 GROUP_ID2
--------- ---------
1 4
Когда пользователь выбирает группу X, вы должны выполнить следующий запрос, чтобы найти, с какими группами он совместим. Остальные группы совместимы с .
SELECT GROUP_ID1
FROM COMPATIBILITY
WHERE GROUP_ID2 = :X
UNION ALL
SELECT GROUP_ID2
FROM COMPATIBILITY
WHERE GROUP_ID1 = :X
Для 1 это вернет 4, а для 4 - 1. В любом из этих случаев 2 и 3 не будут возвращены - знак того, что они несовместимы.
С другой стороны, если вы хотите отключить 2 и 3, когда выбраны 1 и 4, а не когда выбраны только 1 или только 4, это другая проблема, которая будет более сложной. моделировать в реляционной парадигме. Дайте мне знать, если вам это действительно нужно ...