2010-11-11 2 views
0

Мне нужно создать таблицу для хранения расписаний классов пользователей. Эти графики имеют 7 блоков в день с понедельника по пятницу. Однако не все блоки заполняются классами.Создание таблицы расписания классов в SQL

Я планировал создать таблицу, в которой хранятся сохраненные идентификатор пользователя, идентификатор периода, имя класса и объект класса в каждой записи. Если я реализую его таким образом, каков наилучший способ определить, когда пользователь не имеет классов с использованием PHP? Есть ли лучший макет для этого?

ответ

2

Вам необходимо создать три таблицы и настроить отношения «многие ко многим».

Но если вы не хотите, чтобы вы стали реальностью, почему бы просто не вставить студентам свободное время, как класс, назовите это «свободное время», тогда вы можете просто искать их.

SELECT * FROM записей WHERE student_id = «0001» и класс = «свободное время»

В противном случае, я не знаю, как вы нашли бы пустой блок, не имея стол, посвященный блокам.

+0

К сожалению, я забыл упомянуть, что у меня есть другая таблица, которая определяет блоки. – nickles

+0

Это учебник, который я нашел полезным. http://www.tonymarston.net/php-mysql/many-to-many.html – dgig

+0

+1 для свободного времени как класса, потому что тогда вы можете выполнять вычисления на нем (всего, avg и т. д.), которые вы не можете, если вы опускаете это, как и другой ответ: – Drew

2

Я бы не сказал, что вам НЕОБХОДИМО сделать что-либо, но я думаю, что вы в конечном итоге найдете нормализацию, это очень хорошая идея здесь. http://en.wikipedia.org/wiki/Database_normalization

вы, вероятно, хотите таблицы для:

student (id, name, whatever) 
course (id, name, subject/dept) 
section (id, course id and time info) 
student_to_section (student id, section id) 

Время зависит. Вы можете поместить время старта/завершения в разделы (метки времени SQL или целые числа времени unix будут в порядке) или сохранить таблицу временных интервалов с уникальным идентификатором (тогда разделы будут иметь только внешний ключ для этого идентификатора). EDIT: звучит так, как будто вы выбрали второй способ

Что касается вашего свободного времени, найдите время, в течение которого все разделы, сделанные студентом, и свободное время - это то, что осталось. Ниже приводятся временные блоки, в которых учащийся является BUSY.

SELECT T.* 
FROM section S 
INNER JOIN time_blocks T on S.time_id = T.id 
INNER JOIN student_to_section STS on STS.section_id = S.id 
WHERE STS.student_id = ### 

Для свободного времени, использование:

SELECT T2.* 
FROM time_blocks T2 
WHERE T2.id NOT IN 
    (put above statement here) 
Смежные вопросы