Да, числовые сравнения выполняются быстрее, чем сравнения строк. Строки также занимают намного больше места, а дублирование данных означает, что если вам придется переименовать «miniquiz» в «microquiz», вам придется обновить все строки. Наконец, и, возможно, самое главное, ваша база данных не сможет отклонить недопустимые строки: вы сказали, что существует четыре типа оценок, но ваша база данных с радостью примет любую передаваемую вами строку.
Как правило, вы хотите создать другую таблицу, возможно, назвав ее assesTypes
, с полями id
и name
, и сохранить в ней все приемлемые типы. Затем в основной таблице укажите в поле assesType
внешний ключ , который ссылается на атрибут id
новой таблицы assesTypes
. Пример:
CREATE TABLE assesTypes (
id int,
name varchar(15),
PRIMARY KEY (id)
) ENGINE=INNODB;
CREATE TABLE assessments (
student_id int,
assesType int,
mark int,
PRIMARY KEY (student_id, assesType),
FOREIGN KEY (assesType) REFERENCES assesTypes (id)
) ENGINE=INNODB;
Теперь мы можем заполнить нашу таблицу assesTypes
:
INSERT INTO assesTypes VALUES (1, 'Test');
INSERT INTO assesTypes VALUES (2, 'Quiz');
INSERT INTO assesTypes VALUES (3, 'MiniQuiz');
INSERT INTO assesTypes VALUES (4, 'FinalExam');
А теперь давайте вставим некоторые оценочные данные в таблицу assessments
:
INSERT INTO assessments VALUES (1, 1, 55);
INSERT INTO assessments VALUES (1, 2, 65);
INSERT INTO assessments VALUES (1, 3, 75);
Это все хорошо. Теперь мы можем INNER JOIN
таблица assessments
с таблицей assessTypes
, например:
SELECT a.student_id, at.name, a.mark
FROM assessments a
JOIN assesTypes at ON (at.id = a.assesType);
Для этого результата:
+------------+----------+------+
| student_id | name | mark |
+------------+----------+------+
| 1 | Test | 55 |
| 1 | Quiz | 65 |
| 1 | MiniQuiz | 75 |
+------------+----------+------+
3 rows in set (0.00 sec)
Теперь давайте попробуем вставить неверный assesType
в таблицу assessments
:
INSERT INTO assessments VALUES (1, 5, 75);
Мы не можем. MySQL сообщит:
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails
Внешние ключи не обязательно должны иметь рабочую реляционную базу данных, но они необходимы, чтобы избежать разрыва отношений и потерянных строк (т.е. ссылочная целостность ). Способность обеспечить ссылочную целостность на уровне базы данных требуется для C в ACID , чтобы стоять.