Создать вычисляемое поле, используя данные из других таблиц - PullRequest
3 голосов
/ 02 ноября 2011

Я создаю дизайн базы данных только для предметной школы. Мой текущий дизайн показан по следующей ссылке:

Разработка базы данных http://img225.imageshack.us/img225/7711/capturecopyy.png

Я вложил три объекта, и все они содержат вычисляемые поля:

  • StudetExams: средний
  • StudentExamObjectives: аккредитовано и оценка
  • ObjectiveGrades: FinalScore

Но им нужно взаимодействовать с другими таблицами. Например, StudentExamObjectives использует поле Score, где среднее значение для всех проблем, правильных в таблице ответов, затем равно 1, если значения Score выше или равны 0,70.

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

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 02 ноября 2011

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

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

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

0 голосов
/ 02 ноября 2011

StudentExamObjectives использует поле Score, где среднее значение для всех проблемы исправлены в таблице ответов, то аккредитован 1, если оценка значения выше или равны 0,70.

Я не верю, что вы можете создавать вычисляемые столбцы таким образом. Можете ли вы использовать представление с оператором CASE? Что-то (примерно) так:

CASE WHEN Score >= 0.70
  THEN 1
  ELSE 0
END AS IsAccredited

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

...