Проектирование отношений вокруг структуры наследования

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

В настоящее время у меня есть четыре основных таблицыusers, teachers, students а такжеnotifications, Однако обаteachers а такжеstudents таблицы наследуются отusers таблица так содержит внешний ключuser_id.

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

И студенты, и учителя могут нанимать других пользователей.

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

getCurrentUser->getAllEmployer(s)->getNotifications

Это Laravel Eloquent, к которому я привык$user->employers()->notifications;

К сожалению, это не так просто, как в этом случае работодатель может ссылаться на две таблицы.

Так что мой выбор следующий.

Создайте красноречивую связь для обоихstudent а такжеteacher отношения как работодатели. Недостаток в том, что мне нужно написать тесты, чтобы проверить, принадлежит ли текущий пользователь одному из них, и этот код будет повторяться часто.Добавитьteacher_id а такжеstudent_id кusers Таблица. Однако очевидно, что в каждой записи будет избыточно. Вероятность необходимости добавления других столбцов также весьма вероятна из-за появления новых структур работодателей.Создатьemployer_employee таблица, которая содержит два столбца, оба ссылающиеся наuser_id, SQL-запрос оставил бы обаstudent а такжеteacher таблицы сemployer_employee стол, а затем присоединиться кnotifications вернет все те, которые имеют отношение. Однако такое количество объединений уменьшит скорость запроса по сравнению с другими вариантами.Что-то, что я не учел.

Я действительно ищу самого эффективного,масштабируемый решение.

Любая помощь приветствуется. Если бы вы могли уточнить, почему ваш ответ также является наиболее эффективным масштабируемым решением, это было бы превосходно.

Ответы на вопрос(1)

Ваш ответ на вопрос