Назначить задачу пользователям и группам пользователей

Я хочу построить небольшое приложение-задачу с MYSQL и PHP. Я хочу назначить задачи отдельным пользователям и нескольким группам пользователей. Я думал, чтобы иметь user_table:

userid  name
1       Peter
2       Hans

usergroup_table

usergroup_id name
1            Usergroup 1
2            Usergroup 2

usergroupmap_table (2 общих первичных ключа)

usergroup_id userid
1            1
1            2

tasks_table

taskid  taskname            due_date
1       Finish my exams     10-06-2016
2       Another task 2 do   15-06-2016

Из этого легко. Теперь я могу придумать 3 способа, как назначить пользователя и группы пользователей задачам. Но я не могу выбрать, какой из них лучше (нормализация??)

Решение 1

две отдельные таблицы, одна таблица с одиночными пользователями, а другая с назначенными группами: usertask_table (2 общих первичных ключа) && usergroup_table

taskid  userid
1       1
1       1

taskid  groupid
1       1
2       1

Решение 2

Объединенная таблица с идентификатором пользователя 0 или идентификатором группы 0:

taskid  groupid  userid
1       1        0
2       1        0
2       0        1
2       0        2

Решение 3

Объединенная таблица со всеми назначенными задачами, но с varchar, чтобы определить, какая группа выбрана

taskid  type  id
1       group 1
1       group 2
2       user  1      
2       user  2

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

Я благодарю вас всех за вашу помощь!

С уважением, Рон

1 ответ

РЕШЕНИЕ 1. Это хорошо, но затем создает избыточные таблицы, которые, на мой взгляд, не только не нужны, но и потребуют от вас запрашивать 2 разные таблицы каждый раз, когда вы хотите получить все назначенные задачи.

РЕШЕНИЕ 2. Для меня нет никакого смысла. Чтобы вы могли определить, назначена ли задача группе или пользователю, вам придется проверить значения в каждом столбце, где один столбец имеет идентификатор задачи 0, затем вы проверяете идентификатор задачи в другом столбце. Ненужная нагрузка на ваш двигатель.

РЕШЕНИЕ 3: Для меня это идеально - вам нужно только знать, что находится в столбце типа, чтобы определить. Также вы избегаете недостатков в наличии большого количества таблиц, как в случае решения 1.

Для дальнейшего улучшения решения 3 вы можете использовать числа или логические значения, чтобы различать типы (например, если 1, то он группирует, если 2, а затем его отдельное лицо), просто чтобы уменьшить количество символов, генерируемых таблицей / столбцами для вашей базы данных.

Другие вопросы по тегам