|
|
|
| Пишу сайт для университета и возникла проблема....
Как на Ваш взгляд будет лучше хранить расписание занятий?
Проблема собсно состоит в следующем:
1. Группа в университете может делиться на несколько подгрупп, причем не всегда, а только на некоторые предметы (например на некоторые лабораторные группу делят, чтобы меньше народа одновременно было на предмете)
2. У каждой ПОДгруппы (например в подельник первой парой) может быть одинаковый предмет как по всем неделям , так и разный по четным и нечетным неделям. А может быть еще хуже.... у одной подгруппы может быть по 1,4,7,13 неделям один предмет ,а по 2,3,5,8 и т.д. другой предмет... и тоже самое для другой подгруппы....
Причем есть список студентов в каждой группе, а в подгруппах - нет, т.е. надо написать общее расписание.... Например:
http://www.mpei.ru/AU/TimeTable/TableView.asp?auID=7450000008301
Вот тут в среду 3 и 4 пара именно такая ситуация....
Помогите кто чем может... | |
|
|
|
|
|
|
|
для: NovikovMA
(16.06.2007 в 22:17)
| | Есть идеи? | |
|
|
|
|
|
|
|
для: NovikovMA
(16.06.2007 в 23:26)
| | А подгрупп две или бывает и больше? | |
|
|
|
|
|
|
|
для: Lotanaen
(16.06.2007 в 23:29)
| | вообще может быть и больше (до 4-х) | |
|
|
|
|
|
|
|
для: NovikovMA
(16.06.2007 в 23:43)
| | Таблицу, я думаю стоит организовать так:
id, name, order, date, subgroop, week
где
id - первичный ключ
name - название предмета
order - номер пары
date - дата
subgroop - подгруппа (0 - если для всех, и номер, если для одной)
week - неделя (odd - если нечетные, even - если четные недели или номера недель через точку с запятой)
Если при обращении к таблице на номер пары и дату приходится несколько записей (очевидная коллизия, если учитывать только одну подгруппу), то выводим их вместе.
И еще один момент. Для того, чтобы узнать какая неделя идет в данный момент нужно сделать следующее.
Очевидно, что та неделя, на которую приходится первое сентября, если это не воскресенье - первая. Для функции date есть потрясающий парметр "W" - номер недели (работает начиная с версии 4.1.0, но я думаю редко где можно найти более древнюю версию).
Далее привожу код для лучшей усвояемости информации
<?php
$year = date("y");
if(date("n") < 9) //Если на дворе месяц меньший сентября, то говорим про прошлый год
{
$year--;
}
$first_time = mktime(12,0,0,9,1,$year); //Определяем тайм-стамп для первого сентября (вычисляем для полудня дабы избежать коллизий неперехода на летнее время)
if (date("w", $first_time) == 0) //Если этот день - воскресенье, придется накинуть еще денек
{
$first_time = mktime(12,0,0,9,2,$year);
}
$first_week = date("W", $first_time); //На эту неделю приходится 01.09
$this_week = date("W");//Эта - текущая в году
$this_education_week = $this_week - $first_week; //Текущая учебная
if($this_week < $first_week) //Если текущая недля меньше первой (т.е. время до сентября)
{
$delta = 52 - $first_week; //Сколько недель проучились в том календарном году
$this_education_week = $this_week + $delta; //Текущая учебная
}
echo "Первая неделя в этом году: $first_week -я<br>Текущая неделя года: $this_week-я<br>Текущая учебная неделя года: $this_education_week-я";
?>
|
Есть еще один менее приятный момент - в некоторых альма-матерях принято считать все недели начиная от первого сентября. Но тут все просто - именно такое решения я и предложил, но в некоторых считаются строго недели симестра, там начальную дату придется прикручивать вручную или исходить из каких-либо условий.
Кстати, неделю для другого календарного но не учебного года, лишь с натяжкой можно назвать текущей "учебной" ибо неделя новогодних праздников явно выпадает, не говоря уже о каникулах.
Но в целом, пищу для размышлений, я надеюсь, дал. | |
|
|
|
|
|
|
|
для: Гончий пёс
(17.06.2007 в 00:42)
| | Да, только еще добавить поле id_group в таблицу и сделать отдельную таблицу group в которой поля id ( или id_group), namegroup, fakultet. Если нужно расписание лично для каждого студента, то создать еще одну таблицу student с такими полями:
id_student, id_group, subgroop, name_student,secondname_student у и еще если надо то факультет и т.п. в зависимости от необходимости параметров выборки. | |
|
|
|
|
|
|
|
для: Lotanaen
(17.06.2007 в 01:05)
| | Именно так я и делал, только тогда получается очень долго выводить данные....
Получается или надо делать по несколько запросов на одну пару или куча php кода с выбором, для какой же все таки это подгруппы и для каких недель....
Может быть есть что-нить по-интереснее? | |
|
|
|
|
|
|
|
для: Гончий пёс
(17.06.2007 в 00:42)
| | Ой! Вот в чем дело! недели через точку с запятой!
А я копировал записи с разными номерами недель....
А зачем они мне нужны отдельно?
Мне же прям строку показывать.....
Это Хорошая Идея! Спасибо. | |
|
|
|
|
|
|
|
для: NovikovMA
(16.06.2007 в 22:17)
| | Привет коллеге по альма-матер=)
А почему просто не сграбить расписание?
Если не грабить, то самый порстой вариант - это хранить в информацию о каждой ячейке таблицы, а заполнять ее вручную.
Можно извратиться и сделать так: представить, что ячеек вдвое больше, то есть у каждой подгруппы свое расписание. Хранить отдельно два расписания, а при выводе проверять: если ячейки совпадают, выводить общую для группы, если нет - то указывать каждую подгруппу.
ЗЫ: ЭР - РТФ?=) | |
|
|
|
|
|
|
|
для: Киналь
(17.06.2007 в 00:30)
| | >>ЗЫ: ЭР - РТФ?=)
Ну почти... с ЭТФ
А что делать, если по разное расписание а разные недели? Тоже самое? Тогда получается, что может быть 40 ячеек на одну пару )))
Если каждую неделю разные предметы у 2-х подрупп )) | |
|
|
|