Из тех данных, которые, как я предполагаю, хранятся в руководствах по телепрограммам, похоже, что вы можете хранить все внутри реляционной базы данных.Я не вижу никаких преимуществ в использовании файловых систем или файлов XML.
Запросы для отслеживания времени в SQL должны быть очень простыми.
Вы можете рассмотреть возможность использования такой схемы, как приведенная ниже (использование MySQLв этом примере):
CREATE TABLE shows (
show_id int NOT NULL PRIMARY KEY,
name varchar(100),
description text
) ENGINE=InnoDB;
CREATE TABLE channels (
channel_id int NOT NULL PRIMARY KEY,
name varchar(100)
) ENGINE=InnoDB;
CREATE TABLE channel_slots (
slot_id int NOT NULL PRIMARY KEY,
channel_id int NOT NULL,
day date NOT NULL,
show_id int NOT NULL,
start datetime,
end datetime,
FOREIGN KEY (channel_id) REFERENCES channels(channel_id),
FOREIGN KEY (show_id) REFERENCES shows(show_id)
) ENGINE=InnoDB;
Таблица shows
должна определять каждое шоу.show_id
- это суррогатный ключ , и вы даже можете сделать так, чтобы автоматически генерировал уникальный серийный номер .Поле name
является просто полем имени, а поле description
имеет тип данных text
, который может хранить переменное количество текста.
Таблица channels
должнабыть довольно простым.Мы снова используем суррогатный ключ как channel_id
.Я не уверен, что у каналов есть какой-то уникальный стандартный код, который можно использовать вместо естественного ключа 1024 *, но вы должны быть в безопасности с суррогатным ключом.
Тогда таблица channel_slots
выделяет шоу-слоты каждому дню каждого канала.
Я могу ошибаться, но я думаю, что большинство телепрограмм не определяют день как начало и конец в полночь.Иногда день может быть в 2:00 утра следующего дня, и программа, начинающаяся в 1.30 и заканчивающаяся в 2.00, станет частью этого дня.Если это так, то причина использования поля day
в этой таблице.В этом поле мы можем определить день, к которому принадлежит это шоу, в терминах «дней руководства по программе».
slot_id
снова является суррогатным ключом, а поля channel_id
и show_id
представляют собой внешние ключи для соответствующей таблицы.Поля start
и end
просто определяют точное время начала и окончания шоу.Если вы будете вставлять шоу, где время пока еще не определено, вы можете вставить NULL
в эти поля.Другим вариантом может быть использование другого поля в качестве флага для отметки, если подтверждено, что время показа не подтверждено.
Если вы собираетесь использовать MySQL в качестве СУБД, обратите внимание, что механизм хранения InnoDB поддерживает ограничения по внешнему ключу, в то время как механизм по умолчанию MyISAM не поддерживает.Однако только механизм MyISAM поддерживает полнотекстовое индексирование .Это может быть полезно, если вы хотите разрешить своим пользователям искать текст внутри описания шоу.
Чтобы дать вам пример вышеуказанной схемы, давайте заполним некоторые данные в ней:
INSERT INTO shows VALUES (1, 'Breakfast Show', 'The everyday morning show');
INSERT INTO shows VALUES (2, 'Who wants to be a Millionaire?', 'Who does not?');
INSERT INTO shows VALUES (3, 'Saturday Night Live', 'Only on Saturdays');
INSERT INTO channels VALUES (1, 'Channel 1');
INSERT INTO channel_slots VALUES(
1, 1, '2010-07-17', 1, '2010-07-17 07:00:00', '2010-07-17 09:00:00');
INSERT INTO channel_slots VALUES(
2, 1, '2010-07-17', 2, '2010-07-17 18:00:00', '2010-07-17 19:00:00');
INSERT INTO channel_slots VALUES(
3, 1, '2010-07-17', 3, '2010-07-17 23:30:00', '2010-07-18 01:00:00');
Вот как сейчас выглядят наши таблицы:
mysql> SELECT * FROM channels;
+------------+-----------+
| channel_id | name |
+------------+-----------+
| 1 | Channel 1 |
+------------+-----------+
1 row in set (0.00 sec)
mysql> SELECT * FROM shows;
+---------+--------------------------------+---------------------------+
| show_id | name | description |
+---------+--------------------------------+---------------------------+
| 1 | Breakfast Show | The everyday morning show |
| 2 | Who wants to be a Millionaire? | Who does not? |
| 3 | Saturday Night Live | Only on Saturdays |
+---------+--------------------------------+---------------------------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM channel_slots;
+---------+------------+------------+---------+---------------------+---------------------+
| slot_id | channel_id | day | show_id | start | end |
+---------+------------+------------+---------+---------------------+---------------------+
| 1 | 1 | 2010-07-17 | 1 | 2010-07-17 07:00:00 | 2010-07-17 09:00:00 |
| 2 | 1 | 2010-07-17 | 2 | 2010-07-17 18:00:00 | 2010-07-17 19:00:00 |
| 3 | 1 | 2010-07-17 | 3 | 2010-07-17 23:30:00 | 2010-07-18 01:00:00 |
+---------+------------+------------+---------+---------------------+---------------------+
3 rows in set (0.00 sec)
Теперь предположим, что время сейчас 2010-07-17 17:45:00
, и вы хотите отобразить следующее шоу на канале 1:
SELECT s.name, cs.start, cs.end
FROM channel_slots cs
JOIN shows s ON (s.show_id = cs.show_id)
WHERE cs.start > NOW()
ORDER BY cs.start
LIMIT 1;
Результат:
+--------------------------------+---------------------+---------------------+
| name | start | end |
+--------------------------------+---------------------+---------------------+
| Who wants to be a Millionaire? | 2010-07-17 18:00:00 | 2010-07-17 19:00:00 |
+--------------------------------+---------------------+---------------------+
1 row in set (0.00 sec)
Затем следующий запрос отображает оставшееся расписание дня для канала 1:
SELECT s.name, cs.start, cs.end
FROM channel_slots cs
JOIN shows s ON (s.show_id = cs.show_id)
WHERE cs.start > NOW() AND
cs.day = '2010-07-17'
ORDER BY cs.start;
Результат:
+--------------------------------+---------------------+---------------------+
| name | start | end |
+--------------------------------+---------------------+---------------------+
| Who wants to be a Millionaire? | 2010-07-17 18:00:00 | 2010-07-17 19:00:00 |
| Saturday Night Live | 2010-07-17 23:30:00 | 2010-07-18 01:00:00 |
+--------------------------------+---------------------+---------------------+
2 rows in set (0.00 sec)
И так далее.Я надеюсь, что это приведет вас в правильном направлении.Вы также должны изучить индексы базы данных , важную тему, не затронутую в моем ответе.