从我假设电视节目指南存储的那种数据来看,看起来您真的可以将所有内容存储在关系数据库中。我认为使用文件系统或 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 是 surrogate key,您甚至可以将其设为 generate a unique serial number automatically。 name 字段只是名称字段,description 字段具有text 数据类型,可以存储可变数量的文本。
channels 表应该非常简单。我们再次使用代理键作为channel_id。我不确定频道是否有一些可以用作natural key 的唯一标准代码,但使用代理键应该是安全的。
然后channel_slots 表将节目时段分配给每个频道的每一天。
我可能是错的,但我认为大多数电视节目指南并没有将一天严格定义为午夜开始和结束。有时这一天可能在第二天凌晨 2:00,而从凌晨 1.30 开始到凌晨 2:00 结束的节目将成为当天的一部分。如果是这种情况,这就是在此表中使用 day 字段的原因。在该字段中,我们可以根据“节目指南日”来定义该节目所属的日期。
slot_id 又是一个代理键,channel_id 和 show_id 字段是相关表的foreign keys。 start 和 end 字段仅定义了节目的准确开始和结束时间。如果您要在尚未定义演出时间的地方插入节目,您可能需要在这些字段中插入NULL。另一种选择是使用另一个字段作为标志来标记是否确认放映时间。
如果您打算使用 MySQL 作为您的 DBMS,请注意 InnoDB 存储引擎支持外键约束,而默认的 MyISAM 引擎不支持。但是,只有 MyISAM 引擎支持full text indexing。如果您打算允许您的用户在节目说明中搜索文本,这可能会很有用。
为了给你一个上述模式的例子,让我们在其中填充一些数据:
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)
等等。我希望这能让你朝着正确的方向前进。您还应该确保研究database indexes,这是我的答案未涵盖的重要主题。