Шаблон схемы базы данных для группировки записей - PullRequest
0 голосов
/ 29 ноября 2011

Я ищу шаблон проектирования для управления записями в реляционной базе данных, которые принадлежат друг другу, например, группировка нескольких контактов. Сама группа не должна быть сущностью. В группе должно быть неограниченное количество участников.

Должна быть возможность выполнить запрос, чтобы получить других членов группы для данной записи.

Моя идея состоит в том, чтобы управлять им в одной таблице:

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», чтобы было очевидно, что запись в этой таблице не является группой - это связь между группа и член. Группа не является юридическим лицом.

Ответы [ 3 ]

2 голосов
/ 29 ноября 2011

enter image description here

1 голос
/ 29 ноября 2011

Выглядит хорошо для меня - это нормальное решение, которое может закончиться, если член может быть частью нескольких групп, что, вероятно, они могут.

Единственное предложение, которое я хотел бы сделать, это ваш SQL-запрос - я бы вместо этого использовал JOIN, но это не имеет ничего общего с вашей схемой:

SELECT g2.member_id
FROM groups g1
    INNER JOIN groups g2 ON g1.group_id = g2.group_id AND g1.member_id <> g2.member_id
WHERE g1.member_id = 10
1 голос
/ 29 ноября 2011

То, что вы обрисовали в общих чертах, является довольно стандартным решением, реляционной таблицей между двумя объектами - Группой и Участником. Я уверен, что есть альтернативы, но это решение, которое я бы выбрал.

...