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

Я хочу создать небольшое приложение-задачу с 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-м решении...


person user3278918    schedule 06.06.2016    source источник


Ответы (1)


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

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

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

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

person golf4sp    schedule 13.06.2018