Я создаю приложение PHP, которое имеет 3 основных типа сущностей: Coach, Student, Lesson, где тренеры создают цифровые уроки для студентов. Я использую MySQL и таблицы innoDB.Дизайн базы данных: несколько пользовательских объектов. Один или несколько таблиц
Требования
- Тренер и ученик входа в систему.
- Тренер может предоставить цифровой урок специально для одного студента.
Я не уверен, какая лучшая схема БД использовать с учетом требований. Здесь два варианта:
Вариант 1
пользователя (PK ID, user_type (тренер или студент), Firstname, фамилия, адрес электронной почты, пароль и т.д. ...)
Урок (PK идентификатор, FK coach_user_id (ссылка: User.id), FK student_user_id (ссылка: User.id), lesson_name, и т.д ...)
Pros:
- одна пользовательская таблица
- Каждый пользователь имеет уникальный идентификатор и адрес электронной почты
- упрощает вход в систему с помощью одной таблицы
Минусы:
- Нет проверка user_type когда тренер или студент User.id записывается как FK в таблице урока. Эта проблема будет повторяться в любой новой таблице, где тренер или ученик User.id должен быть записан как FK.
- Потенциальные проблемы полиморфизма и необходимость нормализации вниз по дорожке.
Вариант 2
Тренер (PK ID, Имя, фамилия, адрес электронной почты, пароль и т.д. ...)
Student (PK ID, Имя, фамилия, адрес электронной почты, пароль и т.д. ...)
Урок (PK идентификатор, FK coach_id (ссылка: Coach.id), FK student_id (ссылка: Student.id), lesson_name, lesson_text, и т.д ...)
Pros:
- Нормированный DB схемы. Независимый тренер, таблицы учеников.
- Нет вопросов проверки типа пользователя. Идентификатор тренера и идентификатор ученика FK указывают независимо на Coach.id и Student.id соответственно.
Минусы:
- тренер и ученик может иметь тот же идентификатор. (Это можно решить, хотя с префиксами ID, например, C1001, S1001)
- У тренера и ученика может быть такое же электронное письмо.
- Login auth включает в себя запрос двух двух таблиц для одной страницы входа в систему или создания 2 разных страниц входа и типов запросов авторизации.
Я действительно разорван, что является лучшим способом. Есть лучший способ сделать это?
Итак, из Варианта 1 вы удалите User.user_type, а затем создадите таблицы Role и User_Role, чтобы разрешить много-много отношений? У вас есть сайт с дополнительной информацией об этом?;) – Ben
Сама таблица роли определяет только разные роли, такие как «Студент», «Тренер» и т. Д. Тогда нам нужна таблица ссылок 'user_role'. В некоторых случаях достаточно иметь только поля 'user_id',' role_id' (с UNIQUE ('user_id, role_id')). В других случаях вы можете добавить даты - от и до, например, user1 был студентом в 2012 году, затем он стал тренером и т. Д. Затем вам нужно другое уникальное ограничение, а не 'UNIQUE (user_id, role_id)', но ' UNIQUE (user_id, role_id, date_from) '. – a1ex07