SQL

MySQL Связь между сущностями

Вопрос такой. Пишу программу в рамках студенческой работы, У меня в базе данных есть сущности Преподаватель, Студент, Аккаунт.
Нужно дать возможность и студентам и преподавателям авторизоваться по данным аккаунта, но я не могу решить, как правильнее сделать связь между сущностями. Я изначально хотел, чтобы атрибут вторичного ключа пользователей был в сущности Аккаунт, но я не знаю, можно ли сделать так, чтобы вторичный ключ мог привязываться от разных таблиц(Преподаватель/Студент), либо создать 2 колонки с разрешением на нулл, но звучит так себе.
Не знаю, как быть, есть у кого советы ?
"Преподаватель" и "Студент" - это не две разные сущности, а две разные роли (см. RBAC) одной сущности "Пользователь" (Аккаунт). Первичен именно пользователь системы.

Если разносить преподавателей и студентов по разным таблицам (насколько оправдано такое архитектурное решение?), то это не Аккаунт должен ссылаться на П и C, а в таблицах П и С должно быть поле id_аккаунта.
VS
Vladimir Sharankov
74 500
Лучший ответ
и студенты и преподы -- люди. даже если ты лично так не считаешь...
это как в загсе, есть запись о ком-то, и пофиг кем ты будешь (или кем был, или кем так и не стал)
да, конечно же можно засунуть всю информацию о пользователе в "Аккаунт"... но "логичнее" было бы создать таблицу "пользователь"... на которую будут ссылаться и "аккаунт", и "студень", и "препод"....
просто следуй правила третьей нф при разработке архитектуры бд и все
Я вижу это так:


 from sqlalchemy import Column, Integer, String, ForeignKey 
from sqlalchemy.orm import relationship, backref, polymorphic_union
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Account(Base):
__tablename__ = 'accounts'
id = Column(Integer, primary_key=True)
username = Column(String)
password = Column(String)
account_type = Column(String(50))

__mapper_args__ = {
'polymorphic_on': account_type,
'polymorphic_identity': 'account'
}

class Teacher(Base):
__tablename__ = 'teachers'
id = Column(Integer, primary_key=True)
name = Column(String)
account_id = Column(Integer, ForeignKey('accounts.id'))
account = relationship(Account, backref=backref('teachers', uselist=False))

__mapper_args__ = {
'polymorphic_identity': 'teacher'
}

class Student(Base):
__tablename__ = 'students'
id = Column(Integer, primary_key=True)
name = Column(String)
account_id = Column(Integer, ForeignKey('accounts.id'))
account = relationship(Account, backref=backref('students', uselist=False))

__mapper_args__ = {
'polymorphic_identity': 'student'
}
 account = Account(username='user1', password='123', account_type='teacher') 
teacher = Teacher(name='John', account=account)
session.add(teacher)
session.commit()
 account = session.query(Account).filter_by(username='user1', password='123').first() 
people = account.teachers + account.students