From a3983f6fad35779064cf404433d1d276ff8423cd Mon Sep 17 00:00:00 2001 From: PavelBegunkov <asml.Silence@gmail.com> Date: Sat, 6 Sep 2014 22:29:55 +0400 Subject: [PATCH] lock optimization --- db/DatabaseReleaseData.sql | 294 ------------------------------------- db/StoredProcedures.sql | 80 +++++----- db/Structure.sql | 1 + 3 files changed, 47 insertions(+), 328 deletions(-) delete mode 100644 db/DatabaseReleaseData.sql diff --git a/db/DatabaseReleaseData.sql b/db/DatabaseReleaseData.sql deleted file mode 100644 index fd3d16cdc..000000000 --- a/db/DatabaseReleaseData.sql +++ /dev/null @@ -1,294 +0,0 @@ -п»ї-- phpMyAdmin SQL Dump --- version 4.0.10 --- http://www.phpmyadmin.net --- --- РҐРѕСЃС‚: 127.0.0.1:3306 --- Время создания: РђРІРі 06 2014 Рі., 13:38 --- Версия сервера: 5.5.37-log --- Версия PHP: 5.3.28 - -SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO"; -SET time_zone = "+00:00"; - - -/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */; -/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */; -/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */; -/*!40101 SET NAMES utf8 */; - --- --- База данных: `Sample` --- - --- --- Дамп данных таблицы `classrooms` --- - -INSERT INTO `classrooms` (`ID`, `Name`, `Capacity`, `FacultyID`, `Export`) VALUES -(1, '101 (РњРњ4)', 0, 1, 'false'), -(2, '102 (РњРњ3)', 0, 1, 'false'), -(3, '107', 0, 1, 'false'), -(4, '108', 0, 1, 'false'), -(5, '109', 0, 1, 'false'), -(6, '114', 0, 1, 'false'), -(7, '117', 0, 1, 'false'), -(8, '118 (РњРњ1)', 0, 1, 'false'), -(9, '118 (РњРњ2)', 0, 1, 'false'), -(10, '120', 0, 1, 'false'), -(11, '201', 0, 1, 'false'), -(12, '202', 0, 1, 'false'), -(13, '205', 0, 1, 'false'), -(14, '206', 0, 1, 'false'), -(15, '207', 0, 1, 'false'), -(16, '208', 0, 1, 'false'), -(17, '211', 0, 1, 'false'), -(18, '212', 0, 1, 'false'), -(19, '215', 0, 1, 'false'), -(20, '216', 0, 1, 'false'), -(21, '217', 0, 1, 'false'), -(22, '218', 0, 1, 'false'), -(23, '241', 0, 2, 'true'), -(24, '243', 0, 2, 'true'), -(25, '244', 0, 2, 'true'), -(26, '245', 0, 2, 'true'), -(27, '301', 0, 1, 'false'), -(28, '302', 0, 1, 'false'), -(29, '304', 0, 1, 'false'), -(30, '305', 0, 1, 'false'), -(31, '306', 0, 1, 'false'), -(32, '307', 0, 1, 'false'), -(33, '308', 0, 1, 'false'), -(34, '309', 0, 1, 'false'), -(35, '310', 0, 1, 'false'), -(36, '311', 0, 1, 'false'), -(37, '312', 0, 1, 'false'), -(38, '313', 0, 1, 'false'), -(39, '314', 0, 1, 'false'), -(40, '315', 0, 1, 'false'), -(41, '316', 0, 1, 'false'), -(42, '317', 0, 1, 'false'), -(43, '318', 0, 1, 'false'), -(44, '319', 0, 1, 'false'), -(45, '322', 0, 1, 'false'), -(46, '325', 0, 1, 'false'), -(47, 'ЛОС 1', 0, 1, 'false'), -(48, 'ЛОС 2', 0, 1, 'false'), -(49, 'ЛОС 3', 0, 1, 'false'), -(50, 'ЛОС 4', 0, 1, 'false'), -(51, 'РќРРРњРџРњ', 0, 1, 'false'), -(52, 'Спортзал', 0, 1, 'false'), -(53, 'С„/С„', 0, 1, 'false'), -(54, 'Югинфо', 0, 1, 'false'); - --- --- Дамп данных таблицы `faculties` --- - -INSERT INTO `faculties` (`ID`, `Name`, `Abbr`) VALUES -(1, 'Рнститут математики механики Рё компьютерных наук', 'мехмат'); -(2, 'Физический', 'физфак'); - --- --- Дамп данных таблицы `general_settings` --- - -INSERT INTO `general_settings` (`ID`, `ParamKey`, `Value`) VALUES -(1, 1, 'Current Semester'); - --- --- Дамп данных таблицы `semesters` --- - -INSERT INTO `semesters` (`ID`, `Year`, `Num`) VALUES -(1, 2014, 1); - --- --- Дамп данных таблицы `specializations` --- - -INSERT INTO `specializations` (`ID`, `Name`, `Abbr`) VALUES -(1, 'Прикладная математика Рё информатика', 'РџРњРёР'), -(2, 'Математика', 'Мат'), -(3, 'Механика', 'Мех'), -(4, 'Фундаментальная математика Рё информатика', 'Р¤РРРў'); - --- --- Дамп данных таблицы `study_groups` --- - -INSERT INTO `study_groups` (`ID`, `Grade`, `GroupNum`, `SpecializationID`, `FacultyID`, `Name`) VALUES -(1, 1, 1, 1, 1, NULL), -(2, 1, 2, 1, 1, NULL), -(3, 1, 3, 1, 1, NULL), -(4, 1, 4, 1, 1, NULL), -(5, 1, 5, 2, 1, NULL), -(6, 1, 7, 3, 1, NULL), -(7, 1, 8, 4, 1, NULL), -(8, 1, 9, 4, 1, NULL), -(9, 2, 1, 1, 1, NULL), -(10, 2, 2, 1, 1, NULL), -(11, 2, 3, 1, 1, NULL), -(12, 2, 4, 1, 1, NULL), -(13, 2, 5, 2, 1, NULL), -(14, 2, 7, 3, 1, NULL), -(15, 2, 8, 4, 1, NULL), -(16, 2, 9, 4, 1, NULL), -(17, 3, 1, 1, 1, NULL), -(18, 3, 2, 1, 1, NULL), -(19, 3, 3, 1, 1, NULL), -(20, 3, 4, 1, 1, NULL), -(21, 3, 5, 2, 1, NULL), -(22, 3, 7, 3, 1, NULL), -(23, 3, 8, 4, 1, NULL), -(24, 3, 9, 4, 1, NULL), -(25, 4, 1, 1, 1, NULL), -(26, 4, 2, 1, 1, NULL), -(27, 4, 3, 1, 1, NULL), -(28, 4, 4, 1, 1, NULL), -(29, 4, 6, 2, 1, NULL), -(30, 4, 7, 3, 1, NULL), -(31, 4, 8, 4, 1, NULL), -(32, 4, 9, 4, 1, NULL), -(33, 5, 2, 1, 1, 'Р—Р'), -(34, 5, 4, 1, 1, 'РџРџ'), -(35, 5, 5, 1, 1, 'РњР¤'), -(36, 5, 6, 1, 1, 'ФМ'), -(37, 5, 7, 1, 1, 'БМ'), -(38, 5, 8, 2, 1, NULL), -(39, 5, 9, 4, 1, 'РљРќ'), -(40, 5, 11, 3, 1, 'РўРЈ'), -(41, 5, 12, 3, 1, 'ГАМ'), -(42, 6, 1, 1, 1, 'РџРџ'), -(43, 6, 2, 1, 1, 'Р—Р'), -(44, 6, 3, 1, 1, 'Р’Рњ'), -(45, 6, 4, 1, 1, 'РњРњ'), -(46, 6, 5, 1, 1, 'РњР¤'), -(47, 6, 6, 1, 1, 'ФМ'), -(48, 6, 7, 1, 1, 'БМ'), -(49, 6, 8, 2, 1, NULL), -(50, 6, 9, 4, 1, 'РљРќ'), -(51, 6, 10, 4, 1, 'РўРљ'), -(52, 6, 11, 3, 1, 'РўРЈ'), -(53, 6, 12, 3, 1, 'ГАМ'); - --- --- Дамп данных таблицы `subjects` --- - -INSERT INTO `subjects` (`ID`, `Name`, `Abbr`) VALUES -(1, 'Алгебра', 'Алгебра'), -(2, 'Алгебра Рё геометрия', 'Алг. Рё геом.'), -(3, 'Алгоритмы быстрых вычислений', 'Алг. быстр. вычислен'), -(4, 'Алгоритмы Рё структуры данных', 'Алг. Рё структуры дан'), -(5, 'Алгоритмы РЅР° графах', 'Алг. РЅР° графах'), -(6, 'Анализ Рё обработка изображения', 'Анализ Рё РѕР±СЂ. РёР·РѕР±СЂ.'), -(7, 'Аналитическая геометрия', 'Аналит. геом.'), -(8, 'Архитектура вычислительных систем', 'РђСЂС…. выч. систем'), -(9, 'Базы данных', 'БД'), -(10, 'Безопасность жизнедеятельности', 'БЖД'), -(11, 'Вариационные исчисления Рё методы оптимизации', 'Вар. РёСЃС‡. Рё Рј.Рѕ.'), -(12, 'Введение РІ РћРћРџ', 'Введение РІ РћРћРџ'), -(13, 'Векторный анализ Рё теория поля', 'Вект. анализ Рё теори'), -(14, 'Вычислительные системы Рё микропрограммы', 'Выч. СЃРёСЃС‚. Рё РјРёРєСЂРѕРїСЂ'), -(15, 'Геом. теория РјРЅ-РЅРѕРІ', 'Геом. теория РјРЅ-РЅРѕРІ'), -(16, 'Дискретная математика', 'Дискрет. мат.'), -(17, 'Дискретное математическое моделирование', 'Дискр. мат.РјРѕРґ.'), -(18, 'Дифференциальная геометрия', 'Диф. геометрия'), -(19, 'Дифференциальные уравнения', 'Диф. СѓСЂ-СЏ'), -(20, 'Дополнительные главы алгебры', 'Доп. главы алгебры'), -(21, 'Дополнительные главы ан.', 'Доп. главы ан.'), -(22, 'Рзбранные главы математического анализа', 'РР·Р±СЂ. главы мат. ана'), -(23, 'Рнновационный менеджмент', 'Рнновац. менедж.'), -(24, 'Рностранный язык', 'РРЅ. СЏР·.'), -(25, 'Рнтеллектуальные системы', 'Рнтеллект. системы'), -(26, 'Рнформатика', 'Рнформатика'), -(27, 'Рнформационные технологии', 'РРў'), -(28, 'Рстория', 'Рстория'), -(29, 'Рстория РІ лицах', 'Рстория РІ лицах'), -(30, 'Рстория Рё методология механики', 'Рстория Рё метод-РёСЏ Рј'), -(31, 'Рстория математики', 'Рстория математики'), -(32, 'Комплексный анализ', 'РљРѕРјРїР». анализ'), -(33, 'Компьютерная практика РїРѕ механике', 'РљРѕРјРї. практ. РїРѕ меха'), -(34, 'Компьютерные науки', 'РљРѕРјРї. науки'), -(35, 'Компьютерные сети', 'РљРѕРјРї. сети'), -(36, 'Консультации РїРѕ алгебре', 'РљРѕРЅСЃ. РїРѕ алгебре'), -(37, 'Консультации РїРѕ математическому анализу', 'РљРѕРЅСЃ. РїРѕ мат. анализ'), -(38, 'Консультации РїРѕ теоретической механике', 'РљРѕРЅСЃ. РїРѕ теор. мех'), -(39, 'Концепции современного естествознания', 'РљРЎР•'), -(40, 'Культура Р·РґРѕСЂРѕРІСЊСЏ', 'Культура Р·РґРѕСЂРѕРІСЊСЏ'), -(41, 'Культурология', 'Культур.'), -(42, 'Р›/РЎ', 'Р›/РЎ'), -(43, 'Лабораторная практика', 'Лаб. практ.'), -(44, 'Линейная Рё общая алгебра', 'Линейная Рё РѕР±С‰. алге'), -(45, 'Математическая логика', 'Мат. логика'), -(46, 'Математическая логика Рё теория множеств', 'Мат. логика Рё РўРњ'), -(47, 'Математические РѕСЃРЅРѕРІС‹ защиты информации', 'Мат. РѕСЃРЅ. Р—Р'), -(48, 'Математический анализ', 'Мат. анализ'), -(49, 'Методика преподавания математики', 'РњРџРњ'), -(50, 'Методы вычислений', 'Мет. выч.'), -(51, 'Методы оптимизации', 'Мет. РѕРїС‚.'), -(52, 'Мех. мат.', 'Мех. мат.'), -(53, 'Механика сплошных сред', 'РњРЎРЎ'), -(54, 'Модели информационных процессов', 'Модели РёРЅС„. РїСЂРѕС†-СЃРѕРІ'), -(55, 'Научные РѕСЃРЅРѕРІС‹ школьного РєСѓСЂСЃР° математики', 'Научн. РѕСЃРЅ. шк. РєСѓСЂСЃ'), -(56, 'Немецкий язык', 'Нем. язык'), -(57, 'Непрерывные математические модели', 'Непрерыв. мат. РјРѕРґ.'), -(58, 'Общая физика', 'Общая физика'), -(59, 'Операционные системы', 'РћРЎ'), -(60, 'РћСЃРЅРѕРІС‹ программирования', 'РћСЃРЅРѕРІС‹ програм.'), -(61, 'Отечественная история', 'Рстория'), -(62, 'Пакеты прикладных программ', 'РџРџРџ'), -(63, 'Параллельное программирование', 'Паралл. РїСЂРѕРіСЂ-РёРµ'), -(64, 'Правоведение', 'Правоведение'), -(65, 'Практ. РїРѕ СЌР». математике', 'Практ. РїРѕ СЌР». матема'), -(66, 'Практикум РЅР° РР’Рњ', 'Практ. РР’Рњ'), -(67, 'Преобразование программ', 'Преоб-Рµ программ'), -(68, 'Прикладные задачи теории вероятностей', 'РџСЂРёРєР». задачи РўР’'), -(69, 'Программная инженерия', 'Программ. РёРЅР¶.'), -(70, 'Психология общения', 'Психология общения'), -(71, 'Разработка корпоративных приложений', 'Разраб.РєРѕСЂРї.РїСЂРёР»-Р№'), -(72, 'Разработка пользовательского интерфейса', 'Разраб. польз. РёРЅС‚.'), -(73, 'Религиоведение', 'Религиоведение'), -(74, 'Современные базы данных', 'Соврем. БД'), -(75, 'Современные компьютерные технологии', 'РЎРѕРІСЂ. РєРѕРјРї. технол.'), -(76, 'Современные проблемы прикладной математики Рё инфор', 'РЎРѕРІСЂ. проблемы РїСЂРёРєР»'), -(77, 'Социально-политические РІРѕРїСЂРѕСЃС‹', 'РЎРѕС†-РїРѕР». РІРѕРїСЂ.'), -(78, 'Социально-этические РІРѕРїСЂРѕСЃС‹ РРў', 'РЎРѕС†.-СЌС‚. РІРѕРїСЂ. РРў'), -(79, 'Стандартная библиотека C++', 'Станд. Р±РёР±Р». C++'), -(80, 'Суперкомпьютеры', 'Суперкомпьютеры'), -(81, 'Теоретическая Рё практическая механика', 'Теор. Рё практ. механ'), -(82, 'Теоретическая Рё прикладная механика', 'Теор. Рё РїСЂРёРєР». мех.'), -(83, 'Теоретическая механика', 'Теор. мех.'), -(84, 'Теоретическая физика', 'Теор. физика'), -(85, 'Теория автоматов Рё формальных языков', 'Теор. авт. Рё С„-С… СЏР·С‹'), -(86, 'Теория алгоритмов', 'Теория алгоритмов'), -(87, 'Теория вероятностей', 'РўР’'), -(88, 'Теория вероятностей Рё математическая статистика', 'РўР’РёРњРЎ'), -(89, 'Теория вероятности', 'РўР’'), -(90, 'Теория РёРіСЂ Рё исследование операций', 'РўРРёРРћ'), -(91, 'Теория информации Рё криптографии', 'Теория РёРЅС„. Рё РєСЂРёРїС‚.'), -(92, 'Теория кодирования', 'Теор. РєРѕРґ.'), -(93, 'Теория чисел', 'Теория чисел'), -(94, 'Технологии баз данных', 'Технологии БД'), -(95, 'Технологии программирования', 'Технологии програм. '), -(96, 'Технологии программирования графики', 'Техн. РїСЂРѕРіСЂ-СЏ график'), -(97, 'Топологии', 'Топологии'), -(98, 'РўРЎРџ', 'РўРЎРџ'), -(99, 'Уравнения математической физики', 'РЈРњР¤'), -(100, 'Устойчивость Рё управление движением', 'РЈСЃС‚-ть Рё СѓРїСЂ. РґРІРёР¶.'), -(101, 'Факультатив', 'Факультатив'), -(102, 'Физвоспитание', 'Физ. РІРѕСЃРїРёС‚.'), -(103, 'Физика', 'Физика'), -(104, 'Философия', 'Философия'), -(105, 'Функциональное программирование', 'Функц. РїСЂРѕРіСЂ-Рµ'), -(106, 'Функциональный анализ', 'Функ. анализ'), -(107, 'Численные методы', 'Числ. методы'), -(108, 'Ркономическая теория', 'РРєРѕРЅРѕРј. теория'), -(109, 'Ркспериментальные методы', 'РРєСЃРї. мет.'), -(110, 'Ркспериментальные методы РІ механике ДТТ', 'Ркспер. мет.РІ мех. Р”'), -(111, 'Ркспериментальные методы РІ механике Р–Р“', 'Ркспер. мет.РІ мех. Р–'), -(112, 'Языки Рё методы программирования', 'РЇРёРњРџ'); - -/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */; -/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */; -/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; diff --git a/db/StoredProcedures.sql b/db/StoredProcedures.sql index 20b6cdef0..c9b3cb3fd 100644 --- a/db/StoredProcedures.sql +++ b/db/StoredProcedures.sql @@ -16,14 +16,12 @@ CREATE FUNCTION `InternalIsMapLocked` ( `DisciplineID` INT ) RETURNS boolean NO SQL BEGIN - DECLARE checker INT; + DECLARE checker boolean; SET checker = -1; - SELECT modules.ID + SELECT disciplines.isLocked INTO checker - FROM `rating_table` - INNER JOIN `submodules` ON submodules.ID = rating_table.SubModuleID - INNER JOIN `modules` ON submodules.ModuleID = modules.ID AND - modules.DisciplineID = DisciplineID + FROM `disciplines` + WHERE DisciplineID = disciplines.ID LIMIT 1; RETURN ( checker > 0 ); END // @@ -1460,7 +1458,7 @@ BEGIN departments.ID AS 'DepID', departments.Name AS 'DepName', faculties.ID AS 'FacultyID', - InternalIsMapLocked(DiscID) AS 'isLocked' + disciplines.isLocked AS 'isLocked' FROM `disciplines` INNER JOIN `subjects` ON subjects.ID = disciplines.SubjectID INNER JOIN `faculties` ON faculties.ID = disciplines.FacultyID @@ -1491,11 +1489,11 @@ BEGIN faculties.Abbr AS 'FacultyAbbr', (teachers.ID = disciplines.AuthorID) AS 'isAuthor' FROM `disciplines_teachers` - INNER JOIN `disciplines` ON disciplines.ID = disciplines_teachers.DisciplineID - INNER JOIN `teachers` ON teachers.ID = disciplines_teachers.TeacherID - INNER JOIN `departments` ON departments.ID = teachers.DepartmentID - INNER JOIN `faculties` ON departments.FacultyID = faculties.ID - INNER JOIN `job_positions` ON job_positions.ID = teachers.JobPositionID + INNER JOIN `disciplines` ON disciplines.ID = disciplines_teachers.DisciplineID + INNER JOIN `teachers` ON teachers.ID = disciplines_teachers.TeacherID + INNER JOIN `departments` ON departments.ID = teachers.DepartmentID + INNER JOIN `faculties` ON departments.FacultyID = faculties.ID + INNER JOIN `job_positions` ON job_positions.ID = teachers.JobPositionID WHERE disciplines_teachers.DisciplineID = DiscID ORDER BY isAuthor DESC; END // @@ -1642,19 +1640,8 @@ CREATE FUNCTION `SetStudentRate`( `TeacherID` INT, RETURNS int(11) NO SQL BEGIN - -- TODO: log - DECLARE checker, DisciplineID, groupID, rateID INT; - - SET DisciplineID = -1; - SELECT modules.DisciplineID - INTO DisciplineID - FROM `submodules` - INNER JOIN `modules` ON submodules.ModuleID = modules.ID - WHERE submodules.ID = SubmoduleID - LIMIT 1; - IF DisciplineID <= 0 OR (NOT InternalIsTeacherBinded(TeacherID, DisciplineID)) THEN - RETURN -1; - END IF; + DECLARE checker, DisciplineID, groupID, rateID INT; + DECLARE isLocked tinyint; SET groupID = -1; SELECT students.StudyGroupID @@ -1662,18 +1649,37 @@ BEGIN FROM `students` WHERE students.ID = StudentID LIMIT 1; - IF groupID <= 0 OR (NOT InternalIsStudentAttached(StudentID, DisciplineID)) THEN + IF groupID <= 0 THEN RETURN -1; - END IF; + END IF; - SELECT rating_table.SubmoduleID - INTO rateID - FROM `rating_table` - WHERE SubmoduleID = rating_table.SubmoduleID AND - StudentID = rating_table.StudentID + SET isLocked = 0; + SET DisciplineID = -1; + SELECT modules.DisciplineID, disciplines.isLocked, rating_table.StudentID + INTO DisciplineID, isLocked, rateID + FROM `submodules` + INNER JOIN `modules` ON submodules.ModuleID = modules.ID + INNER JOIN `disciplines` ON modules.DisciplineID = disciplines.ID + INNER JOIN `disciplines_teachers` ON disciplines.ID = disciplines_teachers.DisciplineID AND + TeacherID = disciplines_teachers.TeacherID + LEFT JOIN `disciplines_groups` ON disciplines.ID = disciplines_groups.DisciplineID AND + groupID = disciplines_groups.StudyGroupID + LEFT JOIN `disciplines_students` ON disciplines.ID = disciplines_groups.DisciplineID AND + StudentID = disciplines_students.StudentID AND + 1 = disciplines_students.Type + LEFT JOIN `rating_table` ON SubModuleID = rating_table.SubModuleID AND + StudentID = rating_table.StudentID + WHERE submodules.ID = SubModuleID AND + ( disciplines_students.ID IS NOT NULL OR + disciplines_groups.ID IS NOT NULL + ) LIMIT 1; - IF rateID > 0 THEN + IF DisciplineID <= 0 THEN + RETURN -1; + END IF; + + IF rateID IS NOT NULL AND rateID > 0 THEN INSERT INTO `logs_rating` (logs_rating.StudentID, logs_rating.SubmoduleID, logs_rating.TeacherID, logs_rating.Rate, logs_rating.Action ) VALUES (StudentID, SubModuleID, TeacherID, Rate, 'change'); @@ -1683,10 +1689,16 @@ BEGIN rating_table.Rate = Rate, rating_table.Date = CURDATE() WHERE SubmoduleID = rating_table.SubmoduleID AND - StudentID = rating_table.StudentID + StudentID = rating_table.StudentID LIMIT 1; ELSE + IF NOT isLocked THEN + UPDATE `disciplines` + SET disciplines.isLocked = 1 + WHERE disciplines.ID = DisciplineID + LIMIT 1; + END IF; INSERT INTO `logs_rating` (logs_rating.StudentID, logs_rating.SubmoduleID, logs_rating.TeacherID, logs_rating.Rate, logs_rating.Action ) diff --git a/db/Structure.sql b/db/Structure.sql index 34a979d79..edd2bc825 100644 --- a/db/Structure.sql +++ b/db/Structure.sql @@ -86,6 +86,7 @@ CREATE TABLE IF NOT EXISTS `disciplines` ( `PracticeCount` int(11) NOT NULL DEFAULT '0', `LectionCount` int(11) NOT NULL DEFAULT '0', `FacultyID` int(11) NOT NULL, + `isLocked` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`ID`), KEY `GradeID` (`GradeID`), KEY `SubjectID` (`SubjectID`), -- GitLab