Лучшее решение для SQL оценки отношений - PullRequest
0 голосов
/ 10 января 2020

Я строю SQL таблицы (SQlalchemy и Postgres) отношений, и было интересно определить, есть ли лучший способ настроить мои таблицы.

Есть таблица Test, которая может иметь много Subjects и есть много Questions в предметах. Я в основном хочу иметь возможность вводить много разных тестов (например, Test1, Test2) и добавлять темы (и вопросы). Когда тест завершен, я хочу иметь возможность обновить поле grade в тесте и отобразить оценку.

Я создал таблицу ассоциации, чтобы помочь (TestSubjects). Это работает, но когда я хочу записать счет для теста, я должен напрямую обновить таблицу Questions, которая не работает, когда я хочу добавить больше тестов.

Псевдокод выглядит следующим образом:

# Add Questions
a = Questions(name="Question1")
b = Questions(name="Question2")

# Add Subjects and add Questions to those
s1 = Subjects(name="Algebra",questions=a)
s2 = Subjects(name="History",questions=b)

# Add a group of Subjects to a Test
Test(name="test1",subjects=[s1,s2])

# Test gets sent out, completed and returned. Store the results.(And where Im struggling)
a = Questions(name="Question1",score=98)
b = Questions(name="Question2",score=76)
class Test
    __tablename__ = "test"
    id = Column(db.Integer, primary_key=True)
    name = Column(db.String(255)
    grade = Column(db.Integer)
    subjects = relationship('Subjects', secondary='test_subjects',
                            backref=db.backref('test', lazy='dynamic'))

class Subjects
    __tablename__ = "subject"
    id = Column(db.Integer, primary_key=True)
    name = Column(db.String(255)
    questions = relationship('Questions', backref="subject",lazy="dynamic")

class Questions
    __tablename__ = "questions"
    id = Column(db.Integer, primary_key=True)
    name = Column(db.String(255)
    score = Column(db.Integer)
    total = Column(db.Integer)
    subject_id = Column(db.Integer, db.ForeignKey('subject.id'))

class TestSubjects 
    __tablename__ = 'test_subjects'
    id = db.Column(db.Integer(), primary_key=True)
    test_id = db.Column(db.Integer(), db.ForeignKey('test.id', ondelete='CASCADE'))
    subject_id = db.Column(db.Integer(), db.ForeignKey('subject.id', ondelete='CASCADE'))
    #question_id = Not sure if this would work?

Я обсуждал вопрос о добавлении третьей ассоциации или выделении score из таблицы Questions, но не уверен в наилучшем способе ,

1 Ответ

1 голос
/ 10 января 2020

Похоже, вы создаете таблицы просто так, черт возьми

что именно здесь не так с этой моделью?

class Scores
    __tablename__ = "scores"
    id = Column(db.Integer, primary_key=True)
    score = Column(db.Integer)
    question = Column(db.String(255)
    subject = Column(db.String(255)
    test = Column(db.String(255)

вместо добавления "вопроса" (и затем сослаться на него с помощью его ключа), вы можете просто ввести название этого вопроса в поле вопроса оценки. То же самое для предмета и теста. По сути, «помечая» баллы дополнительной информацией.

В итоге у вас будет 1 строка в таблице для каждого вопроса по всем вашим тестам. (и не более того)

Я не говорю, что это самый сложный способ организации вашей базы данных (скорее всего, нет), но если ваша цель - вычислить средние оценки (по тесту / предмету и / или по каждому вопросу), этого вполне достаточно.

Теперь, если вы позже захотите выполнить эти вычисления для каждого учащегося, вы все равно можете добавить новый класс и иметь ссылку на него в таблице результатов. , (Это имеет смысл, потому что класс Student, скорее всего, содержит тонну информации, которая совершенно не имеет значения для оценки, например, имя и пол)

Если у вас уже есть 4 таблицы на данный момент, реализация этой идеи просто станет намного сложнее в будущем.

«Не усложняйте» и YAGNI - хорошо известные паттерны в программировании, потому что они позволяют вам всегда быть более гибкими.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...