Я создаю систему обмена сообщениями для платформы электронного обучения, и есть некоторые проблемы с дизайном, на которые мне хотелось бы получить обратную связь.Разработка и нормализация базы данных
Прежде всего, для меня и моей системы важно, чтобы в будущем моя модификация была очень изменчивой. Поэтому важно поддерживать довольно высокую нормализацию по моим таблицам.
На том, как моя система будет работать:
- Все участники (студенты или преподаватели) являются частью виртуального класса.
- Учителя могут создавать задания и упражнения в этих классах и назначать их одному или нескольким ученикам (
member_task
таблица не показана). - Студент может запросить помощь для конкретной задачи или упражнения, отправив сообщение учителям классной комнаты.
- Сообщения, отправленные студентами, отправляются всем учителям. Они не могут адресовать сообщение конкретному учителю.
- Сообщения, отправленные учителями, могут быть адресованы одному или нескольким ученикам.
- Студенты не могут отправлять сообщения другим студентам.
- Сообщения ведут себя как чат, что означает, что частный разговор начинается между учеником и всеми учителями, когда они отправляют сообщение.
Вот ER диаграмма я сделал:
Так что мой вопрос, как эта таблица нормализована должным образом для моей цели? Есть ли что-то, что можно сделать для сокращения избыточности данных по моим таблицам? И из любопытства, это в BCNF?
Другой вопрос: я не намерен когда-либо реализовывать функции удаления в моей системе. Только «архивирование», когда указанная класс/задача/член/сообщение/все просто скрыто/деактивировано. Так есть ли какая-то причина для использования FK?
EDIT: Кроме того, мой знакомый привлек мое внимание, что стол Conversations
может быть избыточным, и это похоже на это. Мысли?
Спасибо.
Спасибо за ваш вклад. Да, таблица 'members' имеет' id' PK, а также 'user_id' FK, который ссылается на идентификатор пользователя нашей веб-платформы. Таблица 'members' имеет свойство, которое определяет, является ли пользователь учителем или учеником. Вероятно, я также добавлю свойство 'active', чтобы отделить старые от текущих пользователей и, таким образом, также предотвратить удаление сообщений из каскада, если член случайно удаляется из класса. – Chris
PS: Все еще интересно, какая нормальная форма моей схемы :) – Chris