从我假设电视节目指南存储的数据类型来看,它确实看起来好像可以将所有内容存储在关系数据库中。我认为使用filestsytem或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点,而一个从凌晨1点30分开始到凌晨2点结束的节目将成为当天的一部分。如果是这种情况,这就是在此表中使用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进行研究,这是我的答案中未涉及的一个重要主题。
为什么你想在xml文件中存储任何东西? 一个不错的视频,我今天发现有关此主题:http://vimeo.com/10506751 – antpaw 2010-07-18 22:01:56
因为xml的酷炫因素,可能 – mvds 2010-07-18 22:10:11