Вопрос такой. Пишу программу в рамках студенческой работы, У меня в базе данных есть сущности Преподаватель, Студент, Аккаунт.
Нужно дать возможность и студентам и преподавателям авторизоваться по данным аккаунта, но я не могу решить, как правильнее сделать связь между сущностями. Я изначально хотел, чтобы атрибут вторичного ключа пользователей был в сущности Аккаунт, но я не знаю, можно ли сделать так, чтобы вторичный ключ мог привязываться от разных таблиц(Преподаватель/Студент), либо создать 2 колонки с разрешением на нулл, но звучит так себе.
Не знаю, как быть, есть у кого советы ?
SQL
MySQL Связь между сущностями
"Преподаватель" и "Студент" - это не две разные сущности, а две разные роли (см. RBAC) одной сущности "Пользователь" (Аккаунт). Первичен именно пользователь системы.
Если разносить преподавателей и студентов по разным таблицам (насколько оправдано такое архитектурное решение?), то это не Аккаунт должен ссылаться на П и C, а в таблицах П и С должно быть поле id_аккаунта.
Если разносить преподавателей и студентов по разным таблицам (насколько оправдано такое архитектурное решение?), то это не Аккаунт должен ссылаться на П и C, а в таблицах П и С должно быть поле id_аккаунта.
и студенты и преподы -- люди. даже если ты лично так не считаешь...
это как в загсе, есть запись о ком-то, и пофиг кем ты будешь (или кем был, или кем так и не стал)
да, конечно же можно засунуть всю информацию о пользователе в "Аккаунт"... но "логичнее" было бы создать таблицу "пользователь"... на которую будут ссылаться и "аккаунт", и "студень", и "препод"....
это как в загсе, есть запись о ком-то, и пофиг кем ты будешь (или кем был, или кем так и не стал)
да, конечно же можно засунуть всю информацию о пользователе в "Аккаунт"... но "логичнее" было бы создать таблицу "пользователь"... на которую будут ссылаться и "аккаунт", и "студень", и "препод"....
просто следуй правила третьей нф при разработке архитектуры бд и все
Я вижу это так:
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
Похожие вопросы
- Под каким пользователем нужно работать в MySQL?
- MySQL Truncate/Delete - как это работает?
- Почему так нужен mysql?
- Друзья пожалуйста скажите любой бесплатный хостинг чтобы работал и поддерживал PHP + MySQL.
- Не отрабатывает вложенный MySQL запрос
- Нормализация базы данных, не могу понять связи
- Как в Mysql поставить, что бы при регистрации пароль содержал не меньше 8 символов?
- Обязательно ли делать первичный ключ (id колонку) в таблице mysql, если каждое значение и так будет уникальным?
- Форма ввода в базу данных MySQL через Php
- MySQL.Задания по запросам.