Консультация № 184509
20.11.2011, 13:47
52.94 руб.
0 6 1
Уважаемые эксперты! Пожалуйста, ответьте на вопрос: создал базу данных на mysql и экпортировал в phpmyadmin. Но потом обнаружил, что одна из таблиц не приведена к 3 нормальной форме, а все таблицы уже связаны.
Помогите мне пожалкйста привести таблицу успеваемость к 3 нормальной форме и заодно посмотрите остальные, все ли в них правильно.
Вот скрипт БД тыц

Очень надеюсь на вашу помощь.

Обсуждение

Неизвестный
20.11.2011, 17:12
общий
Выложу еще базу данных на английском. БД по крайне мере без ошибок в sql коде, в отличие от БД на русском база данных.
Прошу использовать лучше БД на английском.
давно
Мастер-Эксперт
425
4118
27.11.2011, 13:20
общий
это ответ
Здравствуйте, novij2011!
Сначала про "остальные".
Не знаю, какая версия структуры БД у Вас основная, но вот в английской версии чтение очень затруднительно из-за того, что:
1) Вы даёте вперемешку английские названия (например: time, group) и русскую транслитерацию (например: uspevaemost). Используйте какой-нибудь один стиль в названиях.
2) Некоторые поля непонятны при прочтении. Например, tabelnumberpr. Что бы это могло значить - табельный номер предмета?
Это основное, что бросается в глаза и что крайне неприятно. А если будет неприятно Вашему преподавателю, то, сами понимаете, будет неприятно и Вам.

По таблице "Успеваемость".

1) Третья нормальня форма, если говорить просто, должна использовать максимум значений из таблиц-справочников (таких как "Предмет" или "Группа"). Поэтому здесь напрашивается создание ещё одной справочной таблицы - "Оценки", где будут содержаться справочные значчения оценок, выставляемых студентам и из которой будут браться значения.
2) Выбор первичного ключа для этой таблицы... Почему Вы выбрали номер предмета, а не номер зачётки? Представьте, в группе 20 студентов. И все двадцать студентов должны сдать один и тот же предмет и получить оценку. Первичный ключ даст Вам сдать по предмету только одному студенту, а вот сдача для остальных будет заблокировано сервером БД. Студенты Вас, как разработчика такой базы, побъют.
Более предпочтительно было бы выбрать номер зачётки плюс номер предмета, т.к. это, в какой-то мере, обеспечит уникальность записи. А первичный ключ у нас должен как раз обеспечивать уникальность записи на протяжении всей таблицы.
3) Номер группы в этой таблицы - лишнее значение, т.к. студент и его группа будут определятся по номеру зачётки.
5
Спасибо.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
27.11.2011, 20:19
общий
Адресаты:
Большое спасибо. Сейчас буду исправлять все недочеты.
Неизвестный
27.11.2011, 20:41
общий
27.11.2011, 20:49
Только единственное непонятно, как сделать составной первичный ключ?

Т.е. при составном ключе у меня будет:
номер зач.книжки / предмет

1 / 1
1 / 2
1 / 3
2 / 1
2 / 2
или я вас неправильно понял?
давно
Мастер-Эксперт
425
4118
28.11.2011, 02:31
общий
28.11.2011, 02:32
Цитата: 324805
Только единственное непонятно, как сделать составной первичный ключ?

Примерно вот так:
Код:
PRIMARY KEY (`numberzachetki`,`idpredmet`)

Теперь уникальность записи будет проверятся по номеру зачётки и номеру предмета совместно. Сочетание этих номеров не должно повторяться на протяжении всей таблицы. Теперь за этим будет следить сам сервер.
И ещё маленькое добавление. В определении поля idpredmet, атрибут "DEFAULT '0'" - совершенно лишнее. Ноля там точно быть не должно.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
28.11.2011, 11:41
общий
Адресаты:
Большое спасибо.
Цитата: sir Henry
В определении поля idpredmet, атрибут "DEFAULT '0'" - совершенно лишнее. Ноля там точно быть не должно

Да, действительно. Непонятно как он там оказался
Форма ответа