Моделирование курсов и предпосылок в базе данных - PullRequest
1 голос
/ 11 ноября 2010

Базовый сценарий: у меня есть студенты, курсы и требования к курсам, которые необходимо сохранить в базе данных.

Кто-нибудь знает, как лучше всего хранить эти и проследить предварительные условия курса?

1) Простой пример:

  • C: Math 100, prereq: none
  • C: Math 150, prereq: none
  • C: Math 200,prereq: Math 101, Math 150

Учащийся A завершил Math 100. Как определить, имеет ли он право на получение CS200 с помощью запросов к базе данных?

2) Более сложный пример:

  • C: Chem 100, предварительное требование: нет
  • C: Chem 200, предварительное условие: Chem 100
  • C: Chem 201, предварительное требование: Chem 200
  • C: Chem 202, предварительное условие: Chem 200
  • C: Chem 300, предварительное требование: любые два из Chem 200, Chem 201, Chem 202

Учащийся B завершил Chem 100Chem 200, Chem 203. Как вы проверяете, имеет ли он право принимать Chem 300?

Как смоделировать иерархию предварительных требований в базе данных?Любые советы, ссылки, ссылки будут приветствоваться.

Ответы [ 2 ]

2 голосов
/ 11 ноября 2010

Есть несколько вещей, о которых вы не задумывались, например, в сущностях, которые необходимо определить, которые подразумеваются в вашем вопросе. Позвольте мне включить несколько, но не отвлекайтесь на них, я сосредотачиваюсь на вашем заявленном вопросе. Вы можете смело игнорировать Grade, Teacher и т. Д. На данный момент и обдумать их на будущее.

Типичная модель данных для колледжа

Обозначение IDEF1X, для тех, кому необходимо объяснение символов.

  • Нет необходимости добавлять суррогатные ключи, если они не требуются, поскольку естественный ключ становится слишком большим, чтобы нести его детям; Я не слепо отмечал их как PK на каждом столе. В любом случае, рассмотрение находится на физическом, а не логическом уровне.

  • Я однажды смоделировал RDb для местного университета. Я думаю, что в дополнение к предварительным условиям, таким как "любые два из ...", вам может понадобиться "и по крайней мере один из ..." , поэтому я предусмотрел любая комбинация из них.

  • Requisite содержит полный список возможных реквизитов

    • IsMandatory указывает на то, что Реквизит является Обязательным для выполнения "хотя бы одного из ..." ; остальные не являются, и попадают в "любые два из ..."

    • Grade позволяет указывать минимальную оценку как обязательную ,

  • Course.NumRequisite определяет число возможных Requisites, которые требуются, как в "any two of ..."

Если вам нужен код SQL для навигации по структуре, спросите.

0 голосов
/ 11 ноября 2010

Я думаю, что следующее будет делать большую часть того, что вы хотите:

Table COURSE
  ID_COURSE    NUMBER         PRIMARY KEY
  DESCRIPTION  VARCHAR2(200)

Table PREREQUISITE_COURSE
  ID_COURSE         NUMBER    REFERENCES COURSE.ID_COURSE
  ID_PREREQ_COURSE  NUMBER    REFERENCES COURSE.ID_COURSE
  PRIMARY KEY (ID_COURSE, ID_PREREQ_COURSE)

Table STUDENT
  ID_STUDENT        NUMBER    PRIMARY KEY

Table STUDENT_COURSE
  ID_STUDENT        NUMBER    REFERENCES STUDENT.ID_STUDENT
  ID_COURSE         NUMBER    REFERENCES COURSE.ID_COURSE
  COMPLETED         CHAR(1)   CHECK(IN('Y', 'N'))
  PASSED            CHAR(1)   CHECK(IS NULL OR IN ('Y', 'N'))

Учитывая приведенный выше запрос, проверить, успешно ли студент прошел все курсовые работы, чтобы пройти данный класс, было бы проще.если запрос был написан для возврата предварительных курсов, которые студент НЕ ПРОБИЛ - что-то вроде

SELECT c.*
  FROM STUDENT s
INNER JOIN COURSE STUDENT_COURSE sc
  ON (sc.ID_STUDENT = s.ID_STUDENT)
LEFT OUTER JOIN PREREQUISITE_COURSE pc
  ON (pc.ID_PREREQ_COURSE = sc.ID_COURSE)
INNER JOIN COURSE c
  ON (c.ID_COURSE = pc.ID_COURSE)
WHERE s.ID_STUDENT = <id of student of interest> AND
      c.ID_COURSE = <id of course of interest> AND
      sc.COMPLETED = 'Y' AND
      sc.PASSED = 'Y' AND
      pc.ID_PREREQ_COURSE IS NULL

Обратите внимание, что это никак не проверялось и может содержать некоторые отвратительные логические ошибки (I 'я немного подозрительно отношусь к позднему соединению таблицы COURSE, например), но это должно быть полезно для начала.Или, цитируя философа Пратчетта

Не тестировали на животных - вы будете первым!

Делитесь и наслаждайтесь.

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