При проектировании базы данных вам сначала необходимо определить все объекты, которые потребуются для достижения ваших целей. В вашем случае вам нужно отслеживать студентов и их результаты по различным курсам/предметам.
На основании этого мы можем выделить следующие сущности:
- Такие предметы, как математика, химия и т.
- Студенты, сдающие тесты и экзамены по этим предметам.
- Сотрудники, отвечающие за преподавание предметов и подготовку к экзаменам/тестам.
- Различные типы тестов, т. е. классный тест, экзамены и так далее.
- Результаты учащихся по тому или иному виду теста по конкретному предмету.
Итак, на основе этого (довольно упрощенного_ сценария) нам нужно всего 5 таблиц. Второе — определить отношения между сущностями. Давайте рассмотрим их.
- Предмет может быть представлен только одним сотрудником, но сотрудник может представлять несколько предметов. Например, математику преподает только мистер Джонс, но мистер Джонс преподает математику и естественные науки. Это то, что мы называем отношением один ко многим.
- У ученика может быть много результатов по многим предметам, а у одного предмета может быть много учеников со многими результатами. Например, Студент 1 сдал экзамен и тест по математике с двумя разными результатами. У математического предмета может быть 100 учеников, у каждого из которых записан один или несколько результатов. Это отношение многие ко многим.
- Каждый результат учащегося будет относиться к какому-либо типу экзамена или теста. Таким образом, здесь существует отношение один ко многим. Существует только один тип экзамена, но математика, естественные науки, география и история используют этот тип экзамена.
Итак, на основе всего этого создали небольшую демонстрационную базу данных. Я проведу вас через это.
Вот визуальное представление структуры: ![введите здесь описание изображения](https://i.stack.imgur.com/8s58D.png)
Вот код базы данных.
CREATE SCHEMA IF NOT EXISTS `coursedb` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `coursedb` ;
-- -----------------------------------------------------
-- Table `coursedb`.`staff`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `coursedb`.`staff` (
`staff_ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`staff_name` VARCHAR(64) NOT NULL,
`staff_surname` VARCHAR(64) NOT NULL,
`staff_title` VARCHAR(64) NOT NULL,
PRIMARY KEY (`staff_ID`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `coursedb`.`subject`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `coursedb`.`subject` (
`subject_ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`subject_name` VARCHAR(64) NULL,
`staff_ID` INT UNSIGNED NOT NULL,
PRIMARY KEY (`subject_ID`),
INDEX `fk_subject_staff_idx` (`staff_ID` ASC),
CONSTRAINT `fk_subject_staff`
FOREIGN KEY (`staff_ID`)
REFERENCES `coursedb`.`staff` (`staff_ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION
)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `coursedb`.`student`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `coursedb`.`student` (
`student_ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`student_name` VARCHAR(64) NOT NULL,
PRIMARY KEY (`student_ID`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `coursedb`.`subject_result_type`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `coursedb`.`subject_result_type` (
`subject_result_type_ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`subject_result_type_name` VARCHAR(64) NOT NULL,
PRIMARY KEY (`subject_result_type_ID`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `coursedb`.`subject_student_result`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `coursedb`.`subject_student_result` (
`subject_ID` INT UNSIGNED NOT NULL,
`student_ID` INT UNSIGNED NOT NULL,
`subject_student_result_date` DATE NOT NULL,
`subject_student_result_score` INT NOT NULL,
`subject_result_type_ID` INT UNSIGNED NOT NULL,
PRIMARY KEY (`subject_ID`, `student_ID`, `subject_student_result_date`),
INDEX `fk_subject_student_result_subject1_idx` (`subject_ID` ASC),
INDEX `fk_subject_student_result_student1_idx` (`student_ID` ASC),
INDEX `fk_subject_student_result_subject_result_type1_idx` (`subject_result_type_ID` ASC),
CONSTRAINT `fk_subject_student_result_subject1`
FOREIGN KEY (`subject_ID`)
REFERENCES `coursedb`.`subject` (`subject_ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_subject_student_result_student1`
FOREIGN KEY (`student_ID`)
REFERENCES `coursedb`.`student` (`student_ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_subject_student_result_subject_result_type1`
FOREIGN KEY (`subject_result_type_ID`)
REFERENCES `coursedb`.`subject_result_type` (`subject_result_type_ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
CREATE TABLE IF NOT EXISTS `coursedb`.`subject` (
`subject_ID` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`subject_name` VARCHAR(64) NULL,
`staff_ID` INT UNSIGNED NOT NULL,
PRIMARY KEY (`subject_ID`),
INDEX `fk_subject_staff_idx` (`staff_ID` ASC),
CONSTRAINT `fk_subject_staff`
FOREIGN KEY (`staff_ID`)
REFERENCES `coursedb`.`staff` (`staff_ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
Давайте начнем добавлять некоторые данные, чтобы вы могли увидеть, как все это сочетается друг с другом. Сначала добавим двух сотрудников, мистера Джонса и мисс Ворчун.
Выполните следующий код:
INSERT INTO `coursedb`.`staff`
(
`staff_name`,
`staff_surname`,
`staff_title`
)
SELECT 'James', 'Jones','Mr'
UNION
SELECT 'Pot','Grumpy','Miss';
Это вставит двух сотрудников. Если вы посмотрите на недавно вставленные данные, выполнив оператор SELECT
, вы найдете следующие данные:
staff_ID staff_name staff_surname staff_title
'1', 'James', 'Jones', 'Mr'
'2', 'Pot', 'Grumpy', 'Miss'
Заметили, как база данных присвоила этим сотрудникам идентификационные номера? Это первичный ключ для сотрудника, и мы используем его для идентификации строки в таблицах персонала. На данный момент я держу это для автоматических номеров, но здесь есть несколько вариантов.
Теперь нам нужно создать курсы, которые преподают эти два сотрудника. Мистер Джонс преподает математику и естественные науки, а мисс Грамп преподает искусство. Давайте создадим темы и свяжем их с сотрудниками. Это можно сделать с помощью следующего кода:
INSERT INTO `coursedb`.`subject`
(
`subject_name`,
`staff_ID`
)
VALUES
(
'Math',
1
);
INSERT INTO `coursedb`.`subject`
(
`subject_name`,
`staff_ID`
)
VALUES
(
'Science',
1
);
INSERT INTO `coursedb`.`subject`
(
`subject_name`,
`staff_ID`
)
VALUES
(
'Art',
2
);
Теперь вы можете увидеть, какие предметы преподает мистер Джонс, выполнив следующий запрос:
SELECT *
FROM staff stf
INNER JOIN `subject` sub
ON stf.staff_ID = sub.staff_ID
WHERE stf.staff_ID =1;
Поэтому, прежде чем мы сможем отслеживать, как студент справляется со своими курсами, нам не хватает двух частей информации. Тип результата, т.е. экзамен или тест и, конечно, некоторые студенты. Итак, давайте добавим их.
INSERT INTO `coursedb`.`student`
(
`student_name`
)
VALUES
(
'Student 1'
);
INSERT INTO `coursedb`.`subject_result_type`
(
`subject_result_type_name`
)
SELECT 'Test'
UNION
SELECT 'Exam'
С учетом этого давайте запишем некоторые результаты для Студента 1. Студент 1 сдал 2 экзамена: один по естественным наукам, другой по математике, а Студент 1 также сдал тест по искусству. Следующий SQL вставит эти данные:
INSERT INTO `coursedb`.`subject_student_result`
(`subject_ID`,
`student_ID`,
`subject_student_result_date`,
`subject_student_result_score`,
`subject_result_type_ID`
)
VALUES
(
1,
1,
CURDATE(),
80,
2
);
INSERT INTO `coursedb`.`subject_student_result`
( `subject_ID`,
`student_ID`,
`subject_student_result_date`,
`subject_student_result_score`,
`subject_result_type_ID`
)
VALUES
(
2,
1,
CURDATE(),
60,
2
);
INSERT INTO `coursedb`.`subject_student_result`
( `subject_ID`,
`student_ID`,
`subject_student_result_date`,
`subject_student_result_score`,
`subject_result_type_ID`
)
VALUES
(
3,
1,
CURDATE(),
80,
1
);
Теперь вы можете нарисовать отчет об ученике и его результатах, выполнив следующий запрос:
SELECT *
FROM subject_student_result ssr
INNER JOIN student std
ON ssr.student_ID = std.student_ID
INNER JOIN `subject` sub
ON ssr.subject_ID = sub.subject_ID
INNER JOIN subject_result_type srt
ON ssr.subject_result_type_ID = srt.subject_result_type_ID
INNER JOIN staff stf
ON sub.staff_ID = stf.staff_ID
Я предлагаю вам проработать эту модель и действительно понять то, что я вам показываю. Это сделает ваши проекты проще и чище, а техническое обслуживание значительно сократится.
person
Namphibian
schedule
19.01.2015
LOOP
. ИCREATE
в таблице на каждой итерации. - person Spencer Wieczorek   schedule 14.01.2015