Я ищу шаблон проектирования для управления записями в реляционной базе данных, которые принадлежат друг другу, например, группировка нескольких контактов. Сама группа не должна быть сущностью. В группе должно быть неограниченное количество участников.
Должна быть возможность выполнить запрос, чтобы получить других членов группы для данной записи.
Моя идея состоит в том, чтобы управлять им в одной таблице:
GROUPINGS
integer group
integer member_id
primary_key (group, member_id)
foreign_key (member_id)
РЕДАКТИРОВАТЬ: Остерегайтесь, что group
является не внешний ключ. Это просто уникальный идентификатор. Это должно быть увеличено для каждой группы участников, которая построена.
Вот пример содержимого:
GROUPINGS group | member_id
-----------------
1 | 10
1 | 11
1 | 12
2 | 20
2 | 21
3 | 10
3 | 40
Этот пример содержит три группы: (10,11,12) и (20,21) и (10,40). Вы видите, что 10 входит в две группы.
Чтобы запросить «соседей» члена 10, мы можем использовать этот оператор SQL:
SELECT g2.member_id
FROM groupings g1
JOIN groupings g2 ON g1.group = g2.group
AND g1.member_id != g2.member_id
WHERE g1.member_id = 10
=> 11,12,40
Что ты думаешь? Возможно, это известный паттерн - есть ли ссылки, чтобы узнать больше об этом?
РЕДАКТИРОВАТЬ: Переименовали таблицу «groups» в «groupings» и переименовали атрибут «group_id» в «group», чтобы было очевидно, что запись в этой таблице не является группой - это связь между группа и член. Группа не является юридическим лицом.