Почтовые группы в MySQL - PullRequest
       2

Почтовые группы в MySQL

0 голосов
/ 25 августа 2011

У меня небольшой проект, и у меня есть некоторые проблемы с дизайном SQL с моими данными.

Допустим, у меня есть 2 таблицы в моей БД:

Contacts
ID
name
privateemail1
privateemail2
office email

, и у меня есть Группы

ID
Groupname

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

Если я создаю таблицу участников с

ID
GroupID
ContactID

Я не понимаю, как вписать встроенные подгруппы в основную.

Такие группы, как

Основные группы, например, игроки оркестра;Певцы
Подгруппы, например, игроки Ветра, струнники, певцы-мужчины, певицы и т. Д.

Пересмотренный вопрос: Приведенные выше примеры не могут охватить все варианты ... любые группыможет стать подчиненным или основным, как список рассылки Outlook?

Просто просматривая комментарии, которые я очень благодарен, было бы неплохо увидеть CREATE, SELECT со всеми группами и пример DELETE.Это привлекло бы больше внимания и, надеюсь, больше результатов.

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

Ответы [ 3 ]

3 голосов
/ 25 августа 2011

Я думаю, что пользователь911882 подразумевает такую ​​схему:

Contacts
- ID
- name
- privateemail1
- privateemail2
- office
- email

Groups
- ID
- Groupname
- ParentGroupID **foreign key which references Groups.ID**

Memberships
- ID
- GroupID
- ContactID
2 голосов
/ 25 августа 2011

Я решил это с помощью таблицы двойного назначения:

Таблица: groupMemberships

id
groupID
linktype
linkID

linktype может быть либо текстовым полем («пользователь», «группа»), которое приятно и читаемо (если вы выполняете собственный SQL-доступ, это может стоить небольшого снижения производительности), либо вы можете использовать Поле INT, где (1,2) где каждый для вас что-то значит.

Чтобы найти всех пользователей в группе 2:

SELECT linkID as userID FROM groupMemberships 
WHERE groupID=2 AND linktype='user';

Чтобы найти все подгруппы:

SELECT linkID as groupID FROM groupMemberships 
WHERE groupID=2 AND linktype='group';

Одна из проблем с такой двойной таблицей заключается в том, что вы хотите - сказать - получить всех пользователей группы, но не знаете, сколько их подгрупп может быть. Если вы можете быть уверены, что подгруппы будут иметь только один уровень:

SELECT linkID as userID FROM groupMemberships
WHERE groupID=2 and linktype='user'
UNION
SELECT sg.linkID as userID FROM groupMemberships g,groupMemberships sg
WHERE g.groupID=2 AND g.linktype='group' 
  AND sg.groupID=g.linkID AND sg.linktype='user'

Если у вас есть два уровня подгруппы, вам понадобятся два союза и так далее. Когда у вас есть n подгруппы, вам нужно N союзов, что очень сложно писать и неэффективно.

Альтернативное решение - сохранить таблицы contacts и groups одинаковыми и просто связать контакты с группами - таблица contactsGroups

ID
groupID
userID

Теперь сторона кода (вне базы данных), когда вы добавляете пользователя в группу (windplayers), вы также автоматически добавляете его в любые родительские группы (оркестр), чтобы пользователь фактически получил две записи в таблице contactsGroups. Здесь хранится та же самая информация, но она значительно облегчает поиск данных. Вы даже можете сохранить эту информацию подгруппы в базе данных, хотя она уже есть на стороне кода с наследованием объектов или чем-то подобным.

0 голосов
/ 25 августа 2011

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

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